摘要

网上有很多个人站来分享电影资源,其实有时候我们自己也想做这个一个电影站来分享资源。但是这个时候就有一个问题,电影的资源应该从哪里来呢?难道要自己一条条手动去从网络上获取,这样无疑是缓慢而又效率低下的。这个时候我们可以用自己掌握的知识去写一个小小爬虫程序,在网络上爬去电影资源。

爬去对象---电影天堂

首先打开电影天堂的链接,从下面的图片可以看出电影天堂的电影资源都是已列表页--详情页的方式展示得,这样是非常易于爬去的。那么我这次就以电影天堂导航栏中的最新资源为例。点开最新资源,是列表也展示的,每页25条资源。列表页的访问链接是:http://www.ygdy8.net/html/gndy/dyzz/list_23_PAGE.html (其中PAGE是分页参数)

列表页:

详情页:
 

其中PAGE是分页参数,通过更改分页参数可以达到获取每一页中对应电影的详情页访问链接。再获取完详情页的链接后,再次通过访问详情页的方法,获取对应电影的下载链接和电影名字。

那么梳理一下整个的爬去过程如下:

1.找到电影天堂最新资源的列表页访问链接

2.循环更改电影列表访问链接的分页参数.

3.分析列表页页面排版规则,获取电影详情页的URL

5.访问获取的每一个详情页的的URL.分析页面.获取电影名称和电影下载链接

6.将获取的信息存入到存储介质中.

通过以上6步即可完成电影的爬去!!!

废话不多说,直接上代码!!!

爬取代码

添加需要依赖的jar:

<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.2</version>
</dependency>
CommonMethod.java 该方法类是用于获取页面的元素以及将信息写入文件中
package com.penglei.util;

import com.penglei.vo.MovieVo;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.List; /**
* 公用的方法
* Created by penglei on 2017/2/13.
*/
public class CommonMethod {
/**
* 获取页面元素
* @param url
* @return
* @throws IOException
*/
public static String getHtmlPage(String url) throws IOException {
String line;
URL oul = new URL(url);
//建立连接
URLConnection conn = oul.openConnection();
//获得数据
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "gbk"));
StringBuilder htmlpage = new StringBuilder();
while ((line = bufferedReader.readLine()) != null) {
htmlpage.append(line);
}
//返回页面(String类型的页面数据)
return htmlpage.toString();
} /**
* 将List中的信息写入txt
* @param file
* @param urlList
*/
public static void insertUrlToFile(String file, List<MovieVo> urlList) throws IOException {
//下面是写文件
boolean flag = false;
FileWriter fw = null;
BufferedWriter bw = null;
try {
fw = new FileWriter(file, true);
bw = new BufferedWriter(fw, 100);
Iterator<MovieVo> iter=urlList.iterator();
while(iter.hasNext()) {
bw.write(iter.next().getTitle()+"----["+iter.next().getDownloadUrl()+"]" + "\r\n");
}
flag = true;
} catch (IOException e) {
System.out.println("write error");
flag = false;
} finally {
if (bw != null) {
bw.flush();
bw.close();
}
if (fw != null)
fw.close();
}
}
}

SpiderCommon.java 该方法将被重新

package com.penglei.service;

import java.io.IOException;

/**
* Created by penglei on 2017/2/13.
*/
public class SpiderCommon { public void search(String url) throws IOException {
System.out.println("The method will be override!");
}
}

SpiderMovieList.java 获取列表页资源

package com.penglei.service;

import com.penglei.util.CommonMethod;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; /**
*抓取电影天堂列表页的数据
* Created by penglei on 2017/2/13.
*/
public class SpiderMovieList extends SpiderCommon { private static List<String> uList =new ArrayList<String>(); @Override
public void search(String url) throws IOException {
//根据Url地址获取网页内容
String htmlPage = CommonMethod.getHtmlPage(url);
if (htmlPage != null){
//对网页内容进行分析和提取
Document docx = Jsoup.parse(htmlPage);
//获取列表页对应的table元素
Elements htmltables = docx.select("table.tbspan");
//获取a标签链接元素
Elements links = htmltables.select("a[href]");
for (Element link : links) {
String linkHref = link.attr("href");
uList.add("http://www.ygdy8.net"+linkHref);
}
}
} public List<String> getUrlList() {
return uList;
} /**
* 得到列表页的url
* @param n 一共有多少页
* @param indexurl 页面的url
* @throws IOException
*/
public static List getAllMovieUrl(int n,String indexurl) throws IOException {
Integer i=1;
SpiderMovieList spiderMovieList = new SpiderMovieList();
System.out.println("***********开始爬取列表页***********");
for (i = 1; i <= n; i++) {
String url = indexurl.replace("PAGE",i.toString());
spiderMovieList.search(url);
System.out.println("info"+"爬取第"+i+"页");
}
System.out.println("***********列表页爬取完成***********");
List<String> resultList=spiderMovieList.getUrlList();
return resultList;
}
}

