admin 管理员组

文章数量: 1184232


2024年3月13日发(作者:伦勃朗光人物摄影)

Nutch主要分为两个部分:爬虫crawler和查询searcher。Crawler主要用于从网

络上抓取网页并为这些网页建立索引。Searcher主要利用这些索引检索用户的查

找关键词来产生查找结果。两者之间的接口是索引,所以除去索引部分,两者之

间的耦合度很低。

Crawler和Searcher两部分尽量分开的目的主要是为了使两部分可以分布式配置

在硬件平台上,例如将Crawler和Searcher分别放在两个主机上,这样可以提升

性能。

爬虫,Crawler:

Crawler的重点在两个方面,Crawler的工作流程和涉及的数据文件的格式和含

义。数据文件主要包括三类,分别是web database,一系列的segment加上index,

三者的物理文件分别存储在爬行结果目录下的db目录下webdb子文件夹内,

segments文件夹和index文件夹。那么三者分别存储的信息是什么呢?

Web database,也叫WebDB,其中存储的是爬虫所抓取网页之间的链接结构信息,

它只在爬虫Crawler工作中使用而和Searcher的工作没有任何关系。WebDB内

存储了两种实体的信息:page和link。Page实体通过描述网络上一个网页的特

征信息来表征一个实际的网页,因为网页有很多个需要描述,WebDB中通过网

页的URL和网页内容的MD5两种索引方法对这些网页实体进行了索引。Page

实体描述的网页特征主要包括网页内的link数目,抓取此网页的时间等相关抓取

信息,对此网页的重要度评分等。同样的,Link实体描述的是两个page实体之

间的链接关系。WebDB构成了一个所抓取网页的链接结构图,这个图中Page

实体是图的结点,而Link实体则代表图的边。

一次爬行会产生很多个segment,每个segment内存储的是爬虫Crawler在单独

一次抓取循环中抓到的网页以及这些网页的索引。Crawler爬行时会根据WebDB

中的link关系按照一定的爬行策略生成每次抓取循环所需的fetchlist,然后

Fetcher通过fetchlist中的URLs抓取这些网页并索引,然后将其存入segment。

Segment是有时限的,当这些网页被Crawler重新抓取后,先前抓取产生的segment

就作废了。在存储中。Segment文件夹是以产生时间命名的,方便我们删除作废

的segments以节省存储空间。

Index是Crawler抓取的所有网页的索引,它是通过对所有单个segment中的索引

进行合并处理所得的。Nutch利用Lucene技术进行索引,所以Lucene中对索引

进行操作的接口对Nutch中的index同样有效。但是需要注意的是,Lucene中的

segment和Nutch中的不同,Lucene中的segment是索引index的一部分,但是

Nutch中的segment只是WebDB中各个部分网页的内容和索引,最后通过其生

成的index跟这些segment已经毫无关系了。

Crawler工作流程:

在分析了Crawler工作中设计的文件之后,接下来我们研究一下Crawler的抓取

流程以及这些文件在抓取中扮演的角色。Crawler的工作原理主要是:首先

Crawler根据WebDB生成一个待抓取网页的URL集合叫做Fetchlist,接着下载

线程Fetcher开始根据Fetchlist将网页抓取回来,如果下载线程有很多个,那么

就生成很多个Fetchlist,也就是一个Fetcher对应一个Fetchlist。然后Crawler根

据抓取回来的网页WebDB进行更新,根据更新后的WebDB生成新的Fetchlist,

里面是未抓取的或者新发现的URLs,然后下一轮抓取循环重新开始。这个循环

过程可以叫做“产生/抓取/更新”循环。

指向同一个主机上Web资源的URLs通常被分配到同一个Fetchlist中,这样的

话防止过多的Fetchers对一个主机同时进行抓取造成主机负担过重。另外Nutch

遵守Robots Exclusion Protocol,网站可以通过自定义控制Crawler的

抓取。

在Nutch中,Crawler操作的实现是通过一系列子操作的实现来完成的。这些子

操作Nutch都提供了子命令行可以单独进行调用。下面就是这些子操作的功能描

述以及命令行,命令行在括号中。

1.

创建一个新的WebDb (

admin db -create

).

2.

将抓取起始URLs写入WebDB中 (

inject

).

3.

根据WebDB生成fetchlist并写入相应的segment(

generate

).

4.

根据fetchlist中的URL抓取网页 (

fetch

).

5.

根据抓取网页更新WebDb (

updatedb

).

6.

循环进行3-5步直至预先设定的抓取深度。

7.

根据WebDB得到的网页评分和links更新segments (

updatesegs

).

8.

对所抓取的网页进行索引(

index

).

9.

在索引中丢弃有重复内容的网页和重复的URLs (

dedup

).

10.

将segments中的索引进行合并生成用于检索的最终index(

merge

).

Crawler详细工作流程是:在创建一个WebDB之后(步骤1), “产生/抓取/更新”

循环(步骤3-6)根据一些种子URLs开始启动。当这个循环彻底结束,Crawler

根据抓取中生成的segments创建索引(步骤7-10)。在进行重复URLs清除(步

骤9)之前,每个segment的索引都是独立的(步骤8)。最终,各个独立的segment

索引被合并为一个最终的索引index(步骤10)。


本文标签: 网页 抓取 进行 工作 循环