美文网首页Java 杂谈
java爬虫:用Java爬取最新动作电影《海王》迅雷下载地址,连

java爬虫:用Java爬取最新动作电影《海王》迅雷下载地址,连

作者: Web前端学习营 | 来源:发表于2019-04-24 15:11 被阅读0次

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

    地址是: m.ady01.com/rs/film/lis…

    访问: m.ady01.com/rs/film/lis…

    抓取列表信息

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

    哦对了,在分享这篇文字前,我先说一下,我这里有一份Java学习资料,直接加我的Java直播学习群:1004944760就能免费领取,长期真实有效。

    将代码导入idea中

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

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

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

    最外层是一个分页的类

    dataList是一个集合,内部每项是一个电影资源的信息

    创建 com.ady01.demo2.filmlist.PageModel 类,用于保存分页电影信息

    packagecom.ady01.demo2.filmlist;importlombok.*;importjava.io.Serializable;importjava.util.List;/**

    * <b>description</b>:分页对象 <br>

    * <b>time</b>:2019-04-21 13:46 <br>

    * <b>author</b>: 微信公众号:路人甲Java,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!

    */@Getter@Setter@NoArgsConstructor@ToStringpublicclassPageModelimplementsSerializable {privatestaticfinallongserialVersionUID =1L;/**

        * 每页显示数量

        */privatelongpageSize;/**

        * 当前页行的开始行的索引,如1,2,3....

        */privatelongstartIndex;/**

        * 当前页行的结束索引

        */privatelongendIndex;/**

        * 当前页

        */privatelongcurrentPage;/**

        * 上一页索引

        */privatelongprePage;/**

        * 下一页索引

        */privatelongnextPage;/**

        * 总记录数

        */privatelongcount;/**

        * 是否有上一页

        */privatebooleanhasPrePage;/**

        * 是否有下一页

        */privatebooleanhasNextPage;/**

        * 总页数

        */privatelongpageCount;/**

        * 数据集合

        */privateList dataList;}复制代码

    创建 com.ady01.demo2.filmlist.FilmModel 类,用于保存电影信息

    packagecom.ady01.demo2.filmlist;importlombok.Getter;importlombok.NoArgsConstructor;importlombok.Setter;importlombok.ToString;importjava.io.Serializable;importjava.util.Map;/**

    * <b>description</b>:电影信息 <br>

    * <b>time</b>:2019/4/21 12:35 <br>

    * <b>author</b>:微信公众号:路人甲Java,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!

    */@Setter@Getter@NoArgsConstructor@ToStringpublicclassFilmModelimplementsSerializable{privatestaticfinallongserialVersionUID =1L;/**

        * 编号

        */privatejava.lang.Longid;/**

        * 片名,完整名称,不包含无关文字

        */privatejava.lang.String name;/**

        * 片名全拼音(小写),如英雄:yingxiong

        */privatejava.lang.String full_spell;/**

        * 片名简拼(小写),如英雄:yx

        */privatejava.lang.String short_spell;/**

        * 标题,可能和片名不同,里面有可能包含推广相关文字

        */privatejava.lang.String title;/**

        * 关键词,多个之间用逗号隔开

        */privatejava.lang.String keywords;/**

        * 描述

        */privatejava.lang.Stringdescription;/**

        * 1:电影,2:自定义专辑系列

        */privatejava.lang.Integer type;/**

        * 来源站点

        */privatejava.lang.Longsite_id;/**

        * 来源页面

        */privatejava.lang.String source_url;/**

        * 简介,关联t_content_id

        */privatejava.lang.Longcontent_id;/**

        * 评分

        */privatejava.lang.String score;/**

        * 来源页面中资源唯一标志,用于去重使用

        */privatejava.lang.String source_uid;/**

        * 创建时间

        */privatejava.lang.Longcreate_time;/**

        * 发布时间

        */privatejava.lang.Longpub_time;/**

        * 最后更新时间

        */privatejava.lang.Longupdate_time;/**

        * 状态信息

        */privatejava.lang.Integer status;/**

        * 版本号

        */privatejava.lang.Longversion;/**

        * 扩展数据

        */privateMap extData;}复制代码

    创建列表数据采集器 com.ady01.demo2.filmlist.FilmListPageProcessor

    packagecom.ady01.demo2.filmlist;importcom.ady01.demo2.filmdetail.FilmDetailModel;importcom.ady01.demo2.filmdetail.FilmDetailPageProcessor;importcom.alibaba.fastjson.JSON;importlombok.extern.slf4j.Slf4j;importus.codecraft.webmagic.Page;importus.codecraft.webmagic.Request;importus.codecraft.webmagic.Site;importus.codecraft.webmagic.Spider;importus.codecraft.webmagic.processor.PageProcessor;/**

    * <b>description</b>:电影列表页面数据采集器 <br>

    * <b>time</b>:2019/4/21 12:40 <br>

    * <b>author</b>:微信公众号:路人甲Java,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!

    */@Slf4jpublicclassFilmListPageProcessorimplementsPageProcessor{publicstaticPageModelcollector(String url){returnnewFilmListPageProcessor(url).collect().getPageModel();    }privateSite site = Site.me().setRetryTimes(3).setSleepTime(100).setTimeOut(10000);//需要采集的页面privateString url;//采集的数据privatePageModel pageModel;publicFilmListPageProcessor(String url){this.url = url;    }publicFilmListPageProcessorcollect(){        Request request =newRequest(url);        Spider.create(this).thread(1).addRequest(request).run();returnthis;    }@Overridepublicvoidprocess(Page page){        String text = page.getRawText();        log.info("列表页面数据:{}", text);this.pageModel = JSON.parseObject(text, PageModel.class);    }@OverridepublicSitegetSite(){returnthis.site;    }publicPageModelgetPageModel(){returnpageModel;    }publicvoidsetPageModel(PageModel pageModel){this.pageModel = pageModel;    }}复制代码

    测试用例com.ady01.demo2.filmlist.FilmListPageProcessorTest

    packagecom.ady01.demo2.filmlist;importlombok.extern.slf4j.Slf4j;importorg.junit.Test;/**

    * <b>description</b>: <br>

    * <b>time</b>:2019/4/21 13:59 <br>

    * <b>author</b>:微信微信公众号:路人甲Java,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据)

    */@Slf4jpublicclassFilmListPageProcessorTest{@Testpublicvoidcollect(){        String url ="http://m.ady01.com/rs/film/listJson/1/1";        PageModel collector = FilmListPageProcessor.collector(url);        log.info("\n\n\n列表页面数:{}", collector);    }}复制代码

    运行 com.ady01.demo2.filmlist.FilmListPageProcessorTest#collect() 方法,结果如下:

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

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

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

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

    package com.ady01.demo2.filmdetail;importlombok.Getter;importlombok.Setter;importlombok.ToString;importjava.io.Serializable;importjava.util.List;/**

    * <b>description</b>:电影详细信息 <br>

    * <b>time</b>:2019/4/21 13:18 <br>

    * <b>author</b>:微信公众号:路人甲Java,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!

    */@Setter@Getter@ToStringpublicclassFilmDetailModelimplementsSerializable{privatestaticfinallong serialVersionUID = 1L;/**

        * 编号

        */privatejava.lang.Longid;/**

        * 片名,完整名称,不包含无关文字

        */privatejava.lang.Stringtitle;/**

        * 下载地址列表

        */privateList downList;}复制代码

    创建详情页采集器 com.ady01.demo2.filmdetail.FilmDetailPageProcessor

    packagecom.ady01.demo2.filmdetail;importlombok.extern.slf4j.Slf4j;importus.codecraft.webmagic.Page;importus.codecraft.webmagic.Request;importus.codecraft.webmagic.Site;importus.codecraft.webmagic.Spider;importus.codecraft.webmagic.processor.PageProcessor;importus.codecraft.webmagic.selector.Selectable;importjava.util.List;importjava.util.Objects;importjava.util.stream.Collectors;/**

    * <b>description</b>:电影详情页采集器,采集电影详细信息 <br>

    * <b>time</b>:2019/4/21 12:40 <br>

    * <b>author</b>:微信公众号:路人甲Java,专注于java技术分享(爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!

    */@Slf4jpublicclassFilmDetailPageProcessorimplementsPageProcessor{publicstaticFilmDetailModelcollector(longfilm_id){returnnewFilmDetailPageProcessor(film_id).collect().getFilmDetailModel();    }privateSite site = Site.me().setRetryTimes(3).setSleepTime(100).setTimeOut(10000);//电影资源idprivatelongfilm_id;//采集的数据privateFilmDetailModel filmDetailModel;publicFilmDetailPageProcessor(longfilm_id){this.film_id = film_id;    }publicFilmDetailPageProcessorcollect(){        Request request =newRequest(String.format("http://m.ady01.com/rs/film/detail/%s",this.film_id));        Spider.create(this).thread(1).addRequest(request).run();returnthis;    }@Overridepublicvoidprocess(Page page){        String text = page.getRawText();        log.info("列表页面数据:{}", text);this.filmDetailModel =newFilmDetailModel();//电影标题String title = page.getHtml().$("span[class='film_title']","text").get();this.filmDetailModel.setId(this.film_id);this.filmDetailModel.setTitle(title);//电影下载地址downListList downNodes = page.getHtml().$("div.film_downurl_txt").nodes();if(Objects.nonNull(downNodes)) {            List downList = downNodes.stream().map(item -> item.$("div","text").get()).collect(Collectors.toList());this.filmDetailModel.setDownList(downList);        }    }@OverridepublicSitegetSite(){returnthis.site;    }publicFilmDetailModelgetFilmDetailModel(){returnfilmDetailModel;    }publicvoidsetFilmDetailModel(FilmDetailModel filmDetailModel){this.filmDetailModel = filmDetailModel;    }}复制代码

    创建测试用例 com.ady01.demo2.filmdetail.FilmDetailPageProcessorTest

    packagecom.ady01.demo2.filmdetail;importcom.ady01.demo2.filmlist.FilmListPageProcessor;importcom.ady01.demo2.filmlist.PageModel;importcom.ady01.util.FrameUtil;importlombok.extern.slf4j.Slf4j;importorg.junit.Test;@Slf4jpublicclassFilmDetailPageProcessorTest{@Testpublicvoidcollect(){longfilm_id =46612L;        FilmDetailModel filmDetailModel = FilmDetailPageProcessor.collector(46612L);        log.info("\n\n\n电影《海王》详情:{}", FrameUtil.json(filmDetailModel,true));    }}复制代码

    运行测试用例 com.ady01.demo2.filmdetail.FilmDetailPageProcessorTest#collect()

    相关文章

      网友评论

        本文标题:java爬虫:用Java爬取最新动作电影《海王》迅雷下载地址,连

        本文链接:https://www.haomeiwen.com/subject/pheggqtx.html