by 卢佳
上次讲到了如何使用,今天来讲一讲Hetrix的设计,供我们设计时参考。文章比较长,大家准备好茶水~~~~
1 架构
Hetri架构如下所示
各部分是啥意思呢?
1 CrawlOrder:由order.xml文档规约的爬虫任务属性
2 CrawlController:爬虫任务的控制器
其中定义了这些组件:
- a) Scope: 决定当前抓取范围的组件
- b) ProcessChainList:包括Prefetch Chain、Fatch Chain、Extrator China、Write Chain、Postprocess Chain。
- c) Toethread:线程缓冲池
- d) ServerCache:已访问的Host-IP地址表缓存
- e) Frontier:前端队列,为每个线程提供URL(使用了Berkley DB)
核心工作类:
1. CrawlController是Heritrix的核心工作类,负责其他所有类的协同工作,提供运行爬虫的顶级接口,执行主线程,从Frontier中抽取URL至线程池。CrawlController的结构如下图所示。
2 Frontier
前端队列负责安排下一个待爬行链接。其排队策略遵循显示礼貌和隐式礼貌。以爬行链接会和新连接一起提交到Frontier,由Frontier安排重爬策略。
在前端队列中,还维护着各个URL的状态,即发现了哪些URL,哪些正在被处理,哪些已经爬取。
Heritrix的Frontier接口可以有多种实现。默认使用的BdbFrontier,利用Berkley DB管理前端队列。
Frontier是Heritrix中最复杂的结构,整体结构如下:
其中最核心的3个方法是next()、schedule()、finished()方法,关于Frontier的具体实现可以参看官网主页上的简单例子http://crawler.archive.org/articles/developer_manual/frontier.html
3 线程池
ToeThreads是Heritrix中维护的一个线程池。每个独立的线程向Frontier请求一个链接并且处理这个链接,当一个URL完成一个处理链后开始请求下一个链接。默认的处理形式是一个服务器维护一个队列,
4 处理链
Heritrix的处理链如上图所示。以下详细说明各个步骤:
- 1) 预取处理:主要包括,检查URL是否是在允许爬行的范围内(Scope),检查爬取的前置条件是否满足(DNS查询、robots.txt文件获取和权限等)。
- 2) 爬取处理:从远程服务器获取数据。对每个协议有不同的获取接口,如FetchHTTP、FetchFTP等
- 3) 提取处理:从已爬取页面中提取超链接
- 4) 写/索引处理:将爬取内容写入归档文件,必要时创建索引
- 5) 取后处理:(注,即使预取处理中判断不要爬行该URL,也必须经过该处理。)该处理完成的任务主要为:a) 更新爬虫状态,如主机信息、robots信息等。b) 检查链接范围是否和定义的一致,不一致的抛弃。c) 将新发现的URL和Frontier中的进行排序。
2 总结
Heritrix可进行的下载范围非常广泛,从文字到图片,几乎所有都可下载,同时,可配置的能力非常强大,处理链都可以自己配置,或是重载自己的新方法。不足之处是只有网站的爬取下载功能,没有默认的更新调度策略,也不具备存储和检索方案。更像一个网站下载器。