摘要

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

爬去对象---电影天堂

首先打开电影天堂的链接,从下面的图片可以看出电影天堂的电影资源都是已列表页--详情页的方式展示得,这样是非常易于爬去的。那么我这次就以电影天堂导航栏中的最新资源为例。点开最新资源,是列表也展示的,每页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. spring中依赖注入与aop讲解

    一.依赖注入 这个属于IOC依赖注入,也叫控制反转,IOC是说类的实例由容器产生,而不是我们用new的方式创建实例,控制端发生了改变所以叫控制反转. 1 2 3 4 5 6 7 8 9 10 11 1 ...

  2. java XML转JSON格式

    标签: XML转Json json 2014-05-20 20:55 6568人阅读 评论(6) 收藏 举报  分类: [J2SE基础](20)  代码如下所示,从这个例子中发现了代码库的重要性,如果 ...

  3. Android中使用http协议访问网络

    HTTP协议的工作原理:客户端向服务器端发送http请求,服务器端收到请求后返回一下数据给客户端,客户端接受消息并进行解析. 在Android中发送http请求的方式有两种,第一种是通过HttpURL ...

  4. N皇后问题——递归求解

    比较简单,废话不说,上代码: public class NQueen { //比如:position[1]=3,表示第一行的第三列有一个皇后 private int [] position; //总的 ...

  5. FFT算法的完整DSP实现(转)

    源:FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's ...

  6. [转] 如何让CloudStack使用KVM创建Windows实例成功识别并挂载数据盘

    在使用kvm给windows虚拟机动态挂载virtio类型的硬盘时候遇到问题,通过下面的文章知道需要安装virtio驱动,从而解决问题使挂在正常,在此处mark一下 问题产生背景: 使用CloudSt ...

  7. leetcode-005 reorder list

    1 package leetcode; public class ReOrderList { public void reorderList(ListNode head) { if(head==nul ...

  8. VB.NET中网络编程所需组件WinHTTP的添加

    VB.NET中网络编程所需组件: WinHTTP组件:项目-->添加引用-->COM选项卡-->Microsoft WinHTTP Services,version 5.1--> ...

  9. css 之!important

    主要是自己犯了个错误: 把 !important 放到了分号后面; 正确写法写法: .current{ background-color: #f1f1f1; border-left: 2px soli ...

  10. 【腾讯优测干货分享】微信小程序之自动化亲密接触

    本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/HcPakz5CV1SHnu-U8n85pw 导语 山雨欲来风满楼,最 ...