XXL-CRAWLER 是一个面向对象的分布式爬虫框架。一行代码开发一个分布式爬虫,拥有"多线程、异步、IP动态代理、分布式"等特性;css
源码仓库地址 | Release Download |
---|---|
https://github.com/xuxueli/xxl-crawler | Download |
https://gitee.com/xuxueli0323/xxl-crawler | Download |
(爬虫示例代码位于 /test 目录下)html
<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-crawler</artifactId> <version>1.2.0</version> </dependency>
在此推荐一款工具 "Chrome插件:Jquery Selector Helper",能够直观迅速的获取页面元素的Jquery cssQuery表达式。
// PageSelect 注解:从页面中抽取出一个或多个VO对象; @PageSelect(cssQuery = "body") public static class PageVo { @PageFieldSelect(cssQuery = ".blog-heading .title") private String title; @PageFieldSelect(cssQuery = "#read") private int read; @PageFieldSelect(cssQuery = ".comment-content") private List<String> comment; // set get }
XxlCrawler crawler = new XxlCrawler.Builder() .setUrls("https://my.oschina.net/xuxueli/blog") .setWhiteUrlRegexs("https://my\\.oschina\\.net/xuxueli/blog/\\d+") .setThreadCount(3) .setPageParser(new PageParser<PageVo>() { @Override public void parse(Document html, Element pageVoElement, PageVo pageVo) { // 解析封装 PageVo 对象 String pageUrl = html.baseUri(); System.out.println(pageUrl + ":" + pageVo.toString()); } }) .build();
crawler.start(true);
XXL-CRAWLER 是一个灵活高效、面向对象的Web爬虫框架。;java
借助 XXL-CRAWLER,一行代码开发一个分布式爬虫。jquery
概念 | 说明 |
---|---|
XxlCrawler | 爬虫对象,维护爬虫信息 |
PageVo | 页面数据对象,一张Web页面可抽取一个或多个PageVo |
PageParser | 页面解析器,绑定泛型PageVO后将会自动抽取页面数据对象,同时支持运行时调整请求参数信息 |
功能:爬虫对象,维护爬虫信息,可选属性以下。git
方法 | 说明 |
---|---|
setUrls | 待爬的URL列表 |
setAllowSpread | 容许扩散爬取,将会以现有URL为起点扩散爬取整站 |
setWhiteUrlRegexs | URL白名单正则,非空时进行URL白名单过滤页面 |
setIfPost | 请求方式:true=POST请求、false=GET请求 |
setUserAgent | UserAgent |
setParamMap | 请求参数 |
setCookieMap | 请求Cookie |
setTimeoutMillis | 超时时间,毫秒 |
setPauseMillis | 停顿时间,爬虫线程处理完页面以后进行主动停顿,避免过于频繁被拦截; |
setProxyMaker | 代理生成器,支持设置代理IP,同时支持调整代理池实现动态代理; |
setThreadCount | 爬虫并发线程数 |
setPageParser | 页面解析器 |
setRunData | 设置运行时数据模型,默认提供LocalRunData单机模型,支持扩展实现分布式模型; |
start | 运行爬虫,可经过入参控制同步或异步方式运行 |
stop | 终止爬虫 |
功能:描述页面数据对象,经过该注解从页面抽取PageVo数据信息,可选属性以下。github
PageSelect | 说明 |
---|---|
cssQuery | CSS选择器, 如 "#body" |
功能:描述页面数据对象的属性信息,经过该注解从页面抽取PageVo的属性信息,可选属性以下。
(支持基础数据类型 T ,包括 List<T>)多线程
PageFieldSelect | 说明 |
---|---|
cssQuery | CSS选择器, 如 "#title" |
selectType | jquery 数据抽取方式,如 ".html()/.text()/.val()/.attr()"等 |
selectVal | jquery 数据抽取参数,SelectType=ATTR 时有效,如 ".attr("abs:src")" |
datePattern | 时间格式化,日期类型数据有效 |
以线程池方式并行运行,提供对应API(可参考"章节3.3")调整线程池大小,提升运行效率;架构
支持同步、异步两种方式启动运行。并发
ProxyMaker(代理生成器):实现代理支持的组件。支持设置代理IP,同时支持调整代理池实现动态代理;app
系统已经提供了两种策略实现;
PageParser(页面解析器):绑定泛型PageVO后将会自动抽取页面数据对象,同时支持运行时调整请求参数信息;
内部方法 | 说明 |
---|---|
public void preLoad(PageLoadInfo pageLoadInfo) | 可选实现,发起页面请求以前触发调用,可基于此运行时调整请求参数; |
public void postLoad(Document html) | 可选实现,发起页面请求以后触发调用,可基于此运行时调整页面数据; |
public abstract void parse(Document html, Element pageVoElement, T pageVo) | 必须实现,页面抽离封装每一个PageVO以后触发调用,可基于此处理PageVO文档或数据; |
支持自定义RunData(运行时数据模型)并结合Redis或DB共享运行数据来实现分布式爬虫。默认提供LocalRunData实现单机版爬虫。
RunData:运行时数据模型,维护爬虫运行时的URL和白名单规则。
RunData抽象方法 | 说明 |
---|---|
public abstract boolean addUrl(String link); | 新增一个待采集的URL,接口须要作URL去重,爬虫线程将会获取到并进行处理; |
public abstract String getUrl(); | 获取一个待采集的URL,而且将它从"待采集URL池"中移除,而且添加到"已采集URL池"中; |
public abstract int getUrlNum(); | 获取待采集URL数量; |
欢迎参与项目贡献!好比提交PR修复一个bug,或者新建 Issue 讨论新特性或者变动。
更多接入的公司,欢迎在 登记地址 登记,登记仅仅为了产品推广。
产品开源免费,而且将持续提供免费的社区技术支持。我的或企业内部可自由的接入和使用。
不管金额多少都足够表达您这份心意,很是感谢 :) 前往捐赠