摘要

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

爬去对象---电影天堂

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

列表页:

详情页:
 

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

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

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

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

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

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

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

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

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

爬取代码

添加需要依赖的jar:

  1. <dependency>
  2. <groupId>org.jsoup</groupId>
  3. <artifactId>jsoup</artifactId>
  4. <version>1.7.2</version>
  5. </dependency>
  1. CommonMethod.java 该方法类是用于获取页面的元素以及将信息写入文件中
  1. package com.penglei.util;
  2.  
  3. import com.penglei.vo.MovieVo;
  4.  
  5. import java.io.*;
  6. import java.net.URL;
  7. import java.net.URLConnection;
  8. import java.util.Iterator;
  9. import java.util.List;
  10.  
  11. /**
  12. * 公用的方法
  13. * Created by penglei on 2017/2/13.
  14. */
  15. public class CommonMethod {
  16. /**
  17. * 获取页面元素
  18. * @param url
  19. * @return
  20. * @throws IOException
  21. */
  22. public static String getHtmlPage(String url) throws IOException {
  23. String line;
  24. URL oul = new URL(url);
  25. //建立连接
  26. URLConnection conn = oul.openConnection();
  27. //获得数据
  28. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "gbk"));
  29. StringBuilder htmlpage = new StringBuilder();
  30. while ((line = bufferedReader.readLine()) != null) {
  31. htmlpage.append(line);
  32. }
  33. //返回页面(String类型的页面数据)
  34. return htmlpage.toString();
  35. }
  36.  
  37. /**
  38. * 将List中的信息写入txt
  39. * @param file
  40. * @param urlList
  41. */
  42. public static void insertUrlToFile(String file, List<MovieVo> urlList) throws IOException {
  43. //下面是写文件
  44. boolean flag = false;
  45. FileWriter fw = null;
  46. BufferedWriter bw = null;
  47. try {
  48. fw = new FileWriter(file, true);
  49. bw = new BufferedWriter(fw, 100);
  50. Iterator<MovieVo> iter=urlList.iterator();
  51. while(iter.hasNext()) {
  52. bw.write(iter.next().getTitle()+"----["+iter.next().getDownloadUrl()+"]" + "\r\n");
  53. }
  54. flag = true;
  55. } catch (IOException e) {
  56. System.out.println("write error");
  57. flag = false;
  58. } finally {
  59. if (bw != null) {
  60. bw.flush();
  61. bw.close();
  62. }
  63. if (fw != null)
  64. fw.close();
  65. }
  66. }
  67. }

SpiderCommon.java 该方法将被重新

  1. package com.penglei.service;
  2.  
  3. import java.io.IOException;
  4.  
  5. /**
  6. * Created by penglei on 2017/2/13.
  7. */
  8. public class SpiderCommon {
  9.  
  10. public void search(String url) throws IOException {
  11. System.out.println("The method will be override!");
  12. }
  13. }

SpiderMovieList.java 获取列表页资源

  1. package com.penglei.service;
  2.  
  3. import com.penglei.util.CommonMethod;
  4. import org.jsoup.Jsoup;
  5. import org.jsoup.nodes.Document;
  6. import org.jsoup.nodes.Element;
  7. import org.jsoup.select.Elements;
  8.  
  9. import java.io.IOException;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12.  
  13. /**
  14. *抓取电影天堂列表页的数据
  15. * Created by penglei on 2017/2/13.
  16. */
  17. public class SpiderMovieList extends SpiderCommon {
  18.  
  19. private static List<String> uList =new ArrayList<String>();
  20.  
  21. @Override
  22. public void search(String url) throws IOException {
  23. //根据Url地址获取网页内容
  24. String htmlPage = CommonMethod.getHtmlPage(url);
  25. if (htmlPage != null){
  26. //对网页内容进行分析和提取
  27. Document docx = Jsoup.parse(htmlPage);
  28. //获取列表页对应的table元素
  29. Elements htmltables = docx.select("table.tbspan");
  30. //获取a标签链接元素
  31. Elements links = htmltables.select("a[href]");
  32. for (Element link : links) {
  33. String linkHref = link.attr("href");
  34. uList.add("http://www.ygdy8.net"+linkHref);
  35. }
  36. }
  37. }
  38.  
  39. public List<String> getUrlList() {
  40. return uList;
  41. }
  42.  
  43. /**
  44. * 得到列表页的url
  45. * @param n 一共有多少页
  46. * @param indexurl 页面的url
  47. * @throws IOException
  48. */
  49. public static List getAllMovieUrl(int n,String indexurl) throws IOException {
  50. Integer i=1;
  51. SpiderMovieList spiderMovieList = new SpiderMovieList();
  52. System.out.println("***********开始爬取列表页***********");
  53. for (i = 1; i <= n; i++) {
  54. String url = indexurl.replace("PAGE",i.toString());
  55. spiderMovieList.search(url);
  56. System.out.println("info"+"爬取第"+i+"页");
  57. }
  58. System.out.println("***********列表页爬取完成***********");
  59. List<String> resultList=spiderMovieList.getUrlList();
  60. return resultList;
  61. }
  62. }

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

  1. package com.penglei.service;
  2.  
  3. /**
  4. * Created by penglei on 2017/2/13.
  5. */
  6.  
  7. import com.penglei.util.CommonMethod;
  8. import com.penglei.vo.MovieVo;
  9. import org.jsoup.Jsoup;
  10. import org.jsoup.nodes.Document;
  11. import org.jsoup.nodes.Element;
  12. import org.jsoup.select.Elements;
  13.  
  14. import java.io.IOException;
  15.  
  16. /**
  17. * 抓取每个电影对应的列表页的数据,获取对应的电影名称和电影下载链接
  18. */
  19. public class SpiderMovieDetail extends SpiderCommon {
  20.  
  21. private MovieVo movieVo;
  22.  
  23. @Override
  24. public void search(String url) throws IOException {
  25. movieVo = new MovieVo();
  26. String htmlpage = CommonMethod.getHtmlPage(url);
  27. if (htmlpage != null){
  28. //对网页内容进行分析和提取
  29. Document doc = Jsoup.parse(htmlpage);
  30. //获取标题
  31. Element link = doc.select("div.title_all").last();
  32. if(link!=null){
  33. String title = link.text();
  34. //获取链接
  35. Elements elements = doc.select("div#Zoom");
  36. Element element = elements.select("a[href]").first();
  37. if(element!=null){
  38. String href = element.attr("href");
  39. movieVo.setDownloadUrl(href);
  40. }
  41. //将标题加入到MovieVo对象中
  42. movieVo.setTitle(title);
  43. }
  44.  
  45. }
  46. }
  47. public MovieVo getMovie() {
  48. return movieVo;
  49. }
  50. }

