Nutch 的工作流程
Nutch 的工作流程可以分为两个大的部分:抓取部分与搜索部分。抓取程序抓取页面并把抓取回来的数据进行反向索引,搜索程序则对反向索引进行搜索回答用户的请求,索引是联系这两者的纽带。
I. create db
建立并初始化的 WebDB 。 webDB 用于存储的 URL 和页面内容。 webDB 包括 crawldb 和 linkdb 。 crawldb 就是 Page 通过描述网络上一个网页的特征信息来表征实际的网页,通过网页 URL 和网页内容的 MD5 两种索引方法对这种网页实体进行索引。 crawldb 存储了 nutch 所知道的所有所有页面的 url ,以及 url 是否爬过,什么时候爬过,重要度等信息。 linkdb 包括每个 url 页面中所有 link ,以及它们的“链接名”。
II. inject db 将初始的 URLs 存入 WebDB ( crawldb )数据库。
III. generate db segment
segment 是一个数据结构,是处理 nutch 爬虫处理的一个单元。每个 segment 包括“ fetchlist ”,用于保存尚未爬行的 URLs; “ fetch output ”保存已经爬行过的页面 ; “ index ”保存了保存页面的 Lucene 格式倒排索引。
这步的作用是根据已有的 URLs 建立新的 segment ,含有要爬行的页面,其他的部分都是空,等待爬行后再进行填写。
segment 实际上是一个文件夹,以产生的日期为文件夹名,其中包括了若干子文件夹。 crawl_generate 是待爬行的 URL 集合。 crawl_fetch 包括每个 URL 爬行的状态。 content 包括每个 url 的页面内容。 parse_text 包括每个 url 的文本内容。 parse_data 包括每个 url 的元数据和外向链接。 crawl_parse 包括了所有的外向链接,用来更新 crawldb 。
IV. fetch
fetch 根据segment中的fetchlist爬行url,之后会改写segment,填入爬行的内容。可以给fetcher指定URL爬行深度,使用的 thread数量等等。每个线程就是一个fetcher,对应一个fetchlist。指向同一个主机上Web资源的URLs通常被分配到同一个 Fetchlist中,防止过多的Fetchers对一个主机同时进行抓取造成主机负 担过重。另外Nutch遵守Robots Exclusion Protocol,网站可以通过自定义Robots.txt控制Crawler的抓取。fetch的处理过程是通过内部类FetchThread来运作 的,首先建立若干个FetchListEntry,再从中选出若干Entry进行处理。如果没有标记fetch,则对此url建立初始的一个准备,空的 FetcheOutput,parseText,ParseData等等。如果标记了fetch,则从ProtocolFactory和 ParserFactory中选出适当的protocol处理方法和内容parse方法进行下载和分析处理。
V.updatedb
当 fetch 结束后,可以使用此命令更新 crawldb 。进行下一轮的爬行。
Nutch 的扩展性
Nutch 可以通过添加插件的方式扩展。
nutch-default.xml 指定了 plugin 的目录和 URL 分析类,可以通过覆写 nutch-site.xml 文件来改变默认配置。
plugin 目录中包括若干子目录,比如 parse-html,protocl-http 等等。这些包括页面处理和协议处理的方式。 子目录中的 plugin.xml 和 **.jar 组成了一个插件。
我们也可以通过这种方式添加我们自己的协议处理方式和数据处理方法。
http://starwarriors2009.spaces.live.com/Blog/cns!955289B83D9457F7!154.entry