heritrx增量抓取

转载地址:http://blog.youkuaiyun.com/historyasamirror/article/details/6706174


虽然打着Heritrix的名头,但本文更多的还是谈谈增量抓取的基本思想,Heritrix只是正好被用来做为例子。


如果你不是随便写个爬虫抓着玩,那么一定会碰到一个问题,就是增量抓取。不管是百度,google这样的广泛搜索引擎,还是现在很火的垂直搜索,增量抓取一定都是做爬虫的最需要考虑的问题。
之所以需要增量抓取的原因,有两个:
1. 网站总是在不断的发生着变化。或者添加了新的网页,或者旧的网页内容发生了变化;
2. 并没有机制能够将网站发生的变化主动的推送给搜索引擎,如果有这种机制,一切都将变得简单,也就不需要爬虫去做增量抓取;

增量抓取的目的就在于尽可能快的抓取到变化了的网页(包括新增的和发生变化的旧的网页):
之所以需要尽可能的快,是因为这直接关系到搜索引擎提供的信息的时效性。假设一个网页发生了变化,而爬虫一个月之后才重新重新抓取,那么意味着搜索引擎内关于这个网页的信息在这一个月之内都是过时的;
之所以是尽可能的快,是因为爬虫的增量抓取这种方式永远都不可能保证一定能够及时发现变化的网页。哪怕重复抓取的频率很快,也不能避免网页在两次抓取之间发生了变化。如果希望达到实时性,就只能通过接口调用。比如google为了实时搜索twitter的信息,购买了twitter的数据,twitter只要产生新的数据就会推送给google;再比如我之前听过一个“去哪儿”的讲座,为了保证搜索到的机票价格一定是最及时的,在每次搜索的时候,都实时的调用航空公司的接口实时的获取机票价格,这是一个典型的牺牲服务的响应速度而保证信息时效性的例子(几年前听说的,不确定还是这么做...);

根据前述,构建一个增量抓取的爬虫主要有两个要素:
1. 如何能够尽可能快;
2. 怎样判断网页发生了变化;

先说第一点。如果是抓取特定的网站,那么可以引入一些先验知识。比如,网站的索引页总是能够关联上哪些新增加的网页,一个网站的变化频率也可以简单的估计。通过引入这些知识,爬虫可以很容易的很快的找到那些可能发生变化的网页。而对于像百度这样的搜索引擎,因为需要抓取所有的网页,它不太可能去一一分辨每个网站的索引页,这种情况下,就必须有动态学习和调节网站抓取频率的机制,对于那些变化快的网站/网页,重复抓取的频率就应该高,而那些几乎不变化的网页,重复抓取的间隔就可以很长。
关于第二点,看上去似乎很简单,只需要字符串比较一下新的网页和上次抓取的版本是否发生了变化。但是在很多情况下,网页的字符可能发生了微小的变化,但并不意味着网页的实质内容发生了变化。举例来说,网页上有个地方写着系统的当前时间,这意味着每次查看该网页时间都会变,但是,网页的真正内容可能从未发生过变化。如何过滤这些信息而能够判断网页内容的真实变化并不是一件容易的事。

说了这么多干巴巴的东西,还是看看Heritrix怎么做的吧。
(以下的内容需要对Heritrix的架构和模块有一个基本的了解)

为了实现Heritrix的增量抓取功能,需要在Processing Chains中添加几个新的组件,如下图:

在Extractor Processing Chain的最前端,加入一个新的模块:HttpContentDigest,这个模块会对有Fetch Processing Chain抓取下来的网页产生一个摘要,这个摘要就是为了判断网页是否发生了变化,这个摘要的产生必须要考虑到我们之前提到过的网页的细节发生变化,但是内容无变化的这种情况;

HttpContentDigest之后会有一个ChangeEvaluator的模块,这个模块根据HttpContentDigest产生的新的网页摘要以及上一次抓取生成的旧的摘要的对比,判断网页是否发生了变化;

在Post Processing Chain中会加入一个WaitEvaluator,这个模块的作用,是根据ChangeEvaluator的结果动态的调节该网页的抓取频率,并给出该网页下一次的抓取时间。还是举例说,比如这个url之前的抓取频率是1天,意味着1天重复抓取一次。如果ChangeEvaluator判断本次抓取网页的内容发生了变化,那么WaitEvaluator会将该url的抓取频率设置为 1天 / 2 = 12小时,意味着它的抓取频率需要更快;如果网页内容没有发生变化,那么新的抓取间隔会被设置为 1天 * 2 = 2天。