最后就是执行的main方法了

  1. package com.penglei;
  2.  
  3. import com.penglei.service.SpiderMovieDetail;
  4. import com.penglei.service.SpiderMovieList;
  5. import com.penglei.util.CommonMethod;
  6. import com.penglei.vo.MovieVo;
  7.  
  8. import java.io.IOException;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11.  
  12. /**
  13. * Created by penglei on 2017/2/13.
  14. */
  15. public class DemoRun {
  16. /**
  17. * PAGE是电影天堂的分页参数,所以通过循环更改PAGE来抓取某一页
  18. */
  19. //最新
  20. private static String INDEX_DYZZ="http://www.ygdy8.net/html/gndy/dyzz/list_23_PAGE.html";
  21.  
  22. public static void main(String[] args) throws IOException, InterruptedException {
  23. List<MovieVo> movieVos=new ArrayList<MovieVo>();
  24. SpiderMovieDetail detail=new SpiderMovieDetail();
  25. //获取列表页中所有电影的详情页访问链接
  26. List<String> list = SpiderMovieList.getAllMovieUrl(157, INDEX_DYZZ);
  27. System.out.println(list.size());
  28. for (int i = 0; i < list.size(); i++) {
  29. //获取详情页数据
  30. detail.search(list.get(i));
  31. movieVos.add(detail.getMovie());
  32. System.out.println("**********爬取详情页**********"+i+"完成");
  33. }
  34. System.out.println("**********开始执行插入**********");
  35. //将获取资源写入txt
  36. CommonMethod.insertUrlToFile("E:\\AMark\\StudyCode\\seed.txt",movieVos);
  37. System.out.println("**********插入完成**********");
  38. }
  39. }

代码结构如下:

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

访问最新资源共获取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. HDU 5621 KK's Point

    N个点中任意选取四个点,就能产生一个圆内的交点,所以圆内总共有C(N,4)个交点,圆上有N个,相加就可以了. 注意:组合数运算的时候会爆longlong,中间先除一下就可以了. #include &l ...

  2. STM8S awu及看门狗IWDG WWDG应用(转)

    源:STM8S awu及看门狗IWDG WWDG应用 AWU的应用(用库函数完成的) //切记要开启中断 且在中断函数中 AWU_GetFlagStatus(); 来清除中断 void AWU_SET ...

  3. mysqlslap 使用总结

    mysqlslap 可以用于模拟服务器的负载,并输出计时信息.其被包含在 MySQL 5.1 的发行包中.测试时,可以指定并发连接数,可以指定 SQL 语句.如果没有指定 SQL 语句,mysqlsl ...

  4. S3C2440串口及其中断系统详解

    个独立异步串行I/O(SIO)端口,每个都可以是基于中断或基于DMA模式的操作.换句话说,UART可以通过产生中断或DMA请求来进行CPU和UART之间的数据传输. 字节的FIFO给发送和接收. 字节 ...

  5. OI队内测试——石门一

    T1: 题目大意: 给你一个立方体,每个面上有些数字,给你一个数字K,你可以玩K轮游戏, 每轮你会将每个面上的数均分为4份,分给相邻的面,求K轮游戏后,上面的数字是 依次给你前.后.上.下.左.右的起 ...

  6. django的HTTPREQUEST对象

    Django使用request和response对象 当请求一张页面时,Django把请求的metadata数据包装成一个HttpRequest对象,然后Django加载合适的view方法,把这个Ht ...

  7. JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)

    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...

  8. Quartz2D 之 简单介绍

    1. 概述 Quartz2D 是一个二维绘图引擎. 主要功能: 绘制图形:线.矩形.圆.弧 绘制文字 绘制图片 绘制PDF 裁截图片 自定义UI控件 2. 图形上下文 Graphics Context ...

  9. 线程(thread)

    线程(thread): 现代操作系统引入进程概念,为了并发(行)任务 1.进程之间的这种切换代价很高 2.通信方式的代价也很大基本概念: 1.线程是比进程更小的资源单位,它是进程中的一个执行路线(分支 ...

  10. 对js原型对象的拓展和原型对象的重指向的区别的研究

    我写了如下两段代码: function Person(){} var p1 = new Person(); Person.prototype = { constructor: Person, name ...