摘要

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

爬去对象---电影天堂

首先打开电影天堂的链接,从下面的图片可以看出电影天堂的电影资源都是已列表页--详情页的方式展示得,这样是非常易于爬去的。那么我这次就以电影天堂导航栏中的最新资源为例。点开最新资源,是列表也展示的,每页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. 使用htmlparse爬虫技术爬取电影网页的全部下载链接

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

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

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

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

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

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

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

  6. python利用requests和threading模块,实现多线程爬取电影天堂最新电影信息。

    利用爬到的数据,基于Django搭建的一个最新电影信息网站: n1celll.xyz  (用的花生壳动态域名解析,服务器在自己的电脑上,纯属自娱自乐哈.) 今天想利用所学知识来爬取电影天堂所有最新电影 ...

  7. from appium import webdriver 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)

    使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium) - 北平吴彦祖 - 博客园 https://www.cnblogs.com/stevenshushu/p ...

  8. scrapy框架用CrawlSpider类爬取电影天堂.

    本文使用CrawlSpider方法爬取电影天堂网站内国内电影分类下的所有电影的名称和下载地址 CrawlSpider其实就是Spider的一个子类. CrawlSpider功能更加强大(链接提取器,规 ...

  9. 14.python案例:爬取电影天堂中所有电视剧信息

    1.python案例:爬取电影天堂中所有电视剧信息 #!/usr/bin/env python3 # -*- coding: UTF-8 -*- '''======================== ...

随机推荐

  1. SQL Server中事务transaction如果没写在try catch中,就算中间语句报错还是会提交

    假如我们数据库中有两张表Person和Book Person表: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ) NULL, [CreateTi ...

  2. systemd-analyze – 在Linux中查找系统启动性能统计信息

    您是否在使用 systemd 系统和服务管理器,并且您的 Linux 系统需要较长时间才能启动,或者您希望查看系统启动性能的报告? 如果是的话,你已经登陆了正确的地方. 在本文中,我们将向您展示如何使 ...

  3. C# System.IO.Path

    Path的常用方法 函数列表 对一个路径做相应操作,包括文件路径,目录路径,通常会用到Path这个类, 本文列举一些常用的操作. 获取指定路径字符串的目录信息 public static string ...

  4. javascript模块导入导出

    第一次知道javascript有模块的概念通常都是使用<script>标签进行引入,不过只能在html文件上使用 增加的模块就如同php里的include.require可以使用引入的内容 ...

  5. Ubuntu集群 配置ntp服务

    1.概述 NTP(Network Time Protocol)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN ...

  6. SAP跟踪前台操作导致的后台查询语句

    SAP跟踪前台操作导致的后台查询语句,通过这个可以查看前台对应了后台的数据库表,然后可以通过se11查看表内容,也可以删除表内容. 在sap升级的时候,首先需要拷贝正式的sap系统,然后将拷贝的系统中 ...

  7. 1、JUC--volatile 关键字-内存可见性

    Java JUC简介 在 Java 5.0 提供了 java.util.concurrent (简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线 ...

  8. requests sslerror

    比较烦人的情况: 使用pip安装任何包和requests库请求https站都会提示SSL错误,试了网上很多方法,还是没解决,最后升级pip和requests库解决,特做记录. 升级pip curl h ...

  9. WorldWind源码剖析系列:配置载入器类ConfigurationLoader

    配置载入器类ConfigurationLoader主要从指定的路径中加载保存星球相关参数的xml文件,从中读取数据来构造星球对象及其所关联的可渲染子对象列表并返回.该类的类图如下所示. 该类所包含的主 ...

  10. PAT B1033 旧键盘打字 (20 分)

    旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及坏掉的那些键,打出的结果文字会是怎样? 输入格式: 输入在 2 行中分别给出坏掉的那些键.以及应该输入 ...