SpiderMovieDetail.java 获取电影详情页资源

package com.penglei.service;

/**
* Created by penglei on 2017/2/13.
*/ import com.penglei.util.CommonMethod;
import com.penglei.vo.MovieVo;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements; import java.io.IOException; /**
* 抓取每个电影对应的列表页的数据,获取对应的电影名称和电影下载链接
*/
public class SpiderMovieDetail extends SpiderCommon { private MovieVo movieVo; @Override
public void search(String url) throws IOException {
movieVo = new MovieVo();
String htmlpage = CommonMethod.getHtmlPage(url);
if (htmlpage != null){
//对网页内容进行分析和提取
Document doc = Jsoup.parse(htmlpage);
//获取标题
Element link = doc.select("div.title_all").last();
if(link!=null){
String title = link.text();
//获取链接
Elements elements = doc.select("div#Zoom");
Element element = elements.select("a[href]").first();
if(element!=null){
String href = element.attr("href");
movieVo.setDownloadUrl(href);
}
//将标题加入到MovieVo对象中
movieVo.setTitle(title);
} }
}
public MovieVo getMovie() {
return movieVo;
}
}

最后就是执行的main方法了

package com.penglei;

import com.penglei.service.SpiderMovieDetail;
import com.penglei.service.SpiderMovieList;
import com.penglei.util.CommonMethod;
import com.penglei.vo.MovieVo; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; /**
* Created by penglei on 2017/2/13.
*/
public class DemoRun {
/**
* PAGE是电影天堂的分页参数,所以通过循环更改PAGE来抓取某一页
*/
//最新
private static String INDEX_DYZZ="http://www.ygdy8.net/html/gndy/dyzz/list_23_PAGE.html"; public static void main(String[] args) throws IOException, InterruptedException {
List<MovieVo> movieVos=new ArrayList<MovieVo>();
SpiderMovieDetail detail=new SpiderMovieDetail();
//获取列表页中所有电影的详情页访问链接
List<String> list = SpiderMovieList.getAllMovieUrl(157, INDEX_DYZZ);
System.out.println(list.size());
for (int i = 0; i < list.size(); i++) {
//获取详情页数据
detail.search(list.get(i));
movieVos.add(detail.getMovie());
System.out.println("**********爬取详情页**********"+i+"完成");
}
System.out.println("**********开始执行插入**********");
//将获取资源写入txt
CommonMethod.insertUrlToFile("E:\\AMark\\StudyCode\\seed.txt",movieVos);
System.out.println("**********插入完成**********");
}
}

代码结构如下:

通过以上代码即可爬去到对应的电影资源!

访问最新资源共获取3923条电影资源。

对应代码资源地址是:https://github.com/whitescholars/spider.git


结语

如果你还需要了解更多技术文章信息,请继续关注白衣秀才的博客
个人网站:http://penglei.top/
Github:https://github.com/whitescholars
微博:http://weibo.com/u/3034107691?refer_flag=1001030102_&is_all=1

