三、总体设计

架构图

输入图片说明

3.1 功能定位

XXL-CRAWLER 是一个分布式Web爬虫框架。采用模块化设计,各个模块可灵活进行自定义和扩展。

借助 XXL-CRAWLER,一行代码开发一个分布式爬虫。

3.2 核心概念

概念 说明
XxlCrawler 爬虫对象,维护爬虫信息
PageVo 页面数据对象,一张Web页面可抽取一个或多个PageVo
PageLoader Wed页面加载器,负责加载页面数据,支持灵活的自定义和扩展
PageParser Wed页面解析器,绑定泛型PageVO后将会自动抽取页面数据对象,同时支持运行时调整请求参数信息;

NonPageParser : 非Web页面解析器,如JSON接口等,直接输出响应数据

3.3 爬虫对象:XxlCrawler

功能:爬虫对象,维护爬虫信息,可选属性如下。

方法 说明
setUrls 待爬的URL列表
setAllowSpread 允许扩散爬取,将会以现有URL为起点扩散爬取整站
setWhiteUrlRegexs URL白名单正则,非空时进行URL白名单过滤页面
setIfPost 请求方式:true=POST请求、false=GET请求
setUserAgent UserAgent
setParamMap 请求参数
setCookieMap 请求Cookie
setTimeoutMillis 超时时间,毫秒
setPauseMillis 停顿时间,爬虫线程处理完页面之后进行主动停顿,避免过于频繁被拦截;
setProxyMaker 代理生成器,支持设置代理IP,同时支持调整代理池实现动态代理;
setThreadCount 爬虫并发线程数
setPageParser 页面解析器
setPageLoader 页面加载器,默认提供 &# 34;JsoupPageParser&# 34; 和 &# 34;HtmlUnitPageLoader&# 34; 两种实现;
setRunData 设置运行时数据模型,默认提供LocalRunData单机模型,支持扩展实现分布式模型;
start 运行爬虫,可通过入参控制同步或异步方式运行
stop 终止爬虫

3.4 核心注解:PageSelect

功能:描述页面数据对象,通过该注解从页面抽取PageVo数据信息,可选属性如下。

PageSelect 说明
cssQuery CSS选择器, 如 &# 34;# body&# 34;

3.5 核心注解:PageFieldSelect

功能:描述页面数据对象的属性信息,通过该注解从页面抽取PageVo的属性信息,可选属性如下。(支持基础数据类型 T ,包括 List

PageFieldSelect 说明
cssQuery CSS选择器, 如 &# 34;# title&# 34;
selectType jquery 数据抽取方式,如 &# 34;.html()/.text()/.val()/.attr()&# 34;等
selectVal jquery 数据抽取参数,SelectType=ATTR 时有效,如 &# 34;.attr(&# 34;abs:src&# 34;)&# 34;
datePattern 时间格式化,日期类型数据有效

3.6 多线程

以线程池方式并行运行,提供对应API(可参考&# 34;章节3.3&# 34;)调整线程池大小,提高运行效率;

3.7 异步

支持同步、异步两种方式启动运行。

  • 同步:将会阻塞业务逻辑,爬虫爬取完全部页面后才会继续执行后续逻辑。
  • 异步:不会阻塞业务逻辑,爬虫逻辑以异步方式运行。

    3.8 动态代理

ProxyMaker(代理生成器):实现代理支持的组件。支持设置代理IP,同时支持调整代理池实现动态代理;

系统已经提供了两种策略实现;

  • RoundProxyMaker(循环代理生成器): 以循环方式获取代理池中代理;
  • RandomProxyMaker(随机代理生成器): 以随机方式获取代理池中代理;

    3.9、PageParser

PageParser(页面解析器):绑定泛型PageVO后将会自动抽取页面数据对象,同时支持运行时调整请求参数信息;

内部方法 说明
public void preParse(PageRequest pageRequest) 可选实现,发起页面请求之前触发调用,可基于此运行时调整请求参数;
public abstract void parse(Document html, Element pageVoElement, T pageVo) 必须实现,页面抽离封装每个PageVO之后触发调用,可基于此处理PageVO文档或数据;

3.10、分布式支持 & RunData

支持自定义RunData(运行时数据模型)并结合Redis或DB共享运行数据来实现分布式爬虫。默认提供LocalRunData实现单机版爬虫。

  • RunData:运行时数据模型,维护爬虫运行时的URL和白名单规则。
    • 单机:单机方式维护爬虫运行数据,默认提供 &# 34;LocalRunData&# 34; 的单机版实现。
    • 分布式/集群:集群方式维护爬虫爬虫运行数据,可通过Redis或DB定制实现。
      |RunData抽象方法|说明
      |——-
      |public abstract boolean addUrl(String link);|新增一个待采集的URL,接口需要做URL去重,爬虫线程将会获取到并进行处理;
      |public abstract String getUrl();|获取一个待采集的URL,并且将它从&# 34;待采集URL池&# 34;中移除,并且添加到&# 34;已采集URL池&# 34;中;
      |public abstract int getUrlNum();|获取待采集URL数量;

3.11、JS动态渲染 & PageLoader

页面数据通过 &# 34;PageLoader&# 34; 组件加载,默认使用以下两种实现:

  • JsoupPageLoader:速度最快,推荐采用这种方式(不支持JS动态渲染);
  • HtmlUnitPageLoader:支持JS动态渲染;
  • SeleniumPhantomjsPageLoader:支持JS动态渲染,&# 34;selenisum + phantomjs&# 34; 方案,兼容性较高;
    得益于模块化结构设计,可自由扩展其他 &# 34;PageLoader&# 34; 实现,如 &# 34;selenisum + chrome/headless&# 34; 方式等;

注意:

  • 1、HtmlUnitPageLoader 为扩展功能,因此maven依赖(htmlunit)scope为provided类型,使用时请单独引入;
  • 2、SeleniumPhantomjsPageLoader 为扩展功能,因此maven依赖(selenisum + phantomjs)scope为provided类型,使用时请单独引入;
  • 3、JS渲染方式采集数据实用性广,但是也存在缺点,如下:
    • 2.1:JS渲染,速度较慢;
    • 2.1:JS渲染,环境要求较高;
    • 2.3:在需要JS渲染的场景下,推荐做法是:分析页面请求,模拟并主动发起Ajax请求来代替JS引擎自动请求渲染。因为速度更快,更可控;