Heritrix配置及扩展

来源:互联网 发布:手机视频格式转换软件 编辑:程序博客网 时间:2024/03/29 13:48

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的返回值。

0 0