1 Heritrix整体构架
2 主要的组件以及其作用
3 Heritrix的文件结构分析
4 一些背景知识储备
1 系统总体构架图
Heritrix采用了模块化的设计,它由一些核心类(core classes)和可插件模块(pluggable modules)构成。核心类可以配置,但不能被覆盖,插件模块可以被由第三方模块取代。
如图所示,主要组件如下:
- CrawlController(下载控制器)
整个下载过程的总的控制者,整个抓取工作的起点,决定整个抓取任务的开始和结束。从Frontier获取URI,传递给线程池(ToePool)中的ToeThread处理。 - Frointier(边界控制器)
主要确定下一个将被处理的URI,负责访问的均衡处理,避免对某一web服务器造成太大的压力。
它保存着crawl的状态:
(1)发现的URI(URIs have been discovered)
(2)正在被处理的URI(URIs are being processed (fetched))
(3)已经处理的URI(URIs have been processed) - Processor(处理器)
许多Processor组成一个处理链(processor chains)中,每一个处理链对URI进行一系列的处理。组成了Heritrix的整个处理器链。
(1)Pre-fetch processing chain(预处理链)
主要根据robot协议,DNS以及下载范围控制信息判断当前URI是否应当处理。
(2)Fetch processing chain(抓取处理链)
从远程服务器获取数据
(3) Extractor processing chain(抽取处理链)
从网页中抽取新的URI
(4)Write/index processing chain(写处理链)
负责把数据写入本地磁盘
(5)Post-processing chain(后置处理链)
由CrawlStateUpdater,LinksScoper,FrontierScheduler构成。
2 主要的组件以及其作用
2.1 两个重要的组件
1 CrawlScope:配置当前应该在什么范围内抓取网页链接。
2 Frontier:是一个URL的处理器,它将决定下一个被处理的URL是什么。同时,它还会将经由处理链所解析出来的URL加入到等待处理的队列中去。
除了以上的两个组件外,还有5个队列要配,这5个队列依据先后的顺序,就依次组成了Heritrix的整个处理器链。5个队列的含义分别如下。
(1)PreProcessor:这个队列中,所有的处理器都是用来对抓取时的一些先决条件做判断的。比如判断robot.txt,它是整个处理器链的入口。
(2)Fetcher:它用于解析网络传输协议,比如解析DNS、HTTP或FTP等。
(3)Extractor:它主要用于解析当前获取到的服务器返回内容,这些内容通常都是以字符串形式缓存的。在这个队列中,包括一系列的工具,如解析HTML、CSS等。解析完毕之后,取出页面中的URL后,将它们放入到队列中,等待下一次继续抓取。
(4)Writer:主要用于将所抓取到的信息写入磁盘。通常写入磁盘时有两种形式,一种是采用压缩的方式写入,这里被称为Arc方式,另一种是采用镜像方式写入。
(5)PostProcessor:在整个抓取解析过程结束中,进行一些扫尾工作,比如将Extractor解析出来的URL有条件的加入到待处理队列中去。
2.2 可互换的组件
Heritrix是一个爬虫框架,可加如入一些可互换的组件。
它的执行是递归进行的,主要有以下几步:
1、在预定的URI中选择一个。
2、获取URI
3、分析,归档结果
4 、选择已经发现的感兴趣的URI。加入预定队列
5 、标记已经处理过的URI
2.3 Heritrix主要有三大部件:范围部件,边界部件,处理器链
- 范围部件:主要按照规则决定将哪个URI入队。
- 边界部件:跟踪哪个预定的URI将被收集,和已经被收集的URI,选择下一个 URI,剔除已经处理过的URI。
- 处理器链:包含若干处理器获取URI,分析结果,将它们传回给边界部件。
2.4 Heritrix 1.0.0包含以下关键特性:
- 高度可扩展性
Heritrix抓取个URL分为8个处理器分工合作完成,每个处理器都可在order.xml中配置,所以使用者可以自己扩展并使用他们,只要继承相关的父类即可。但因为这个也加重了它的复杂和繁琐。 - 性能优秀
(1) Heritrix对抓取过的Host都会相应的保存,并放在内存中,如果再次从这个Host中抓取数据就可以避免很多重复性的东西。
(2)可以发现运行Heritrix占用的资源很少,跑一个月也是如此。只因Heritrix在运算和IO操作上都控制得很好。而且这些操作都可以配置,比如下载URL将它写到本机每个线程最多占用多少内存。 - 对抓取的高度控制性
(1)严格遵守爬虫协议,用户可以针对不同的Host配置不同的爬虫策略。
(2)可以高度控制抓取速度、抓取规模、抓取时间等,甚至对不同的Host都可以不同的控制。
(3)可以控制爬虫无节制的抓取某一个Host。很多服务器肯定无法承受爬虫无节制的抓取,所以我们得需要在爬虫上做一些控制,而Heritrix在这一方面做好。不仅可以通过控制抓取速度来控制,还可以控制对某一个Host的抓取速度。 - 功能齐全
(1)有数据库这样的checkpoint,可以定时备份数据。
(2)很好的日志结构,可以使得它在某一次抓取之上继续抓取,而避免了重复抓取的重复劳动。
(3)很好的Web界面管理功能,并可以动态的获知抓取情况,如抓取速度,下载字节数。 - 用单个爬虫在多个独立的站点一直不断的进行递归的爬。
- 包含一些可设置的过滤机制,表达方式,URI路径深度选择等等。
2.5 Heritrix的局限:
- Heritrix适合互联网抓取,也就是抓取多个网站并整站复制。而对于垂直抓取,自身没有这样的机制,因为垂直抓取需要定时定点抓取数据,而Heritrix一旦抓取完毕就停止。而且自身的代码也不适合垂直抓取,重复劳动太多。比如对URL的过滤,基本上8个处理器每个都需要过滤。而垂直抓取都是针对性的抽取URL,自然抽取到的URL是用户想要的URL,无需过滤。
- Heritrix对中文支持不够,比如URL中有中文的URL肯定抽取不到,但这个改动部分代码页就是它的正则表达式即可。
- Heritrix使用多线程进行抓取,但抓取一段时间后会发现线程越来越少。因为Heritrix用调度中心管理要抓取的URL,将他们放入BDB数据库中。比如当BDB数据库中有10个URL而抓取的线程有25个的时候,那10个URL只能分配给10个线程抓取,另外15个线程会由于没有URL可抓取可死掉。
- 很多人抓取一段时间后会发现Heritrix会莫名其妙的停掉,或者运行30个DNS就停止,而重新运行之后又好好的。首先Heritrix的停止是在没有活动状态的线程之后停止,而线程的死掉会因为上面一点。所以当发生网络问题时而导致网页内容无法获取时就会发生这种问题,因为无法获取网页内容就意味着抽取不到新的URL。Heritrix封装了HttpClient去获取网页内容。
- Heritrix没有很好的容错性以及回复机制。
3 Heritrix的文件结构分析
每通过Heritrix运行一次抓取后,发现在该Job目录下就会有很多文件。这里说明下每个文件的作用,同时更主要介绍它的日志文件,因为我们可以通过日志文件发现Heritrix的抓取情况。
以上就是Heritrix完成的文件结构,现在一一说明
文件名 | 说明 |
---|---|
order.xml | Heritrix运行的所有配置,一个order.xml就代表一个抓取任务 |
seeds.txt | 种子文件,Heritrix从里面的URL开始抓取 |
state | Heritrix采用BDB去保存URL,这个目录就是bdb目录 |
scratch | 保存网页内容,每一个URL网页内容都对应一对ris和ros文件 |
logs | 保存了Heritrix抓取时的日志,会这种介绍。可以从这些日志文件挖掘抓取情况 |
checkpoints | 等同于数据库的checkpoint,Heritrix可以设置定时,然后定时备份其所有文件,也就是这里介绍的所有文件。同时在做这个操作的时候Heritrix暂停所有抓取 |
seeds-report.txt | 种子抓取汇报,主要针对seeds.txt里的种子URL做个说明 |
responsecode-report.txt | 抓取URL的服务器响应代码以及该代码的URL个数 |
processors-report.txt | 每个处理器的抓取报告 |
mimetype-report.txt | 网页类型抓取汇报 |
crawl-report.txt | 抓取汇报 |
4 背景知识储备
4.1 DNS(domain name system)
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
每个IP地址都可以有一个主机名,主机名由一个或多个字符串组成,字符串之间用小数点隔开。有了主机名,就不要死记硬背每台IP设备的IP地址,只要记住相对直观有意义的主机名就行了。这就是DNS协议所要完成的功能。
4.2 Host
Host是提高DNS对于IP的解析效率的。
4.3 URI----URL
Web 上每种可用的资源,如 HTML 文档、图像、视频片段、程序等都由一个通用资源标志符(Universal Resource Identifier , URI)进行定位。
URI 通常由三部分组成:
- 访问资源的命名机制;
- 存放资源的主机名;
- 资源自身的名称,由路径表示。
URL 是 URI 的一个子集。它是 Uniform Resource Locator 的缩写,译为“统一资源定位 符”。通俗地说,URL 是 Internet 上描述信息资源的字符串,主要用在各种 WWW 客户程 序和服务器程序上,特别是著名的 Mosaic。采用 URL 可以用一种统一的格式来描述各种信 息资源,包括文件、服务器的地址和目录等。
URL 的格式由三部分组成:
- 协议(或称为服务方式)。
- 存有该资源的主机 IP 地址(有时也包括端口号)。
- 主机资源的具体地址,如目录和文件名等。
4.4 Heritrix爬虫当前研究方向
- 通过对于各个部分的合理控制,优化爬虫的速度
- 解决爬取不稳定的问题
- 增量爬取
- 通过配置进行多站爬取和清洗
- 区域化爬取
- 模拟登录
- 抓取移动端的信息
4.5 主题爬虫
只抓取某个主题相关的爬虫。
通常的解决方式:
1、通过行业搜索,抓取某个行业相关的信息,即定点抓取。一般适合小型的行业搜索引擎。
2、根据得到的网页内容,判断网页的内容和主题是否相关。判断方法:
(1)在网页的标题、正文和超链接中,通常会有与主题相关的关键词。在面向主题的搜索中,这种词叫做导向词,给每一个导向词权重,就能够优先访问和主题相关的URL。导向词的设置权重的方式有两种,一种是管理员的经验手工设置;第二种是特征提取,给定和主题相关的网页集合,有程序抽取出网页中共同的特征,把这些词作为导向词。
3、针对网页链接进行评分,常用的有PageRank算法。
4、链接描述文本分析。每一个超链接都有一个描述文本(Anchor Text),这个文本反映了该网页与该链接所至网页之间的重要关系。
4.6 限定爬虫
限定爬虫就是对爬虫所爬的主机范围做一些限制,通常,限定爬虫包含一下几个方面:
(1)限定域名的爬虫。比如,只抓取edu.cn结尾的域名。
(2)限定爬取层数的爬虫。比如限定只爬取2层的数据。
(3)限定IP的抓取。比如,只抓取国内的IP。
(4)限定语言的抓取。比如只抓取中文页面。
参考链接
http://www.iteye.com/blogs/subjects/guoyunsky?page=2
END