XXL-CRAWLER 是一个分布式爬虫框架。一行代码开发一个分布式爬虫,拥有”多线程、异步、IP动态代理、分布式、JS渲染”等特性;
| 源码仓库地址 | Release Download |
|---|---|
| https://github.com/xuxueli/xxl-crawler | Download |
| https://gitee.com/xuxueli0323/xxl-crawler | Download |
(爬虫示例代码位于 /test 目录下)
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-crawler</artifactId>
<version>${最新稳定版}</version>
</dependency>
在此推荐两款工具,可以直观迅速的获取页面元素的Jquery cssQuery表达式。
- 1、Chrome DevTools:首先定位元素位置,然后从Element选中选中元素,点击右键选择“Copy + Copy selector”即可;
- 2、Jquery Selector Helper(Chrome插件):首先定位元素位置,然后从Element右侧打开Selector界面,然后定位元素即可;
// 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爬虫框架。采用模块化设计,各个模块可灵活进行自定义和扩展。
借助 XXL-CRAWLER,一行代码开发一个分布式爬虫。
| 概念 | 说明 |
|---|---|
| XxlCrawler | 爬虫对象,维护爬虫信息 |
| PageVo | 页面数据对象,一张Web页面可抽取一个或多个PageVo |
| PageLoader | Wed页面加载器,负责加载页面数据,支持灵活的自定义和扩展 |
| PageParser | Wed页面解析器,绑定泛型PageVO后将会自动抽取页面数据对象,同时支持运行时调整请求参数信息; |
NonPageParser : 非Web页面解析器,如JSON接口等,直接输出响应数据
功能:爬虫对象,维护爬虫信息,可选属性如下。
| 方法 | 说明 |
|---|---|
| setUrls | 待爬的URL列表 |
| setAllowSpread | 允许扩散爬取,将会以现有URL为起点扩散爬取整站 |
| setWhiteUrlRegexs | URL白名单正则,非空时进行URL白名单过滤页面 |
| setIfPost | 请求方式:true=POST请求、false=GET请求 |
| setUserAgent | UserAgent |
| setParamMap | 请求参数 |
| setCookieMap | 请求Cookie |
| setTimeoutMillis | 超时时间,毫秒 |
| setPauseMillis | 停顿时间,爬虫线程处理完页面之后进行主动停顿,避免过于频繁被拦截; |
| setProxyMaker | 代理生成器,支持设置代理IP,同时支持调整代理池实现动态代理; |
| setThreadCount | 爬虫并发线程数 |
| setPageParser | 页面解析器 |
| setPageLoader | 页面加载器,默认提供 “JsoupPageParser” 和 “HtmlUnitPageLoader” 两种实现; |
| setRunData | 设置运行时数据模型,默认提供LocalRunData单机模型,支持扩展实现分布式模型; |
| start | 运行爬虫,可通过入参控制同步或异步方式运行 |
| stop | 终止爬虫 |
功能:描述页面数据对象,通过该注解从页面抽取PageVo数据信息,可选属性如下。
| PageSelect | 说明 |
|---|---|
| cssQuery | CSS选择器, 如 “#body” |
功能:描述页面数据对象的属性信息,通过该注解从页面抽取PageVo的属性信息,可选属性如下。
(支持基础数据类型 T ,包括 List)
| PageFieldSelect | 说明 |
|---|---|
| cssQuery | CSS选择器, 如 “#title” |
| selectType | jquery 数据抽取方式,如 “.html()/.text()/.val()/.attr()”等 |
| selectVal | jquery 数据抽取参数,SelectType=ATTR 时有效,如 “.attr(“abs:src”)” |
| datePattern | 时间格式化,日期类型数据有效 |
以线程池方式并行运行,提供对应API(可参考”章节3.3”)调整线程池大小,提高运行效率;
支持同步、异步两种方式启动运行。
ProxyMaker(代理生成器):实现代理支持的组件。支持设置代理IP,同时支持调整代理池实现动态代理;
系统已经提供了两种策略实现;
PageParser(页面解析器):绑定泛型PageVO后将会自动抽取页面数据对象,同时支持运行时调整请求参数信息;
| 内部方法 | 说明 |
|---|---|
| public void preParse(PageRequest pageRequest) | 可选实现,发起页面请求之前触发调用,可基于此运行时调整请求参数; |
| public abstract void parse(Document html, Element pageVoElement, T pageVo) | 必须实现,页面抽离封装每个PageVO之后触发调用,可基于此处理PageVO文档或数据; |
支持自定义RunData(运行时数据模型)并结合Redis或DB共享运行数据来实现分布式爬虫。默认提供LocalRunData实现单机版爬虫。
| RunData抽象方法 | 说明 |
|---|---|
| public abstract boolean addUrl(String link); | 新增一个待采集的URL,接口需要做URL去重,爬虫线程将会获取到并进行处理; |
| public abstract String getUrl(); | 获取一个待采集的URL,并且将它从”待采集URL池”中移除,并且添加到”已采集URL池”中; |
| public abstract int getUrlNum(); | 获取待采集URL数量; |
页面数据通过 “PageLoader” 组件加载,默认使用以下两种实现:
得益于模块化结构设计,可自由扩展其他 “PageLoader” 实现,如 “selenisum + chrome/headless” 方式等;
注意:

