1. 目标

  1. 使用webmagic爬取动作电影列表信息

  2. 爬取电影《海王》详细信息【电影名称电影迅雷下载地址列表

2. 爬取最新动作片列表

获取电影列表页面数据来源地址

访问http://m.ady01.com/rs/film/list/1/1,F12开发者模式中找到页面数据来源地址

地址是:http://m.ady01.com/rs/film/listJson/1/1

访问:http://m.ady01.com/rs/film/listJson/1/1

抓取列表信息

  1. 使用git拉取代码:https://gitee.com/likun_557/java-pachong 这个代码是在第一讲中创建的,需要了解的朋友可以查看第一讲的内容"《java爬虫系列第一讲-爬虫入门》"

  2. 将代码导入idea中

  1. 新建包com.ady01.demo2.filmlist,本次示例代码全部放在该包中

  2. 列表页面数据来源http://m.ady01.com/rs/film/listJson/1/1,是一个json数据

  3. 根据http://m.ady01.com/rs/film/listJson/1/1中的数据格式,我们先分析一下

    • 最外层是一个分页的类
    • dataList是一个集合,内部每项是一个电影资源的信息
  4. 创建com.ady01.demo2.filmlist.PageModel类,用于保存分页电影信息

    package com.ady01.demo2.filmlist;
    
    import lombok.*;
    
    import java.io.Serializable;
    import java.util.List; /**
    * <b>description</b>:分页对象 <br>
    * <b>time</b>:2019-04-21 13:46 <br>
    * <b>author</b>: 微信公众号:路人甲Java,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!
    */
    @Getter
    @Setter
    @NoArgsConstructor
    @ToString
    public class PageModel implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
    * 每页显示数量
    */
    private long pageSize;
    /**
    * 当前页行的开始行的索引,如1,2,3....
    */
    private long startIndex;
    /**
    * 当前页行的结束索引
    */
    private long endIndex;
    /**
    * 当前页
    */
    private long currentPage; /**
    * 上一页索引
    */
    private long prePage; /**
    * 下一页索引
    */
    private long nextPage; /**
    * 总记录数
    */
    private long count; /**
    * 是否有上一页
    */
    private boolean hasPrePage; /**
    * 是否有下一页
    */
    private boolean hasNextPage; /**
    * 总页数
    */
    private long pageCount; /**
    * 数据集合
    */
    private List<FilmModel> dataList;
    }
  5. 创建com.ady01.demo2.filmlist.FilmModel类,用于保存电影信息

    package com.ady01.demo2.filmlist;
    
    import lombok.Getter;
    import lombok.NoArgsConstructor;
    import lombok.Setter;
    import lombok.ToString; import java.io.Serializable;
    import java.util.Map; /**
    * <b>description</b>:电影信息 <br>
    * <b>time</b>:2019/4/21 12:35 <br>
    * <b>author</b>:微信公众号:路人甲Java,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!
    */
    @Setter
    @Getter
    @NoArgsConstructor
    @ToString
    public class FilmModel implements Serializable{
    private static final long serialVersionUID = 1L;
    /**
    * 编号
    */
    private java.lang.Long id;
    /**
    * 片名,完整名称,不包含无关文字
    */
    private java.lang.String name;
    /**
    * 片名全拼音(小写),如英雄:yingxiong
    */
    private java.lang.String full_spell;
    /**
    * 片名简拼(小写),如英雄:yx
    */
    private java.lang.String short_spell;
    /**
    * 标题,可能和片名不同,里面有可能包含推广相关文字
    */
    private java.lang.String title;
    /**
    * 关键词,多个之间用逗号隔开
    */
    private java.lang.String keywords;
    /**
    * 描述
    */
    private java.lang.String description;
    /**
    * 1:电影,2:自定义专辑系列
    */
    private java.lang.Integer type;
    /**
    * 来源站点
    */
    private java.lang.Long site_id;
    /**
    * 来源页面
    */
    private java.lang.String source_url;
    /**
    * 简介,关联t_content_id
    */
    private java.lang.Long content_id;
    /**
    * 评分
    */
    private java.lang.String score;
    /**
    * 来源页面中资源唯一标志,用于去重使用
    */
    private java.lang.String source_uid;
    /**
    * 创建时间
    */
    private java.lang.Long create_time;
    /**
    * 发布时间
    */
    private java.lang.Long pub_time;
    /**
    * 最后更新时间
    */
    private java.lang.Long update_time;
    /**
    * 状态信息
    */
    private java.lang.Integer status;
    /**
    * 版本号
    */
    private java.lang.Long version;
    /**
    * 扩展数据
    */
    private Map<Object, Object> extData;
    }
  6. 创建列表数据采集器com.ady01.demo2.filmlist.FilmListPageProcessor

    package com.ady01.demo2.filmlist;
    
    import com.ady01.demo2.filmdetail.FilmDetailModel;
    import com.ady01.demo2.filmdetail.FilmDetailPageProcessor;
    import com.alibaba.fastjson.JSON;
    import lombok.extern.slf4j.Slf4j;
    import us.codecraft.webmagic.Page;
    import us.codecraft.webmagic.Request;
    import us.codecraft.webmagic.Site;
    import us.codecraft.webmagic.Spider;
    import us.codecraft.webmagic.processor.PageProcessor; /**
    * <b>description</b>:电影列表页面数据采集器 <br>
    * <b>time</b>:2019/4/21 12:40 <br>
    * <b>author</b>:微信公众号:路人甲Java,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!
    */
    @Slf4j
    public class FilmListPageProcessor implements PageProcessor { public static PageModel collector(String url) {
    return new FilmListPageProcessor(url).collect().getPageModel();
    } private Site site = Site.me().setRetryTimes(3).setSleepTime(100).setTimeOut(10000);
    //需要采集的页面
    private String url; //采集的数据
    private PageModel pageModel; public FilmListPageProcessor(String url) {
    this.url = url;
    } public FilmListPageProcessor collect() {
    Request request = new Request(url);
    Spider.create(this).thread(1).addRequest(request).run();
    return this;
    } @Override
    public void process(Page page) {
    String text = page.getRawText();
    log.info("列表页面数据:{}", text);
    this.pageModel = JSON.parseObject(text, PageModel.class);
    } @Override
    public Site getSite() {
    return this.site;
    } public PageModel getPageModel() {
    return pageModel;
    } public void setPageModel(PageModel pageModel) {
    this.pageModel = pageModel;
    }
    }
  7. 测试用例com.ady01.demo2.filmlist.FilmListPageProcessorTest

    package com.ady01.demo2.filmlist;
    
    import lombok.extern.slf4j.Slf4j;
    import org.junit.Test; /**
    * <b>description</b>: <br>
    * <b>time</b>:2019/4/21 13:59 <br>
    * <b>author</b>:微信微信公众号:路人甲Java,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据)
    */
    @Slf4j
    public class FilmListPageProcessorTest { @Test
    public void collect() {
    String url = "http://m.ady01.com/rs/film/listJson/1/1";
    PageModel collector = FilmListPageProcessor.collector(url);
    log.info("\n\n\n列表页面数:{}", collector);
    }
    }
  8. 运行 com.ady01.demo2.filmlist.FilmListPageProcessorTest#collect() 方法,结果如下:

