[转载]http://blog.csdn.net/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.)
Reference
1. Incremental crawling with Heritrix
分享到:
相关推荐
本文将深入解析Heritrix的架构及其增量抓取的实现策略。 Heritrix的架构主要包括以下几个核心组件: 1. **Web Administrative Console**:这是一个基于Web的控制台,方便用户远程管理和监控爬虫任务。Heritrix内建...
标题中提到的“扩展Heritrix3指定内容提取”意味着本文档...这些知识点涵盖了Heritrix3扩展内容提取的主要方面,对于希望深入了解和应用Heritrix3进行网页数据抓取和信息提取的用户来说,这些知识具有重要的指导意义。
Heritrix可以定期执行新的爬网任务,而Lucene则提供了增量索引和实时索引的功能,以支持快速更新。 9. **安全性与合规性**: 在构建搜索引擎时,开发者需注意遵守隐私政策和法律法规,尊重robots.txt文件,避免抓取...
Heritrix是一个开源的网络爬虫工具,广泛用于数据抓取和搜索引擎的构建。现在,我们将详细讨论这两个关键知识点——Lucene和Heritrix。 **Lucene** Lucene是Apache软件基金会的一个开源项目,它是一个全文检索库,...
2. **Heritrix框架**:Heritrix是一个高度可配置和模块化的爬虫平台,它支持深度爬取和增量爬取,具备递归和归档机制。它的核心特性包括URL调度器、链接解析器、内容处理器等,这些组件协同工作,实现了对Web页面的...
- **Launch**:加载现有任务并启动抓取过程,支持基于已有任务的增量抓取。 - **Pause**:暂停抓取,不会立即生效,需等待当前线程完成。 - **Unpause**:恢复暂停的任务继续抓取。 - **Checkpoint**:类似于...
3. **数据分析与预处理**:介绍如何使用Heritrix的处理器对抓取的数据进行清洗和预处理,使其适合Lucene索引。 4. **索引优化**:探讨如何优化Lucene索引,提高搜索性能,如位图索引、分块索引等。 5. **查询处理与...
增量式抓取则基于已有的网页集合,抓取更新的或过时的网页,确保数据的实时性。实际应用中,两者通常结合使用,前者用于大规模数据初始化,后者用于日常维护和即时更新。 工作流程: Nutch的工作流程主要包括注入...
2. **Heritrix**:Heritrix 是一个高度可配置的开源网络爬虫框架,它可以模拟浏览器的行为从互联网上抓取数据。通过对Heritrix进行扩展和优化,可以高效地从多个新闻源抓取最新的新闻信息。 3. **中文分词**:由于...
Heritrix可以从指定的URL开始,按照预设的策略遍历网页,抓取所需的资源,并将其存储在本地供后续处理。 #### 五、文档处理与索引 对于文本查询为主的搜索引擎而言,文档处理和索引是非常关键的步骤。文档通常需要...