Heritrix配置及扩展

二、Heritrix功能概要
Heritrix做为一个爬虫框架,它抽像并实现了一组爬虫的基础组件,不同类型的使用者可以替换不同的组件来实现期望的功能,如最大利用带去镜像站点、集中搜索特定主题、对已爬过的网页持续更新等,甚至可以加入不同的协议。

1.Heritrix的主要组件
概括的说,herittrix有三大组件:
范围组件(Scope):范围组件是一组DecideRule对象按指定先后顺序组装起来的决策链,边界组件通过它来决定将哪些/个URI放入爬取调度队列;
边界组件(Frontier):边界组件通过范围组件或一组范围组件跟踪哪些URI将被爬取收集,以及将已经爬取的URI页面内的外链(outlinks)再次放入爬取调度队列,并将已经爬取过的URI剔除。
爬取组件(FetchChain):爬取组件是从网络上获取资源的关键组件,它包含了若干Processor对象,获取URI内容、分析外链,并将结果传给边界组件,实现递归爬取。

除了上述三大组件以外,Heritrix还有WEB管理、统计信息收集、定时备份、性能配置管理、增量更新等组件或小组件。


2.Heritrix的主要执行流程
上文说过,heritrix爬取过程是一个递归过程,整个过程主要有以下同个步骤:
从待爬取队列中获取一个URI
爬取URI内容
分析URI外链、归档URI内容
分析URI的外链,将符合范围组件定义通过边界组件签定的URI重新加入队列
标记已经处理过的URI


Heritrix配置及扩展

3.Heritrix的任务配置
创建Heritrix爬取任务后,主导任务爬取过程的是一个叫crawler-beans.cxml的配置文件,它实际上的一个Spring管理bean的配置文件。下面是这个配置文件中一些bean的简要说明:

范围
在Heritrix中,范围(scope)可以由一组接近40个可配置的DecideRule组成决策链,以下所列是Heritrix的默认最小配置中的scope
org.archive.modules.deciderules.RejectDecideRule
ban掉所有,默认REJECT

org.archive.modules.deciderules.surt.SurtPrefixedDecideRule
通过Host白名单,决策由decision设定,默认ACCEPT

org.archive.modules.deciderules.TooManyHopsDecideRule
ban掉跃点大于指定值,默认REJECT

org.archive.modules.deciderules.TransclusionDecideRule
通过所有嵌入链接(嵌入深度小于设定),,默认ACCEPT

org.archive.modules.deciderules.surt.SurtPrefixedDecideRule
通过Host,指定黑,决策由decision设定,默认REJECT

org.archive.modules.deciderules.MatchesFilePatternDecideRule
通过资源名,指定黑/白名单,决策由decision设定

org.archive.modules.deciderules.PathologicalPathDecideRule
ban掉路径重复超过阈值的,如http://www.sina.com.cn/2/2/2/some.html

org.archive.modules.deciderules.TooManyPathSegmentsDecideRule
ban掉路径深度超过阈值的,如http://www.sina.com.cn/1/2/3/4/5/some.html

org.archive.modules.deciderules.PrerequisiteAcceptDecideRule
通过所有有先决条件的url,比如种子或种子的重定向,dns

org.archive.modules.deciderules.SchemeNotInSetDecideRule
ban掉不支持的协议

以上所列DecideRules只是Hertitrix提供的一小部分,但它已足以支持很多常见的爬取工作了。要注意的是, 合的Reject和accept顺序是整个决策链正常工作的保证。再则,如果要爬取指定主题的页面,关键是对对应的DecideRules配置更详细的规则。

边界
org.archive.crawler.frontier.BdbFrontier
维护一个爬取任务的内部状态,包括:
总共发现了有多少URI
多少URI正在爬
已经爬了多少URI
URI的爬取先后顺序


org.archive.crawler.postprocessor.CandidatesProcessor
分析URI外链,将通过范围的URI再次加入到队列中。

org.archive.crawler.prefetch.CandidateScoper
通过前面的scope,判断一个抓取页面内的链接是否加入调度队列

org.archive.crawler.prefetch.FrontierPreparer
设置调度优先级,规范url,计算cost
FrontierPreparer有一个关键配置项preferenceDepthHops,它控制着爬取任务过程中,是采取深度优先,还是广度优先,默认-1是广度优先,0是深度优先,大于零的值,是从种子过来的第几层URI优先。
为避免个人理解错误,原文如下:

