SeimiCrawler V2.0,支持SpringBoot的爬虫框架

08 Aug 2018

本次升级,是Seimicrawler比较重大的一次更新,完美的支持了SpringBoot,引入Java8语法特性,优化分布式队列实现,支持BloomFilter,同时采用Antlr4重构JsoupXpath来提供更为完善的语法支持。下面将介绍下新版本的推荐使用方法。

依赖

<dependency>
    <groupId>cn.wanghaomiao</groupId>
    <artifactId>SeimiCrawler</artifactId>
    <version>参考github最新版本</version>
</dependency>

Github版本列表 Maven版本列表

使用

创建一个标准的SpringBoot工程,在包crawlers下添加爬虫规则,例如:

@Crawler(name = "basic")
public class Basic extends BaseSeimiCrawler {
    @Override
    public String[] startUrls() {
        //两个是测试去重的
        return new String[]{"http://www.cnblogs.com/","http://www.cnblogs.com/"};
    }

    @Override
    public void start(Response response) {
        JXDocument doc = response.document();
        try {
            List<Object> urls = doc.sel("//a[@class='titlelnk']/@href");
            logger.info("{}", urls.size());
            for (Object s:urls){
                push(Request.build(s.toString(),Basic::getTitle));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void getTitle(Response response){
        JXDocument doc = response.document();
        try {
            logger.info("url:{} {}", response.getUrl(), doc.sel("//h1[@class='postTitle']/a/text()|//a[@id='cb_post_title_url']/text()"));
            //do something
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

application.properties中配置

seimi.crawler.enabled=true
# 指定要发起start请求的crawler的name
seimi.crawler.names=basic,test

#seimi.crawler.seimi-agent-host=xx
#seimi.crawler.seimi-agent-port=xx

#开启分布式队列
#seimi.crawler.enable-redisson-queue=true
#自定义bloomFilter预期插入次数,不设置用默认值 ()
#seimi.crawler.bloom-filter-expected-insertions=
#自定义bloomFilter预期的错误率,0.001为1000个允许有一个判断错误的。不设置用默认值(0.001)
#seimi.crawler.bloom-filter-false-probability=

标准的springBoot启动

@SpringBootApplication
public class SeimiCrawlerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SeimiCrawlerApplication.class, args);
    }
}

更复杂的用法可以参考下面更为详细的文档或是参考Github中的demo

SpringMvc配合使用

有些场景下,需要通过管理界面添加抓取请求,这时候就需要和SpringMVC配合使用了,Seimicrawler提供了一个静态方法,可以在Controller中实时的添加抓取请求 CrawlerCache.consumeRequest(request);,如:

    @RequestMapping(value = "send_req")
    public String sendRequest(Request request){
        CrawlerCache.consumeRequest(request);
        return "consume suc";
    }

这里要注意Request对象的几个必填参数,

另外,还可以通过CrawlerCache.getCrawlerModel(crawlerName);获取到对应的 CrawlerModel,并进行相关信息的查询。

分布式模式启用

Crawler的注解设置为@Crawler(name = "xx",queue = DefaultRedisQueue.class)

application.properties中配置

#启动SeimiCrawler
seimi.crawler.enabled=true
seimi.crawler.names=DefRedis,test
#开启分布式队列
seimi.crawler.enable-redisson-queue=true
#自定义bloomFilter预期插入次数,不设置用默认值 ()
#seimi.crawler.bloom-filter-expected-insertions=
#自定义bloomFilter预期的错误率,0.001为1000个允许有一个判断错误的。不设置用默认值(0.001)
#seimi.crawler.bloom-filter-false-probability=

在seimi-app.xml中配置redisson,从2.0版本开始默认的分布式队列改用redisson实现,所以需要在spring的配置文件中注入redissonClient具体实现。接下来就可以正常的使用分布式队列了。

<redisson:client
        id="redisson"
        name="test_redisson"
>
    <!--
    这里的name属性和qualifier子元素不能同时使用。
    id和name的属性都可以被用来作为qualifier的备选值。
    -->
    <!--<qualifier value="redisson3"/>-->
    <redisson:single-server
            idle-connection-timeout="10000"
            ping-timeout="1000"
            connect-timeout="10000"
            timeout="3000"
            retry-attempts="3"
            retry-interval="1500"
            reconnection-timeout="3000"
            failed-attempts="3"
            subscriptions-per-connection="5"
            client-name="none"
            address="redis://127.0.0.1:6379"
            subscription-connection-minimum-idle-size="1"
            subscription-connection-pool-size="50"
            connection-minimum-idle-size="10"
            connection-pool-size="64"
            database="0"
            dns-monitoring="false"
            dns-monitoring-interval="5000"
    />
</redisson:client>

项目地址

SeimiCrawler

Wiki文档

官方文档