java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

栏目: Java · 发布时间: 5年前

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

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

java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

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

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

java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

抓取列表信息

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

  2. 将代码导入idea中

    java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址
  3. 新建包 com.ady01.demo2.filmlist ,本次示例代码全部放在该包中

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

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

    • 最外层是一个分页的类
    • dataList是一个集合,内部每项是一个电影资源的信息
  6. 创建 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;
    }
    复制代码
  7. 创建 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;
    }
    复制代码
  8. 创建列表数据采集器 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;
        }
    }
    复制代码
  9. 测试用例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);
        }
    }
    复制代码
  10. 运行 com.ady01.demo2.filmlist.FilmListPageProcessorTest#collect() 方法,结果如下:

    java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

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

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

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

java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址
  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()

    java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Two Scoops of Django

Two Scoops of Django

Daniel Greenfeld、Audrey M. Roy / CreateSpace Independent Publishing Platform / 2013-4-16 / USD 29.95

Two Scoops of Django: Best Practices For Django 1.5 is chock-full of material that will help you with your Django projects. We'll introduce you to various tips, tricks, patterns, code snippets, and......一起来看看 《Two Scoops of Django》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具