摘要

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

爬去对象---电影天堂

首先打开电影天堂的链接,从下面的图片可以看出电影天堂的电影资源都是已列表页--详情页的方式展示得,这样是非常易于爬去的。那么我这次就以电影天堂导航栏中的最新资源为例。点开最新资源,是列表也展示的,每页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. 总结获取原生JS(javascript)的父节点、子节点、兄弟节点

    关于原生JS获取节点,一直是个头疼的问题,而且调用方法的名字又贼长了,所以我选择用JQ,好像跑题了-- 话不多说看代码 获取父节点 及 父节点下所有子节点(兄弟节点) <ul> <l ...

  2. windows环境下 nginx+iis 反向代理解决跨域问题

    项目基本完成,是时候花点时间整理一下最近的姿势了 1 什么是跨域? 网上对于跨域的概念会有大篇幅的文章去解释,似乎有点玄乎,初学者很容易对这个概念产生恐惧,跨域其实很简单,其实只要知道一点,无法跨域访 ...

  3. 转:winform 打包自动安装数据库

    vs2005 打包,并自动安装SQL数据库.创建部署项目    1.   在“文件”菜单上指向“添加项目”,然后选择“新建项目”.    2.   在“添加新项目”对话框中,选择“项目类型”窗格中的“ ...

  4. [IDEA_2] IDEA 问题合集

    1. IDEA 通过 Maven 导入的依赖包下面存在红色波浪线 问题描述: 创建的 Maven Project 在添加相关依赖后自动下载,自动添加的依赖包的下面存在红色波浪线,在使用过程中存在问题, ...

  5. 【转】Java学习---算法那些事

    [更多参考] LeetCode算法 每日一题 1: Two Sum ----> 更多参考[今日头条--松鼠游学] 史上最全的五大算法总结 Java学习---7大经典的排序算法总结实现 程序员都应 ...

  6. 何为用户体验?附《用户体验的要素》PDF版下载

    一.什么是用户体验? 用户体验(User Experience,简称UE/UX)是用户在使用产品过程中建立起来的一种纯主观感受.但是对于一个界定明确的用户群体来讲,其用户体验的共性是能够经由良好设计实 ...

  7. HTML常用标签大全

  8. python第三十二课——栈

    栈:满足特点 --> 先进后出,类似于我们生活中的子弹夹 [注意] 对于栈结构而言:python中没有为其封装特定的函数,我们可以使用list(列表)来模拟栈的特点 使用list对象来模拟栈结构 ...

  9. 面向对象的JavaScript --- 动态类型语言

    面向对象的JavaScript --- 动态类型语言 动态类型语言与面向接口编程 JavaScript 没有提供传统面向对象语言中的类式继承,而是通过原型委托的方式来实现对象与对象之间的继承. Jav ...

  10. 将替代ListView的RecyclerView 的使用(一)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/by317966834/article/details/36205923 RecyclerView 是 ...