其本质就是根据网页抓取后内容是否变化来动态调节抓取频率。

此外,Heritrix的Froniter也需要改成AdaptiveRevisitFrontier。Heritrix默认的Froniter内部是一个FIFO的队列,而AdaptiveRevisitFrontier内部则是一个优先级队列。它根据WaitEvaluator设定的wait time(也就是抓取间隔)来排列url,判断哪个url应该被调度。

(注:AdaptiveRevisitFrontier是一个实验性质的Froniter: EXPERIMENTAL Frontier that will repeatedly visit all encountered URIs. Wait time between visits is configurable and is determined by seperate Processor(s). See WaitEvaluators See documentation for ARFrontier limitations.)


Heritrix是IA的开放源代码,可扩展的,基于整个Web的,归档网络爬虫工程 Heritrix工程始于2003年初,IA的目的是开发一个特殊的爬虫,对网上的 资源进行归档,建立网络数字图书馆,在过去的6年里,IA已经建立了400TB的数据。 IA期望他们的crawler包含以下几种: 宽带爬虫:能够以更高的带宽去站点爬。 主题爬虫:集中于被选择的问题。 持续爬虫:不仅仅爬更当前的网页还负责爬日后更新的网页。 实验爬虫:对爬虫技术进行实验,以决定该爬什么,以及对不同协议的爬虫爬行结果进行分析的。 Heritrix的主页是http://crawler.archive.org Heritrix是一个爬虫框架,可加如入一些可互换的组件。 它的执行是递归进行的,主要有以下几步: 1。在预定的URI中选择一个。 2。获取URI 3。分析,归档结果 4。选择已经发现的感兴趣的URI。加入预定队列。 5。标记已经处理过的URI Heritrix主要有三大部件:范围部件,边界部件,处理器链 范围部件:主要按照规则决定将哪个URI入队。 边界部件:跟踪哪个预定的URI将被收集,和已经被收集的URI,选择下一个URI,剔除已经处理过的URI。 处理器链:包含若干处理器获取URI,分析结果,将它们传回给边界部件 Heritrix的其余部件有: WEB管理控制台:大多数都是单机的WEB应用,内嵌JAVA HTTP 服务器。 操作者可以通过选择Crawler命令来操作控制台。 Crawler命令处理部件:包含足够的信息创建要爬的URI。 Servercache(处理器缓存):存放服务器的持久信息,能够被爬行部件随时 查到,包括IP地址,历史记录,机器人策略。 处理器链: 预取链:主要是做一些准备工作,例如,对处理进行延迟和重新处理,否决随后的操作。 提取链:主要是获得资源,进行DNS转换,填写请求和响应表单 抽取链:当提取完成时,抽取感兴趣的HTML,JavaScript,通常那里有新的也适合的URI,此时URI仅仅被发现,不会被评估 写链:存储爬行结果,返回内容和抽取特性,过滤完存储。 提交链:做最后的维护,例如,测试那些不在范围内的,提交给边界部件 Heritrix 1.0.0包含以下关键特性: 1.用单个爬虫在多个独立的站点一直不断的进行递归的爬。 2。从一个提供的种子进行爬,收集站点内的精确URI,和精确主机。 3。主要是用广度优先算法进行处理。 4。主要部件都是高效的可扩展的 5。良好的配置,包括: a。可设置输出日志,归档文件和临时文件的位置 b。可设置下载的最大字节,最大数量的下载文档,和最大的下载时间。 c。可设置工作线程数量。 d。可设置所利用的带宽的上界。 e。可在设置之后一定时间重新选择。 f。包含一些可设置的过滤机制,表达方式,URI路径深度选择等等。 Heritrix的局限: 1。单实例的爬虫,之间不能进行合作。 2。在有限的机器资源的情况下,却要复杂的操作。 3。只有官方支持,仅仅在Linux上进行了测试。 4。每个爬虫是单独进行工作的,没有对更新进行修订。 5 。在硬件和系统失败时,恢复能力很差。 6。很少的时间用来优化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值