爬虫调研之Hetrix(2):架构设计参考

来源:互联网 发布:php微信支付代码 编辑:程序博客网 时间:2024/04/28 06:05

by 卢佳

上次讲到了如何使用,今天来讲一讲Hetrix的设计,供我们设计时参考。文章比较长,大家准备好茶水~~~~

1 架构

Hetri架构如下所示

clip_image002

各部分是啥意思呢?

1 CrawlOrder:由order.xml文档规约的爬虫任务属性

2 CrawlController:爬虫任务的控制器

其中定义了这些组件:

  1. a) Scope: 决定当前抓取范围的组件
  2. b) ProcessChainList:包括Prefetch Chain、Fatch Chain、Extrator China、Write Chain、Postprocess Chain。
  3. c) Toethread:线程缓冲池
  4. d) ServerCache:已访问的Host-IP地址表缓存
  5. e) Frontier:前端队列,为每个线程提供URL(使用了Berkley DB)

核心工作类:

1. CrawlController是Heritrix的核心工作类,负责其他所有类的协同工作,提供运行爬虫的顶级接口,执行主线程,从Frontier中抽取URL至线程池。CrawlController的结构如下图所示。

clip_image004

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

clip_image005

3 线程池

ToeThreads是Heritrix中维护的一个线程池。每个独立的线程向Frontier请求一个链接并且处理这个链接,当一个URL完成一个处理链后开始请求下一个链接。默认的处理形式是一个服务器维护一个队列,

4 处理链

clip_image007

Heritrix的处理链如上图所示。以下详细说明各个步骤:

  1. 1) 预取处理:主要包括,检查URL是否是在允许爬行的范围内(Scope),检查爬取的前置条件是否满足(DNS查询、robots.txt文件获取和权限等)。
  2. 2) 爬取处理:从远程服务器获取数据。对每个协议有不同的获取接口,如FetchHTTP、FetchFTP等
  3. 3) 提取处理:从已爬取页面中提取超链接
  4. 4) 写/索引处理:将爬取内容写入归档文件,必要时创建索引
  5. 5) 取后处理:(注,即使预取处理中判断不要爬行该URL,也必须经过该处理。)该处理完成的任务主要为:a) 更新爬虫状态,如主机信息、robots信息等。b) 检查链接范围是否和定义的一致,不一致的抛弃。c) 将新发现的URL和Frontier中的进行排序。

2 总结

Heritrix可进行的下载范围非常广泛,从文字到图片,几乎所有都可下载,同时,可配置的能力非常强大,处理链都可以自己配置,或是重载自己的新方法。不足之处是只有网站的爬取下载功能,没有默认的更新调度策略,也不具备存储和检索方案。更像一个网站下载器。

原创粉丝点击