java批量爬去电影资源的更多相关文章

  1. java批量爬取电影资源

    摘要 网上有很多个人站来分享电影资源,其实有时候我们自己也想做这个一个电影站来分享资源.但是这个时候就有一个问题,电影的资源应该从哪里来呢?难道要自己一条条手动去从网络上获取,这样无疑是缓慢而又效率低 ...

  2. python爬去电影天堂恐怖片+游戏

    1.爬去方式python+selenium 2.工作流程 selenium自动输入,自动爬取,建立文件夹,存入磁力链接到记事本 3.贴上代码 #!/usr/bin/Python# -*- coding ...

  3. Python多线程爬虫爬取电影天堂资源

    最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. ...

  4. Java爬虫爬取网站电影下载链接

    之前有看过一段时间爬虫,了解了爬虫的原理,以及一些实现的方法,本项目完成于半年前,一直放在那里,现在和大家分享出来. 网络爬虫简单的原理就是把程序想象成为一个小虫子,一旦进去了一个大门,这个小虫子就像 ...

  5. Java基础-爬虫实战之爬去校花网网站内容

    Java基础-爬虫实战之爬去校花网网站内容 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 爬虫这个实现点我压根就没有把它当做重点,也没打算做网络爬虫工程师,说起爬虫我更喜欢用Pyt ...

  6. 使用htmlparse爬虫技术爬取电影网页的全部下载链接

    昨天,我们利用webcollector爬虫技术爬取了网易云音乐17万多首歌曲,而且还包括付费的在内,如果时间允许的话,可以获取更多的音乐下来,当然,也有小伙伴留言说这样会降低国人的知识产权保护意识,诚 ...

  7. 爬虫新手学习2-爬虫进阶(urllib和urllib2 的区别、url转码、爬虫GET提交实例、批量爬取贴吧数据、fidder软件安装、有道翻译POST实例、豆瓣ajax数据获取)

    1.urllib和urllib2区别实例 urllib和urllib2都是接受URL请求相关模块,但是提供了不同的功能,两个最显著的不同如下: urllib可以接受URL,不能创建设置headers的 ...

  8. Python爬取电影天堂指定电视剧或者电影

    1.分析搜索请求 一位高人曾经说过,想爬取数据,要先分析网站 今天我们爬取电影天堂,有好看的美剧我在上面都能找到,算是很全了. 这个网站的广告出奇的多,用过都知道,点一下搜索就会弹出个窗口,伴随着滑稽 ...

  9. 使用htmlparser爬虫技术爬取电影网页的全部下载链接

    昨天,我们利用webcollector爬虫技术爬取了网易云音乐17万多首歌曲,而且还包括付费的在内,如果时间允许的话,可以获取更多的音乐下来,当然,也有小伙伴留言说这样会降低国人的知识产权保护意识,诚 ...

随机推荐

  1. JS中Exception处理

    程序开发中,编程人员经常要面对的是如何编写代码来响应错误事件的发生,即例外处理(exception handlers).如果例外处理代码设计得周全,那么最终呈现给用户的就将是一个友好的界面.否则,就会 ...

  2. 位图文件(BMP)格式以及Linux下C程序实现(转)

    源:位图文件(BMP)格式以及Linux下C程序实现 说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图 ...

  3. python遍历字典元素

    a={'a':{'b':{'c':{'d':'e'}},'f':'g'},'h':'i'} def show(myMap): for str in myMap.keys(): secondDict=m ...

  4. ue4中窗口打开web地址

    首先打开项目,设置,widgets,启用webbroswer 新建一个蓝图, 在控件栏里就可以找到添加webbroswer 设置initial url就可以打开网页了, 项目中还用到获取界面参数,与界 ...

  5. 如何让搜索引擎抓取AJAX内容? 转

    越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用 Ajax 技术,根据用户的输入,加载不同的内容. 这种做法的 ...

  6. MongoDB和Java-PHP

    一.java操作mongoDB 配置环境: 1.下mongodb JDBC驱动mongo-java-driver-3.2.2.jar,并包含在classpath中 步骤: 1.连接数据库 // 连接到 ...

  7. CentOS下成功修复了Windows的grub引导

    (转载) 以CentOS7和Windows为双系统,且后安装CentOS时,会出现开机没有Windows引导的问题.下图,倒数第二行可以看到Windows引导项: 修复运行终端(terminal),键 ...

  8. Round Numbers(poj 3252)

    题意:算出区间内二进制中0的个数大于等于1的个数的数字有多少个 /* 本来以为用数位DP搞,但是组合数更简单. 我们设n的二进制长度为len. ①:先考虑长度小于len的数字. 这里以数字22为例,二 ...

  9. UVa 103 - Stacking Boxes

    题目大意:矩阵嵌套,不过维数是多维的.有两个个k维的盒子A(a1, a1...ak), B(b1, b2...bk),若能找到(a1...ak)的一个排列使得ai < bi,则盒子A可嵌套在盒子 ...

  10. C++指针与const

    在C++中,const修饰符一般用于修饰常量.常量在定义的时候必须初始化,而且值一旦定义之后就不能修改,这样就能保证常量的值在程序运行过程中不会发生变换. 1.指向const对象的指针 指向const ...