heritrix设计详解(一) 总述

[b][color=red]原创文章:转载请注明出处[/color][/b]

读了一段时间的源码,结合网上的文档和自己的理解来详解下heritrix的体系结构,总体来说hertitrix是一个设计优良的框架,扩展性极强,除了无法实现分布式之外,其他部件都可以被扩展。

[b]体系结构[/b]
CrawlController(下载控制器):整个下载过程的总的控制者,整个抓取工作的起点,决定整个抓取任务的开始和结束.从Frontier获取URI,传递给线程池(ToePool)中的ToeThread调用处理器链(Processorchains)处理.
Frontier(边界部件): 跟踪哪个预定的URI将被收集,和已经被收集的URI,选择下一个 URI,剔除已经处理过的URI.有三个核心方法next(),schedule(),finished().

crawlScope(范围部件):设置应该在什么范围内抓取网页链接.如域限制,不受限制


[b]控制器[/b]

中央控制器是抓取的核心组件.它决定抓取的开始、结束和暂停.从Frontier获取URI,传递给ToePool中的ToeThread处理.
类中定义了一下组件
Crawlerorder配置文件对象
Crawlerscope抓取范围控制对象
Processorchainlist处理链对象
Frontier边界部件
Toepool线程池
Servercache缓存,他保存了所有在当前任务重抓取过的host名称和server名称(包括IP地址,历史记录,机器人策略.)


[b]边界部件[/b]
跟踪哪个预定的URI将被收集,和已经被收集的URI,选择下一个 URI,剔除已经处理过的URI.
调度器负责从Url库中选择需要抓取的Url列表,它是整个Spider系统的大脑,此模块是实现了优雅抓取的核心,调度器针对URL采用了域散列,可以保证不会同时有两个线程抓取同一个域下的URL,并且对每个域的抓取间隔都有控制;
具体实现 得到一个URL通过解析得到他的主域名(例如: http://www.autohome.com.cn/brand/解析后的主域名就为www.autohome.com.cn)把此主域名做key所有此域名下的URL对象都存储在这个key中的BDB中.具体见下图
[table]
|Key1 |Queue1(url1,url2,url3,…)|
|Key2 |Queue2(urlx,…)|
|Key3 |Queue3(…)|
|… |…|
[/table]
以上key值的生成方式可以根据用户需求拓展,这里提供了两种策略.
域生成: 按域生成则是按域生成key,把同一个域名下的URL都放入这个key值的队列中.按域生成可以很好的控制抓取速度,但是在需要抓取的网站数少的情况下,下载速度明显很慢.
elhash生成:elfhash生成是按散列生成key,这能明显提高抓取速度,可是这样会对服务器照成压力.
每次得到一个url对象的时候就会锁定这个key值,直到其运行完并且过了等待时间(比如配置的是50K/S而实际抓取是100K/S则会让队列睡眠等待成配置的速度+配置文件中配置的间隔上一次访问访问时间)才会解锁,这保证了同一时间内只会有一个线程抓取此域名的URL.
此类里面实现一个过滤器,抓们用来过滤当前需要被加入的链接对象是否已经抓取过.过滤器可以根据用户需求拓展.
此服务还实现了URL抓取的计数(访问,排除,成功,失败),去重服务,URL备份以及日志服务


[b]处理器链[/b]
许多Processor组成一个处理链(processor chains)中,每一个处理链对URI进行一系列的处理.
(1)Pre-fetch processing chain(预处理链)
主要根据下载范围控制信息判断当前URI是否应当处理.
(2)Fetch processing chain(抓取处理链)
从远程服务器获取数据
(3) Extractor processing chain(抽取处理链)
从网页中抽取新的URI
(4)Write/index processing chain(写处理链)
负责把数据写入本地磁盘、DB、DBD
(5)Post-processing chain(后置处理链)
把抽取出来的URL加入到队列

整个处理链由管理员配置,可以每一个processor块都可以由多个处理

Processor类:代表当个的处理器,素有的处理器都是他的子类
ProcessorChain类:此类类似于一个队列,里面包括了同种类型的几个Processor
ProcessorChainList类:此类保存了此次抓取所设置的所有处理器链.
比如fetchHTML用来得到HTML页面,fetchDNS用来得到DNS信息,他们都继承FETCH类,FETCH继承Processor.多个Processor组成ProcessorChainList.

[b]线程池(ToePool)[/b]
线城池(ToePool)是一个标准的线程池,他用来管理所有抓取线程(ToeThread),每个抓取线程向frontier要一个URL然后调用处理链.


[b]去重策略[/b]
先抓取网页,把URI和网页摘要保存到hash表中.第二次抓取相同URI根据URI查找并比较之前存入hash表中的摘要是否相同


[b]FETCHHTML[/b]
这是处理链中的一个实现,用来获取HTML内容.他首先判断能否抓取HTML,在抓取过程中将网页信息写入内存,然后计算网页摘要值sha1或md5,fetchhtml会把每个url访问的cookie存储

[b]配置服务[/b]
heritrix编写了一套强大的配置服务系统,所有的配置服务都继承与此服务。其中有个很重要的超类ComplexType,所有配置模块超类,这个类是通用的配置框架的核心,所有可配置的模块都扩展这个类或是他的子类.本类的所有子类都将自动遵循JMX的DynamicMBean
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值