3. 爬取电影《海王》迅雷地址

我们以《海王》页面(http://m.ady01.com/rs/film/detail/46612)为例,来采集详情页的信息

需要采集的信息有:电影名称、描述信息、电影下载地址列表

  1. 创建com.ady01.demo2.filmdetail.FilmDetailModel类,用于封装电影详细信息

    package com.ady01.demo2.filmdetail;
    
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString; import java.io.Serializable;
    import java.util.List; /**
    * <b>description</b>:电影详细信息 <br>
    * <b>time</b>:2019/4/21 13:18 <br>
    * <b>author</b>:微信公众号:路人甲Java,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!
    */
    @Setter
    @Getter
    @ToString
    public class FilmDetailModel implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
    * 编号
    */
    private java.lang.Long id;
    /**
    * 片名,完整名称,不包含无关文字
    */
    private java.lang.String title; /**
    * 下载地址列表
    */
    private List<String> downList;
    }
  2. 创建详情页采集器com.ady01.demo2.filmdetail.FilmDetailPageProcessor

    package com.ady01.demo2.filmdetail;
    
    import lombok.extern.slf4j.Slf4j;
    import us.codecraft.webmagic.Page;
    import us.codecraft.webmagic.Request;
    import us.codecraft.webmagic.Site;
    import us.codecraft.webmagic.Spider;
    import us.codecraft.webmagic.processor.PageProcessor;
    import us.codecraft.webmagic.selector.Selectable; import java.util.List;
    import java.util.Objects;
    import java.util.stream.Collectors; /**
    * <b>description</b>:电影详情页采集器,采集电影详细信息 <br>
    * <b>time</b>:2019/4/21 12:40 <br>
    * <b>author</b>:微信公众号:路人甲Java,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!
    */
    @Slf4j
    public class FilmDetailPageProcessor implements PageProcessor {
    public static FilmDetailModel collector(long film_id) {
    return new FilmDetailPageProcessor(film_id).collect().getFilmDetailModel();
    } private Site site = Site.me().setRetryTimes(3).setSleepTime(100).setTimeOut(10000);
    //电影资源id
    private long film_id; //采集的数据
    private FilmDetailModel filmDetailModel; public FilmDetailPageProcessor(long film_id) {
    this.film_id = film_id;
    } public FilmDetailPageProcessor collect() {
    Request request = new Request(String.format("http://m.ady01.com/rs/film/detail/%s", this.film_id));
    Spider.create(this).thread(1).addRequest(request).run();
    return this;
    } @Override
    public void process(Page page) {
    String text = page.getRawText();
    log.info("列表页面数据:{}", text);
    this.filmDetailModel = new FilmDetailModel();
    //电影标题
    String title = page.getHtml().$("span[class='film_title']","text").get();
    this.filmDetailModel.setId(this.film_id);
    this.filmDetailModel.setTitle(title);
    //电影下载地址downList
    List<Selectable> downNodes = page.getHtml().$("div.film_downurl_txt").nodes();
    if (Objects.nonNull(downNodes)) {
    List<String> downList = downNodes.stream().map(item -> item.$("div", "text").get()).collect(Collectors.toList());
    this.filmDetailModel.setDownList(downList);
    }
    } @Override
    public Site getSite() {
    return this.site;
    } public FilmDetailModel getFilmDetailModel() {
    return filmDetailModel;
    } public void setFilmDetailModel(FilmDetailModel filmDetailModel) {
    this.filmDetailModel = filmDetailModel;
    }
    }
  3. 创建测试用例com.ady01.demo2.filmdetail.FilmDetailPageProcessorTest

    package com.ady01.demo2.filmdetail;
    
    import com.ady01.demo2.filmlist.FilmListPageProcessor;
    import com.ady01.demo2.filmlist.PageModel;
    import com.ady01.util.FrameUtil;
    import lombok.extern.slf4j.Slf4j;
    import org.junit.Test; @Slf4j
    public class FilmDetailPageProcessorTest {
    @Test
    public void collect() {
    long film_id = 46612L;
    FilmDetailModel filmDetailModel = FilmDetailPageProcessor.collector(46612L);
    log.info("\n\n\n电影《海王》详情:{}", FrameUtil.json(filmDetailModel, true));
    } }
  4. 运行测试用例com.ady01.demo2.filmdetail.FilmDetailPageProcessorTest#collect()

