• 【JAVA】Java爬虫框架 WebMagic的使用【未完】


    具体详细信息参见 http://webmagic.io/

    PageProcessor的实现:

      实现PageProcessor接口即可。

      在里面可以定制自己的爬虫规则

    Webmagic的页面抓取过程也就是PageProcessor分为三个部分:

      1.设置抓取器的参数:如重复次数,重复事件等等

      2.设置抓取规则:也就是给你一个Html页面你要抓取其中的哪些信息

      3.从当前的页面找没有访问过的连接,加入到抓取队列,等待抓取

    public class GithubRepoPageProcessor implements PageProcessor {
    
        // 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等
        private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);
    
        @Override
        // process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑
        public void process(Page page) {
            // 部分二:定义如何抽取页面信息,并保存下来
            page.putField("author", page.getUrl().regex("https://github\.com/(\w+)/.*").toString());
            page.putField("name", page.getHtml().xpath("//h1[@class='entry-title public']/strong/a/text()").toString());
            if (page.getResultItems().get("name") == null) {
                //skip this page
                page.setSkip(true);
            }
            page.putField("readme", page.getHtml().xpath("//div[@id='readme']/tidyText()"));
    
            // 部分三:从页面发现后续的url地址来抓取
            page.addTargetRequests(page.getHtml().links().regex("(https://github\.com/\w+/\w+)").all());
        }
    
        @Override
        public Site getSite() {
            return site;
        }
    
        public static void main(String[] args) {
    
            Spider.create(new GithubRepoPageProcessor())
                    //从"https://github.com/code4craft"开始抓
                    .addUrl("https://github.com/code4craft")
                    //开启5个线程抓取
                    .thread(5)
                    //启动爬虫
                    .run();
        }
    }

    Selectable接口是什么:

      实现Selectable接口就可以完成页面元素的链式抽取

      page.getHtml()返回的是Html对象,这个Html类实现了Selectable接口,就可以继续抽取

      也就是可以直接在page.getHtml().xxx().xxx() 这样链式的抽取元素

      

    获取结果:

      如果抽取完毕得到自己想要的东西的话,就可以用get方法或者toString方法来获取结果

      get()返回字符串  

      toString()返回字符串

      all()返回所有抽取结果

      match()返回boolean值,代表是否有匹配结果

    保存结果:

      上面的过程已经可以得到想要的结果了,现在就需要对这些结果做处理

      选择,是输出出来呢,还是保存到数据库,还是保存到文件中。

      就用到了Pipeline这个组件

      这个组件就是负责指定结果的去向

      比如从控制台输出结果,就是用ConsolePipeline来保存的

      如果想要把他存放在某个目录,按照以下的代码做就行,非常方便

      

    public static void main(String[] args) {
        Spider.create(new GithubRepoPageProcessor())
                //从"https://github.com/code4craft"开始抓
                .addUrl("https://github.com/code4craft")
                .addPipeline(new JsonFilePipeline("D:\webmagic\"))
                //开启5个线程抓取
                .thread(5)
                //启动爬虫
                .run();
    }

    爬虫的配置:

      Spider是一个类,这个类是爬虫启动的入口

      需要给他的create方法传入一个策略 也就是PageProcessor的实现

      然后配置

      然后.run()运行

      

    网站的配置:

      对于站点本身有一些配置信息

      比如有的站点需要登录,就要设定cookie

      所以用Site对象类配置一个站点所需的各种属性。

    爬虫的监控:

      查看爬虫的执行状况

      看有多少页面,已经得到了多少页面

      通过JMX实现

      可以使用Jconsole等工具来查看

      可以很方便的添加一个监控

    SpiderMonitor.instance().register(oschinaSpider);
            SpiderMonitor.instance().register(githubSpider);

    WebMagic的组件:

      四个,PageProcessor,Schedule,Downloader,Pipline 

      分别都可以定制

    定制Pipline:

      实现Pipline接口即可

      已经提供了几个默认的Pipline

      

    ConsolePipeline 输出结果到控制台 抽取结果需要实现toString方法
    FilePipeline 保存结果到文件 抽取结果需要实现toString方法
    JsonFilePipeline JSON格式保存结果到文件  
    ConsolePageModelPipeline (注解模式)输出结果到控制台  
    FilePageModelPipeline (注解模式)保存结果到文件  
    JsonFilePageModelPipeline (注解模式)JSON格式保存结果到文件 想要持久化的字段需要有getter方法

    定制Scheduler

      Scheduler是对于URL进行管理的组件

      可以对URL队列去重

      现有的Scheduler

      

    DuplicateRemovedScheduler 抽象基类,提供一些模板方法 继承它可以实现自己的功能
    QueueScheduler 使用内存队列保存待抓取URL  
    PriorityScheduler 使用带有优先级的内存队列保存待抓取URL 耗费内存较QueueScheduler更大,但是当设置了request.priority之后,只能使用PriorityScheduler才可使优先级生效
    FileCacheQueueScheduler 使用文件保存抓取URL,可以在关闭程序并下次启动时,从之前抓取到的URL继续抓取 需指定路径,会建立.urls.txt和.cursor.txt两个文件
    RedisScheduler 使用Redis保存抓取队列,可进行多台机器同时合作抓取 需要安装并启动redis

      可以单独定义去重的策略

        

    HashSetDuplicateRemover 使用HashSet来进行去重,占用内存较大
    BloomFilterDuplicateRemover 使用BloomFilter来进行去重,占用内存较小,但是可能漏抓页面
         
  • 相关阅读:
    线段树区间异或--差分时间复杂度优化
    数独
    sql语句-根据动态参数去拼sql
    Python-读取文件的大小
    Docker-教你如何通过 Docker 快速搭建各种测试环境
    Docker-本地镜像发布到阿里云
    Docker- Mysql数据库主从同步配置方法
    mysql-如何删除主从同步
    Docker数据卷的介绍和使用
    Docker镜像-拉取并且运行
  • 原文地址:https://www.cnblogs.com/heanqing/p/4915548.html
Copyright © 2020-2023  润新知