Heritrix简介
温星华
2023-12-01
Heritrix简介
爬虫概念,spider
像蜘蛛网一样的,从一个提供的种子URL地址开始,抓取当前URL的所有对外链接,往外发散。应该有URL去重复功能(去重复与增量抓取相互矛盾)、抓取层次限制功能。
Heritrix是什么?
一个开源的纯java的网络爬虫框架。遵循网站 robots(某些网站上有一些资源在时间上受下载或访问限制) 协议。
Heritrix优点?
Heritrix采用了Berkeley DB做为中间数据存储,像URL等。很大程度上提升了Heritrix的性能,因为Berkeley DB是一个可嵌入式的非关系型数据库(key-value)。使用BerkeleyDB做持久化队列,如待抓取队列,已抓取队列,重试队列等。
Heritrix 3 是一个基于多(JOB)任务并发运行系统
Heritrix的JOB是基于spring xml配置方式,比较灵活,如各处理链条的
并行队列,提高抓取速度。
Heritrix基本架构
CrawlController整个抓取过程的总控制者,整个抓取工作的起点,决定整个抓取任务的开始和结束。从Frontier获取URI,传递给线程池(ToePool)中的ToeThread处理
Frontier为处理链接的线程提供URL,并负责链接处理完成后的一些后续调度操作。Frontier负责确定下一个将被处理的URI,负责访问的均衡处理,避免对某一web服务器造成太大的压力。当一个URI被爬行完,它随同新发现的URIs被送回Frontier来安排进行后续crawling.
next(int timeout):为处理线程提供一个链接.Heritrix的所有处理线程(ToeThread)都是通过调用该方法获取链接的.
schedule(CandidateURI caURI):调度待处理的链接.
finished(CrawlURI cURI):完成一个已处理的链接.
ToeThreadHertirix为多线程工作方式,每个ToeThread控制一个URI。ToeThread负责向Frontier请求一个新的URI并发派给相应的处理器,然后再去请求下一个URI。
Processors相关的处理器被编制到一个处理器链中。每条处理器链会对一个由ToeThread送来的URI进行一系列的处理。URI在一个链条中的传递过程是由ToeThread负责完成的。一个处理器(Processor)可以把一个处理完毕的URI传递到另外一个链条中。Hertirix提供了几条默认的处理器链:
1. Pre-fetch processing chain 主要根据robot协议,DNS以及下载范围控制信息判断当前URI是否应当处理
2. Fetch processing chain 从服务器抓取数据
3. Extractor processing chain从网页中提取新的URI,或者网页信息作其他用途
4. Write processing chain将数据写到本地磁盘中。以某种格式保存,并建立索引。
5. Post-processing chain 后处理工作,比如把URI放回等
Logs and reports
队列优先级:
URL优先级:
•NORMAL
默认的调度选项,大部分URI都是设置次选项
•MEDIUM
•HIGH
•HIGHEST
队列策略:
•Heritrix中的待抓取队列有多个。每一个URL都给予一个Key,然后将那些Key值相同的链接放在一起,成为一个队列,也就是一个Queue。
•默认情况下是按照host来进行分配的,即相同Host名称的所有URL都会被置放于同一个队列中间
•在Heritrix中,为每个队列赋上Key值的策略,也就是它的queue-assignment-policy。可以扩展QueueAssignmentPolicy来自定义URL的key值算法
增量抓取:
对种子URL设置下次抓取时间
我们对Heritrix做了哪些扩展?
根据Heritrix源代码,做了一定量的配置文件与代码的修改。
配置文件中去掉了 写处理链条,此处理链负责将网页内容抓写到磁盘上。
配置文件中对 抓取处理链条(FetchChain)做了定制化处理,如:
ignoredDownloadUrlPreselector 范围Scope处理;
metadataExtractor 抽取url所在的html信息,使用htmlunitdriver或者是webdriver来抓取url信息。首先判断url的网络状态是否正常,再找到相对应的模板,使用该模板来处理url信息,并将数据封装到model对象中。
fillModelProcessor 补充model对象的属性,如:类型对应的分类ID,真实URL(相对比URL跳转情况)等信息。
mergeOutlinksProcessor 抽取当前URL的对外链接。
posterUrlProcessor 自动处理海报属性。
ignoredDownloadProcessor 过滤掉不处理的对外URL链接
dataToActiveMQProcessor 保存数据到数据库。
dataToSolrProcessor 保存数据到SOLR。
通过SQL方式读取种子URL:
sqlWiesScraperConfigReader:将数据库的JSON数据转换为JAVA对象ScraperConfig。
分布式Heritrix
将原Heritrix抓取到的URL链接通过Hash计算后,借由JMS TOPIC分发到Heritrix集群中的每个Heritrix任务。
模板简介
模板概念
模板是匹配一类网页内容相似度比较高的通用处理方式。借由xpath提取网页信息。
模板与Heritrix接口是我们扩展出来的处理器metadataExtractor。
模板一些配置项,与Heritrix有一定相关联
1、模板配置需要添加一个URL规则,此规则为一个正则表达式字符串。则所有匹配该URL规则的链接会被该模板处理。
2、种子?种子与模板并不是很紧密的关联关系,因为当Heritrix读取一堆模板后,所有模板所配置的种子都被集中处理,并不是只侦对当前模板。当然一般我们添加的种子都是与当前模板相关联的。
3、解析html方式。Htmlunit 或者 webdriver
4、深度限制,默认5层
模板处理数据原理
模板借用MVEL动态解析脚本语言。我们自己也扩展了一些常用函数,如:pubDate(arg),格式化日期函数;xpath(),提取网页内xpath表达式代表的内容。相关函数与变量参考函数手册。
模板使用了一些处理器来组装成一个可执行的流程,风格类似于一种简易的编程。内置处理器有:
1、循环处理器:循环分两种,一种是条件判断循环;一种是对xpath取到的一组信息循环处理。
2、设置变量处理器:设置一个局部变量,对当前处理以及子处理可见
3、提取网页信息处理器:有两种提取处理器,一种是用精确的xpath来提取信息;一种是对一个信息区域通过分隔符来提取某个信息。
4、模拟点击处理器:模板页面鼠标点击事件
5、执行JavaScript脚本处理器:模拟浏览器执行javascript脚本
6、执行脚本处理器:可以直接嵌入式动态插入一些处理数据的脚本语言
模板工程Java代码分析
首先Heritrix启动任务会加载crawler-beans.cxml配置文件。
该配置文件中会加载模板工程中的ScraperManager类,这个单例管理类比较重要,它负责维护一些公共信息,如:读取模板(从数据库读取 JSON 字符串并转化为 ScraperConfig 对象)并持有、读取模型(从包路径读取类上有相应注解信息的POJO对象或从数据库中读取)并持有、创建Context(有URL上下文以及网页分析工具上下文(HtmlunitDriver、WebDriver))等功能。
该配置文件也会加载模板工程中的Webdriver池和HtmlunitDriver池信息。
在Heritrix的MetadataExtrator处理器中,调用ScraperConfig.run(ScraperContext) ,提取该URL网页内容,一个ScraperConfig类相当于咱们配置的一个具体的模板。
在ScraperConfig运行时,根据模板中定义好的处理器做处理。