/**
     * Number of hops (of any sort) from a seed up to which a URI has higher
     * priority scheduling than any remaining seed. For example, if set to 1
     * items one hop (link, embed, redirect, etc.) away from a seed will be
     * scheduled with HIGH priority. If set to -1, no preferencing will occur,
     * and a breadth-first search with seeds processed before discovered links
     * will proceed. If set to zero, a purely depth-first search will proceed,
     * with all discovered links processed before remaining seeds. Seed
     * redirects are treated as one hop from a seed.
     */
org.archive.crawler.postprocessor.DispositionProcessor
更新server的robot信息,设置URL的调度时机


爬取链

org.archive.crawler.prefetch.Preselector
预先处理URL看其是否要继续处理,通过这个可以过滤一部分或者全部URL

org.archive.crawler.prefetch.PreconditionEnforcer
先处理一些先要处理的URL条件,这里主要是该URL的DNS解析
1 先查看该URL是否有先决条件URL要处理,如果有的话先将该URL的先决   条件URL放入调度器,而该URL将跳过PreconditionEnforcer处理器
2 如果以上该URL没有先决条件URL要处理,则运行以下环节:
    i)先验证该URL的schema,如果不是http或者https则退出该处理器
    ii)如果以上验证该shema是http或者https,则先验证该URL是否可以通   过爬虫协议,如果没有通过爬虫协议则退出本处理器,反之则验证该   URL自身是否是先决条件以及是否通过登录凭证,如果该URL自身不    是先决条件URL并且没有通过登录凭证则也退出本处理器

org.archive.modules.fetcher.FetchDNS
1 首先获取该URL的DNS名字,然后通过DNS名字从缓存中获取CrawlHost
2 验证该URL的DNS名字是否通过第四代IP命名,如果不通过则退出本处 理器
3 如果以上通过,则开始获取DNS数据,同时记录开始获取以及成功获取时 间,最后将DNS数据保存在本地文件(scratch文件)以及更新该URL状态 以及该URL的CrawlHost的IP、时间等数据

org.archive.modules.fetcher.FetchHTTP
1 获取HTTP数据的前提是,该URL的schema为http或者https以及该URL 所属的DNS数据已经获取,如果两者不具备则跳出本处理器
2 如果以上通过,则统计这个处理器处理的URL个数,以及开始获取HTTP 内容

org.archive.modules.extractor.ExtractorHTTP
org.archive.modules.extractor.ExtractorHTML
org.archive.modules.extractor.ExtractorCSS
org.archive.modules.extractor.ExtractorJS
org.archive.modules.extractor.ExtractorSWF
这里主要是通过正则表达式从网页文本内容中抽取出URL,主要是 ExtractorHTML类
在URL抽取过程中,会用到LinksScoper 链接接范围验证处理器,主要验证该URL抽取出来的链接是否在范围
    1)  先验证该URL是否有先决条件URL要先处理,有的话先验证该先决条件URL是否在范围同时退出该处理器
    2) 如果以上没有先决条件URL要先处理,则获取该URL抽取到的链接,然后循环验证每个链接是否在范围,不在范围则过滤掉


org.archive.modules.writer.WARCWriterProcessor
主要将从FetchHttp里获取的网页内容写入本机,以WARC格式
org.archive.modules.writer.MirrorWriterProcessor
主要将从FetchHttp里获取的网页内容写入本机,以原网站镜像方式

org.archive.modules.DispositionChain
分析URI信息,回传结果到边界组件,通过调度处理器,将URL放入调度中心,以便接下来可以抓取
1 先验证该URL是否有先决条件URL要先处理,有的话则将该先决条件URL 放入调度中心,同时退出该处理器
2 如果以上该URL没有先决条件URL要处理,则获取该URL抽取到的所有 链接,循环将他们放入调度中心,以便下次可以抓取


4.Heritrix生死
上文讲了三大组件各自的功能和配置要点,要让Heritrix的抓取任务正确的跑起来,就需要Heritrix的管理中枢出场了。CrawlController可以说是Heritrix的大脑,在Heritrix中拥有无上的权利!借助它可以控制Heritrix的启动、暂停、停止,也定时进行数据统计、数据汇报和文件管理。
Controller作为上述组件的协调者,很多组件之间的互相访问都是通过Controller完成的。

org.archive.crawler.framework.CrawlLimitEnforcer
通过监听StatisticsTracker发出的StatSnapshotEvent事件,判断当前抓取任务的是否达到全局终止限制,并停止抓取任务的运行。

org.archive.crawler.framework.CheckpointService
可以设置抓取过程的备份还原点,通过更改<property name="checkpointIntervalMinutes" value="-1"/>设置定时备份间隔。

避免故障恢复后的重复抓取,可通过Frontier的recoveryLogEnabled=true,从日志文件"frontier.recover.gz"导入已抓取列表。

