NUTCH研究系列2——剖析NUTCH爬虫
牛顿先生告诉我们,如果想看的远,那就得站到巨人的肩膀上。所以,在自己动手之前,前辈们的研究成果不能不先看看。在网上搜索并整理了一下,发现关于NUTCH的中文学习资料或者说是心得真的不多,其中大部分还都是关注于怎么安装配置上面,稍微深入一点的东西就只能看英文的了。看英文对于大家来说当然难度也不是很大,但是比起中文来终究是有点费时费力。所以我在学习NUTCH的过程中顺手整理了一些看过的资料,一是给自己留点备注,二是拿出来和大家讨论学习。中间出于水平原因,难免有什么纰漏,欢迎大家批评指正。J
剖析NUTCH爬虫——原文出处:Dissecting The Nutch Crawler
1. 简介
开源项目NUTCH搜索引擎大致包括三个部分:
(1) 爬虫:寻找并抓取网页
(2) 网页库:存储已知URL和已抓取网页的数据库
(3) 索引器:解析网页并按照主题字典建立索引
2. NUTCH命令脚本
NUTCH使用多个"bin/nutch"命令脚本进行操作,其中每个脚本命令与一个java类相对应。
对于局域内网页的抓取,你需要首先编写几个配置文件,例如urls.txt和crawl-urlfilter.txt。然后利用"bin/nutch crawl ..."命令进行抓取。这个命令与程序中的net.nutch.tools.CrawlTool类相对应。
对于整个网络网页的抓取,你需要利用下面的命令逐步进行:
$ bin/nutch admin db -create
$ bin/nutch inject db ...
$ bin/nutch generate db segments
$ bin/nutch fetch ...
$ bin/nutch updatedb ...
$ bin/nutch analyze ...
每个命令对应的java类如下所示:
· admin: net.nutch.tools.WebDBAdminTool
· inject: net.nutch.db.WebDBInjector
· generate: net.nutch.tools.FetchListTool
· fetch: net.nutch.fetcher.Fetcher
· updatedb: net.nutch.tools.UpdateDatabaseTool
· analyze: net.nutch.tools.LinkAnalysisTool
可以发现,这些命令利用的是这些java类的类名或者类名简写,举例来说,下面两个命令的含义就是相同的。
$ bin/nutch admin db -create
$ bin/nutch net.nutch.tools.WebDBAdminTool db -create
下面我们可以通过对这些类的分析来了解NUTCH爬虫的工作机制。
3.CRAWL命令:net.nutch.tools.CrawlTool类
CrawlTool类的作用很好理解,它就是将爬行整个网络的一系列命令操作综合在一起并加以限制条件实现了局域性网络的爬行。它主要包括了两个静态函数和一个main函数。下面是操作细节:
操 作: 对应的函数:
- start logger: LogFormatter.getLogger(...)
(生成日志文件)
- load "crawl-tool.xml" config file: NutchConf.addConfResource(...)
(加载配置文件)
- read arguments from command-line
(读取命令行参数,如爬行深度等)
- create a new web db: WebDBAdminTool.main(...)
(生成一个新网页库)
- add rootURLs into the db: WebDBInjector.main(...)
(将种子URL写入网页库)
- for 1 to depth (=5 by default):
- generate a new segment: FetchListTool.main(...)
- fetch the segment: Fetcher.main(...)
- update the db: UpdateDatabaseTool.main(...)
(爬行网页并更新网页库)
- comment:
"Re-fetch everything to get complete set of incoming anchor texts"
- delete all old segment data: FileUtil.fullyDelete(...)
- make a single segment with all pages:FetchListTool.main(...)
- re-fetch everything: Fetcher.main(...)
(根据网页锚文本爬行链接网页)
- index: IndexSegment.main(...)
(索引)
- dedup: DeleteDuplicates.main(...)
(删除备份)
- merge: IndexMerger.main(...)
(合并索引)
将以上各步还原为NUTCH命令脚本你就会发现,其实它和爬行整个网络所进行的操作是一码事。
- (start logger, etc)
- bin/nutch admin db -create
- bin/nutch inject db ...
- (for 1 to depth:)
- bin/nutch generate ...
- bin/nutch fetch ...
- bin/nutch updatedb ...
- (call net.nutch.FileUtil.fullyDelete(...))
- bin/nutch generate ...
- bin/nutch index ...
- bin/nutch dedup ...
- bin/nutch merge ...
如果我们想在自己的程序中使用爬虫功能,那么我们可以将这个类拷贝到我们自己程序中需要的地方,然后通过"bin/nutch"调用这个类的命令来爬行网络。但是,因为实际的爬行抓取功能主要是在Fetcher.main()中实现的,只通过这个类我们并没有进行什么实质的自定义爬行,而只是调用了NUTCH已有的爬行功能。(未完待续)