SeimiCrawler V2.0,支持SpringBoot的爬虫框架
本次升级,是Seimicrawler比较重大的一次更新,完美的支持了SpringBoot,引入Java8语法特性,优化分布式队列实现,支持BloomFilter,同时采用Antlr4重构JsoupXpath来提供更为完善的语法支持。下面将介绍下新版本的推荐使用方法。
依赖
<dependency>
<groupId>cn.wanghaomiao</groupId>
<artifactId>SeimiCrawler</artifactId>
<version>参考github最新版本</version>
</dependency>
使用
创建一个标准的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
对象的几个必填参数,
url
要抓取的地址crawlerName
规则namecallBack
回调函数
另外,还可以通过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>