码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-10-27 21:55:52      阅读:774      评论:0      收藏:0      [点我收藏+]

标签:

具体详细信息参见 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来进行去重,占用内存较小,但是可能漏抓页面

 

 

 

 

 

 

     

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

标签:

原文地址:http://www.cnblogs.com/heanqing/p/4915548.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!