通用爬虫框架及heritrix爬虫介绍

时间:2024-03-27 13:05:45

第1部分 通用爬虫

1.1 通用爬虫框架介绍

 

1-1描述了通用的爬虫框架,其基本上包括了一个爬虫系统所需要的所有模块。任何一个爬虫系统的设计图,会发现都有一个环路,这个环代表着爬虫大致的工作流程:根据url将对应的网页下载下来,然后提取出网页中包含的url,再根据这些新的URL下载对应的网页,周而复始。爬虫系统的子模块都位于这个环路中,并完成某项特定的功能。

 

通用爬虫框架及heritrix爬虫介绍
 

1- 1 通用爬虫框架描述图

1.1.1DNS Resolver和fetcher

这两个模块是两个非常简单的独立的服务:DNS Resolver负责域名的解析;Fetcher的输入是域名解析后的url,返回的则是该url对应的网页内容。对于任何一次网页的抓取,它都需要调用这两个模块。

对一般的爬虫,两个模块可以做得非常的简单,甚至合并到一起。但是对于性能要求很高的系统,它们可能成为潜在的性能瓶颈。主要原因是无论是域名解析还是抓取,都是很耗时的工作。比如抓取网页,一般的延迟都在一百毫秒级别,如果遇上慢的网站,可能要几秒甚至十几秒,这导致工作线程会长时间的处于阻塞等待的状态。如果希望Fetcher能够达到每秒几千个网页甚至更高的下载,就需要启动大量的工作线程。因此,对于性能要求高的爬虫系统,一般会采用epoll或者类似的技术将两个模块改成异步机制。另外,对于DNS的解析结果也会缓存下来,大大降低了DNS解析的操作。

1.1.2Content Seen

Internet上的一些站点常常存在着镜像网站(mirror),即两个网站的内容一样但网页对应的域名不同。这样会导致对同一份网页爬虫重复抓取多次。为了避免这种情况,对于每一份抓取到的网页,它首先需要进入Content Seen模块。该模块会判断网页的内容是否和已下载过的某个网页的内容一致如果一致则该网页不会再被送去进行下一步的处理。这样的做法能够显著的降低爬虫需要下载的网页数。至于如果判断两个网页的内容是否一致,一般的思路是这样的:并不会去直接比较两个网页的内容,而是将网页的内容经过计算生成FingerPrint(指纹),通常FingerPrint是一个固定长度的字符串,要比网页的正文短很多。如果两个网页的FingerPrint一样,则认为它们内容完全相同。

1.1.3ExtractorUrl Filter

Extractor的工作是从下载的网页中将它包含的所有URL提取出来。这是个细致的工作,你需要考虑到所有可能的url的样式,比如网页中常常会包含相对路径的url,提取的时候需要将它转换成绝对路径。

Url Filter则是对提取出来的URL再进行一次筛选。不同的应用筛选的标准是不一样的,比如对于baidu/google的搜索,一般不进行筛选,但是对于垂直搜索或者定向抓取的应用,那么它可能只需要满足某个条件的url,比如不需要图片的url,比如只需要某个特定网站的url等等。Url Filter是一个和应用密切相关的模块。

1.1.4Url Seen

Url Seen用来做url去重。对于一个大的爬虫系统,它可能已经有百亿或者千亿的url,新来一个url如何能快速的判断url是否已经出现过非常关键。因为大的爬虫系统可能一秒钟就会下载几千个网页,一个网页一般能够抽取出几十个url,而每个url都需要执行去重操作,可想每秒需要执行大量的去重操作。因此Url Seen是整个爬虫系统中非常有技术含量的一个部分。

1.1.5 Url Set

url经过前面的一系列处理后就会被放入到Url Set中等待被调度抓取。因为url的数量很大,所以只有一小部分可能被放在内存中,而大部分则会写入到硬盘。一般Url Set的实现就是一些文件或者是数据库。

1.1.6URL Frontier

Frontier是整个爬虫系统的引擎和驱动,组织和调用其它的模块。当爬虫启动的时候,Froniter内部会有一些种子url,它先将种子url送入Fetcher进行抓取,然后将抓取下来的网页送入Extractor 提取新的url,再将新的url去重后放入到Url Set中;而当Froniter内部的url都已经抓取完毕后,它又从Url Set中提取那些新的没有被抓取过的url,周而复始。

第2部分 Heritrix开源爬虫介绍

通用的爬虫技术目前已经比较成熟,存在较多的开源爬虫框架,本调研报告主要对HeritrixNutch两个比较成熟的java开源爬虫框架进行介绍。

  2.1 Heritrix

Heritrix 是个“Archival Crawler”——来获取完整的、精确的、站点内容的深度复制。包括获取图像以及其他非文本内容。抓取并存储相关的内容。对内容来者不拒,不对页面进行内容上的修改。重新爬行对相同的URL不针对先前的进行替换。爬虫主要通过Web用户界面启动、监控和调整,允许弹性的定义要获取的url


通用爬虫框架及heritrix爬虫介绍
 

 

2- 1 Heritrix系统框架图

Web Administrative Console:一个基于web的控制台。

CrawlOrder一个crawl任务的配置。它是一个基XML的对象,Heritrix根据CrawlOrder中的配置,选择合适的模块来组装这次抓取任务的程序。其中,同时它还包括了其他的一些重要的配置信息,例如抓取任务的seeds文件,进行抓取url的范围等

CrawlController:抓取的核心程序,它读取CrawlOrder来配置内部的模块和参数,同时负责初始化所有的子模块;Web Console也是和它做交互来控制爬虫。

Frontier:它其实就是一个调度器,它内部有一个url队列,保存着需要去抓取的url。同时,从网页中提取到的 url也会送给Frontier所以,Frontier还有一个功能,对提取后的url进行去重。最后Froniter进行调度,决定哪个url将被 抓取,然后将这个url放入ToeThreads中;

ToeThreads:这组线程是真正的工作线程,它们完成url的抓取以及一系列的后续工作,如图2-1所示,主要包括:

1Pre-fetch Processing: 在抓取前的一些处理;

2Fetch Processing: 抓取url对应的网页;

3Extractor Processing: 抽取网页中的url,分析网页的信息。

4Write/Index Processing: 将网页保存下来,或者写入某个搜索引擎;

5Post Processing: 后处理;

每一个从Frontier中调度出来的url都需要经历这些步骤。所以,在爬虫的运行过程中,Frontier和这些Processing Chain构成了一个环Frontier将需要处理的url放入Processor Chain中,从Processor Chain中提取出的新的url再被放入Frontier


通用爬虫框架及heritrix爬虫介绍
 

2- 2 heritrix处理一个url的流程