java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址
1. 目标
使用webmagic爬取动作电影列表信息
爬取电影《海王》详细信息【电影名称、电影迅雷下载地址列表】
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
抓取列表信息
使用git拉取代码:https://gitee.com/likun_557/java-pachong 这个代码是在第一讲中创建的,需要了解的朋友可以查看第一讲的内容"《java爬虫系列第一讲-爬虫入门》"
将代码导入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类,用于保存分页电影信息
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; }
-
创建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; }
-
创建列表数据采集器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; } }
-
测试用例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); } }
运行 com.ady01.demo2.filmlist.filmlistpageprocessortest#collect() 方法,结果如下:
3. 爬取电影《海王》迅雷地址
我们以《海王》页面(http://m.ady01.com/rs/film/detail/46612)为例,来采集详情页的信息
需要采集的信息有:电影名称、描述信息、电影下载地址列表
-
创建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; }
-
创建详情页采集器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; } }
-
创建测试用例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)); } }
运行测试用例com.ady01.demo2.filmdetail.filmdetailpageprocessortest#collect()
4. 总结
- webmagic中支持xpath、$选择器的方式获取页面中的元素信息,使用非常方便,如果你们对jquery比较熟悉,可以直接使用类似于jquery选择器的语法来解析整个页面的内容;还有xpath的语法,后期会有专门讲解xpath的语法,敬请关注。
- 有问题的可以留言。
- 下期咱们一起来抓取极客时间上面的课程信息
- 爱电影这个网站就是用webmagic做的,内部包含自动采集功能,每天自动采集大量大于资源,爬虫系列完结之后,将把整个网站的源码风险给大家,资源会在公众号中发布,可以提前关注一下公众号【路人甲java】