当前位置: 移动技术网 > IT编程>开发语言>Java > java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

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

2019年04月22日  | 移动技术网IT编程  | 我要评论

降龙大师,国外成人聊天室,岛方淳子

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中 在这里插入图片描述

  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() 方法,结果如下:
    在这里插入图片描述

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】

在这里插入图片描述

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网