by 黄文强
Nutch的工作流程
Nutch的工作流程可以分为两个大的部分:抓取部分与搜索部分。抓取程序抓取页面并把抓取回来的数据进行反向索引,搜索程序则对反向索引进行搜索回答用户的请求,索引是联系这两者的纽带。
以下说明具体流程:
I. create db
I.建立并初始化的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组成了一个插件。
我们也可以通过这种方式添加我们自己的协议处理方式和数据处理方法。