NUTCH研究系列4——剖析NUTCH爬虫3

下面我们来研究一下fetch操作,在爬虫中,抓取是最主要的操作。

Fetch命令net.nutch.fetcher.Fetcher

此命令的作用就是抓取网页,但是需要注意的是,抓取的单位不是单个的网页,而是同属于一个segment的网页集合。命令格式:

Fetcher [-logLevel level] [-showThreadID] [-threads n] dir

在进行fetch之前,我们已经生成了webdb,在其中初始化写入了URL,并且生成了segment留待写入抓取内容。我们首先看一下Fetcher类,然后运行一下看其效果。

net.nutch.fetcher.Fetcher类依靠下面几个类:

l         FetcherThread, an inner class

l         net.nutch.parse.ParserFactory

l         net.nutch.plugin.PluginRepository

l         and, of course, any "plugin" classes loaded by the PluginRepository

Fetcher类中的main()函数的功能主要是读取参数,实例化一个Fetcher对象,设置选项,然后调用run()函数。Fetcher类的构造函数很简单,它只是实例化了所有的输入输出流:

实例对象

参数

fetchList

ArrayFile.Reader

(dir, "fetchlist")

fetchWriter

ArrayFile.Writer

(dir, "fetcher", FetcherOutput.class)

contentWriter

ArrayFile.Writer

(dir, "content", Content.class)

parseTextWriter

ArrayFile.Writer

(dir, "parse_text", ParseText.class)

parseDataWriter

ArrayFile.Writer

(dir, "parse_data", ParseData.class)

Run()函数逐个的实例化抓取线程FetcherThread对象然后触发各个线程的start()函数在其共初始化threadCount个线程并等待线程结束后或者出现大的异常后此函数调用close()结束输入输出流。

FetcherThreadFetcher类的一个内部类它继承于java.lang.Thread它只有一个实体方法run()和三个静态函数handleFetch(), handleNoFetch(), and logError().

FetcherThread.run()实例化了一个新的FetchListEntry实例名叫”fle”,然后执行以下循环:

1.      如果出现错误,记录并退出循环

2.       FetchList中取得下一个URL集,如果取得结果为空,退出循环

3.       FetchListEntry解析出URL

4.       如果FetchListEntry没有被标记为”fetch”(未抓取此URL的网页),那么调用this.handleNoFetch()函数,设置status=1。然后逐步执行:

Ø         取得此URLMD5摘要

Ø         建立FetcherOutput(fle, hash, status)

Ø         建立空的ContentParseText ParseData对象

Ø         利用这些对象调用Fetcher.outputPage()函数

5.      如果标记为”fetch”(已抓取此URL的网页),调用ProtocolFactory并取得符合此URL的协议和内容对象。

6.       调用Call this.handleFetch(url, fle, content).然后逐步执行:

Ø         调用符合此内容类型的ParserFactory.getParser()

Ø         执行parser.getParse(content)

Ø         利用新建立的FetcherOutputURLMD5摘要,产生的内容对象和已解析的ParseText调用Fetcher.outputPage()函数

7.       循环100次,在log中记录

8.       扑捉各种小的异常以及记录写入log文件

我们可以看出,Fetcher利用Factory类来选择合适的code去处理不同的内容类型:ProtocolFactory()获取URL的协议类型, ParserFactory 根据文件类型进行合适的内容解析。

我们可以看出,如果我们想对nutch爬虫进行功能上的扩充,比方说增加可抓取的web资源类型,如PDF什么的,我们就可以通过对ProtocolFactoryParserFactory的扩充来进行实现。

posted @ 2006-07-08 14:57  kwklover  阅读(2499)  评论(0编辑  收藏  举报