内容简介:访问http://m.ady01.com/rs/film/list/1/1,F12开发者模式中找到页面数据来源地址地址是:访问:
访问http://m.ady01.com/rs/film/list/1/1,F12开发者模式中找到页面数据来源地址
抓取列表信息
-
使用git拉取代码: gitee.com/likun_557/j… 这个代码是在第一讲中创建的,需要了解的朋友可以查看第一讲的内容"《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. 爬取电影《海王》迅雷地址
我们以《海王》页面( m.ady01.com/rs/film/det… )为例,来采集详情页的信息
需要采集的信息有: 电影名称、描述信息、电影下载地址列表
-
创建 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()
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- CVPR 2020 论文大盘点:动作检测与动作分割篇
- CVPR 2020 论文大盘点:动作检测与动作分割篇
- Android列表,刷卡动作
- 如何从静态图像中识别“比心”动作
- 58 部落帖子推荐系统的抬手动作
- include指令和include动作的区别
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。