4. 总结

  1. webmagic中支持xpath、$选择器的方式获取页面中的元素信息,使用非常方便,如果你们对jquery比较熟悉,可以直接使用类似于jquery选择器的语法来解析整个页面的内容;还有xpath的语法,后期会有专门讲解xpath的语法,敬请关注。
  2. 有问题的可以留言。
  3. 下期咱们一起来抓取极客时间上面的课程信息
  4. 爱电影这个网站就是用webmagic做的,内部包含自动采集功能,每天自动采集大量大于资源,爬虫系列完结之后,将把整个网站的源码风险给大家,资源会在公众号中发布,可以提前关注一下公众号【路人甲Java】

可以关注公众号:路人甲Java,获取年薪50万课程,获取最新文章。

java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址的更多相关文章

  1. java爬虫系列第一讲-爬虫入门

    1. 概述 java爬虫系列包含哪些内容? java爬虫框架webmgic入门 使用webmgic爬取 http://ady01.com 中的电影资源(动作电影列表页.电影下载地址等信息) 使用web ...

  2. Java爬虫_资源网站爬取实战

    对 http://bestcbooks.com/  这个网站的书籍进行爬取 (爬取资源分享在结尾) 下面是通过一个URL获得其对应网页源码的方法 传入一个 url  返回其源码 (获得源码后,对源码进 ...

  3. Python爬虫系列 - 初探:爬取旅游评论

    Python爬虫目前是基于requests包,下面是该包的文档,查一些资料还是比较方便. http://docs.python-requests.org/en/master/ POST发送内容格式 爬 ...

  4. Java爬虫——B站弹幕爬取

    如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号,cid=14295428 弹幕存放位置为  h ...

  5. java爬虫入门--用jsoup爬取汽车之家的新闻

    概述 使用jsoup来进行网页数据爬取.jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuer ...

  6. 小伙子自从学会用Python爬取岛国“动作”电影,身体一天不如一天

    在互联网的世界里,正确的使用VPN看看外面的世界,多了解了解世界的发展.肉身翻墙后,感受一下外面的肮脏世界.墙内的朋友叫苦不迭,由于某些原因,VPN能用的越来越少.上周我的好朋友狗子和我哭诉说自己常用 ...

  7. Java爬虫框架WebMagic入门——爬取列表类网站文章

    初学爬虫,WebMagic作为一个Java开发的爬虫框架很容易上手,下面就通过一个简单的小例子来看一下. WebMagic框架简介 WebMagic框架包含四个组件,PageProcessor.Sch ...

  8. Python爬虫系列 - 初探:爬取新闻推送

    Get发送内容格式 Get方式主要需要发送headers.url.cookies.params等部分的内容. t = requests.get(url, headers = header, param ...

  9. java爬虫系列目录

    1. java爬虫系列第一讲-爬虫入门(爬取动作片列表) 2. java爬虫系列第二讲-爬取最新动作电影<海王>迅雷下载地址 3. java爬虫系列第三讲-获取页面中绝对路径的各种方法 4 ...

随机推荐

  1. springboot2.x里面访问静态资源的坑

    在spring boot的自定义配置类继承 WebMvcConfigurationSupport 后,发现自动配置的静态资源路径( classpath:/META/resources/,classpa ...

  2. 使用Entity Framework Core访问数据库(Oracle篇)

    前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架  终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...

  3. Python和Python解释器

    目录 Python介绍(了解) Python解释器发展史(了解) Python解释器(了解) CPython IPython PyPy Jython IronPython 安装Python解释器(掌握 ...

  4. 【ODI】| 数据ETL:从零开始使用Oracle ODI完成数据集成(三)

    资料库的创建.体系结构的创建.模型反向工程都已经完成了,下面就是创建以及执行接口来完成工作了. 浏览前两节请点击: [ODI]| 数据ETL:从零开始使用Oracle ODI完成数据集成(一) [OD ...

  5. 『Zap Möbius反演』

    Zap Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a ,y<=b,并且gcd(x,y)=d.作为F ...

  6. RabbitMq在CentOs7下的完整安装步骤,带你踩坑

    1.前言 因为公司项目中用的RabbitMq来做消息处理,自己以前没有接触过,所以想自学一下.然额,光安装就花了6.7个小时才搞定,中间还换过一个版本,综合国内外博客才最终将所有安装中遇到的问题解决掉 ...

  7. .netcoreapp 发布到 linux 的问题,vs靠不住

    .netcore 2.0 发布后,小版本更新速度惊人 截止目前:2.1.200 最新一个新项目,vs发布到linux@debian9一直报错,反复发布n次依然失败.把本地2.1.100更新到最新2.1 ...

  8. js初级入门

    javascript的数据类型 (symbol)一.原始数据类型 或 基本数据类型 6种 1,undefined (1,申明未赋值,2,函数没有返回值)2,null (空,不存在)3,number ( ...

  9. 在linux中访问macos 下的分区。

    花钱的解决方案是找专业的:   Paragon Software  他们家有各种套件,让你在window Linux 都能访问到苹果分区里面的内容. 但是Windows删除了它的驱动之后一开机就蓝屏. ...

  10. MonacoEditor 主动触发代码提示功能

    MonacoEditor是微软提供的代码编辑器 vscode即是使用它作为编辑器. 它的开发语言是ts,可以嵌入到浏览器中. 代码提示或者说代码补全功能是我们经常需要定制的部分. 目前它提供的快捷键是 ...