三、对Heritrix的扩展
Heritrix作为一个完善的web抓取框架,全站dump功能已经很完善,对于有害项目的应用,我们还要扩展/增强以下的功能:
1.增量更新

CrawlURI有一字段rescheduleTime用来指示Frontier该URI会再次被抓取的延时时间,Frontier在调度此URI的时候,会将有延时的URI放入StoredSortedMap<Long, CrawlURI> futureUris中,当从工作线程尝试从Frontier获取下一抓取URI时,达到定时时间的URI会被再次放入工作队列。

org.archive.crawler.postprocessor.ReschedulingProcessor对象可以配置在DispositionChain后,用以指示URI增量更新的延时时间。
但是更多的,ReschedulingProcessor只是我们实现增量更新的示例性代码,更多的增量更新逻辑,需要根据业务需要开发支持更多复杂规则的组件。

2.垂直抓取
从Heritrix的三大组件、抓取处理我们都已经看得出,Heritrix已经为支持垂直抓取做了很大努力。
对于复杂的垂直抓取规则,可以从scope的DecideRule和DispositionChain的Processor入手,Heritrix提供的DecideRule基本上都直接通过正则或变量表达式判断一个CrawlURI是否符合条件,组合条件的DecideRule需要定制。
对于明显的需要在某种页面终止深度抓取的要求,需要在DispositionChain上设置定制的Processor,适时的跳出递归处理链。


四、附注
1.Heritirx的基本运行参数
运行脚本heritrix -a admin:admin
访问https://localhost:8443,用户名跟密码就是以上输入的admin:admin

2.队列分配策略
<!-- QUEUE ASSIGNMENT POLICY -->
<!--
<bean id="queueAssignmentPolicy"
   class="org.archive.crawler.frontier.SurtAuthorityQueueAssignmentPolicy">
  <property name="forceQueueAssignment" value="" />
  <property name="deferToPrevious" value="true" />
  <property name="parallelQueues" value="1" />
</bean>
-->

Heritrix默认是将CrawlURI的Host作为该URI的队列名称,就是同一域名下的URI在同一个队列内,虽然这样做可以统一所有该域下的规则,但是由于一个队列同时只能在一个线程内活动,就会造成同一域名下的URI是串行抓取的。

HostnameQueueAssignmentPolicy


IPQueueAssignmentPolicy


AssignmentLevelSurtQueueAssignmentPolicy


3.种子的加载方式
直接载入
<bean id="seeds" class="org.archive.modules.seeds.TextSeedModule">
     <property name="textSource">
          <bean class="org.archive.spring.ConfigString">
               <property name="value">
                    <value>
                   
                    </value>
               </property>
          </bean>
     </property>
     <!--  <property name='sourceTagSeeds' value='false'/>  -->
     <!--
      <property name='blockAwaitingSeedLines' value='-1'/>
     -->
</bean>

通过seeds.txt载入
<bean id="seeds" class="org.archive.modules.seeds.TextSeedModule">
  <property name="textSource">
   <bean class="org.archive.spring.ConfigFile">
    <property name="path" value="seeds.txt" />
   </bean>
  </property>
  <property name='sourceTagSeeds' value='false'/>
  <property name='blockAwaitingSeedLines' value='-1'/>
</bean>

通过ActionDirectory动态载入(注意是动态,你随时可以载入)
<bean class="org.archive.crawler.framework.ActionDirectory">  
<property name="actionDir" value="action" />  
<property name="initialDelaySeconds" value="10" />  
<property name="delaySeconds" value="30" />  
</bean> 

实现SeedModule接口,完全自定义

4.在Prefetcher中取消robots.txt的限制
在Heritrix中,对robots.txt文件的处理是处于PreconditionEnforcer这个Processor中的。PreconditionEnforcer是一个Prefetcher,当处理时,总是需要考虑一下当前这个链接是否有什么先决条件要先被满足的,而对robots.txt的访问则正好是其中之一。在PreconditionEnforcer中,有一个private类型的方法,方法为:
private boolean considerRobotsPreconditions(CrawlURI curi)
该方法的含义为:在进行对参数所表示的链接的抓取前,看一下是否存在一个由robots.txt所决定的先决条件。很显然,如果对每个链接都有这样的处理。那么,很有可能导致整个抓取任务的失败。因此,需要对它进行调整。这个方法返回true时的含义为需要考虑robots.txt文件,返回false时则表示不需要考虑robots.txt文件,可以继续将链接传递给后面的处理器。所以,最简单的修改办法就是将这个方法整个注释掉,只留下一个false的返回值。

你可能感兴趣的:(Heritrix3,cxml)