如果要深入学习Nutch爬虫技术,仅仅会使用crawl命令是不够的,还需要对抓取的过程非常熟悉。本篇文章讲解分布抓取的详细步骤,这里需要用到上一教程中seed.txt所保存的URL信息,还需删除data/crawldb,data/linkdb和data/segments文件夹下的内容,因为我们要分步重新抓取数据。
上一教程[Nutch 1.10入门教程(四)——crawl命令](http://www.sanesee.com/article/step-by-step-nutch-crawl "Nutch 1.10入门教程(四)——crawl命令")这篇文章讲解了一站式抓取命令crawl的用法,然而,实际的抓取过程包含多个命令的,为了简化操作,crawl把多个命令组合到一起提供给用户使用的。如果要深入学习Nutch爬虫技术,仅仅会使用crawl命令是不够的,还需要对抓取的过程非常熟悉。本篇文章讲解分布抓取的详细步骤,这里需要用到上一教程中seed.txt所保存的URL信息,还需删除data/crawldb,data/linkdb和data/segments文件夹下的内容,因为我们要分步重新抓取数据。
## 1 Nutch数据文件夹组成
执行crawl命令之后,会在Nutch的runtime/local下面生成一个TestCrawl文件夹,里面包含三个文件夹:crawldb、linkdb和segments。
crawldb:它包含Nutch所发现的所有URL,它包含了URL是否被抓取、何时被抓取的信息。
linkdb:它包含了Nutch所发现的crawldb中的URL所对应的全部链接,以及源URL和锚文本。
segments:里面包含多个以时间命名的segment文件夹,每个segment就是一个抓取单元,包含一系列的URL,每个segment又包含如下文件夹:
~~~
crawl_generate:待抓取的URL
crawl_fetch:每个URL的抓取状态
content:从每个URL抓取到的原始内容
parse_text:从每个URL解析得到的文本
parse_data:从每个URL解析得到的外链和元数据
crawl_parse:包含外链URL,用来更新crawldb
~~~
## 2 将URL列表注入到crawldb中
~~~
bin/nutch inject data/crawldb urls
~~~
## 3 抓取
### 3.1 生成抓取列表
为了抓取指定URL的页面,我们需要先从数据库(crawldb)里生成一个抓取列表:
~~~
bin/nutch generate data/crawldb data/segments
~~~
generate命令执行之后,会生成一个待抓取页面的列表,抓取列表存放在一个新建的segment路径中。segment的文件夹根据创建的时间进行命名(本教程文件夹名为201507151245)。
generate还有很多可选参数,读者可以通过以下命令自行查看(其它命令的查看方法也一样):
~~~
bin/nutch generate
~~~
### 3.2 开始抓取
根据generate生成的抓取列表抓取网页:
~~~
bin/nutch fetch data/segments/201507151245 #这里的201507151245为文件夹名,需要根据自己的情况进行更改,或者直接采用data/segments文件夹,这样的操作对segments文件夹下的所有子文件夹生效,后文同理。
~~~
### 3.3 解析
~~~
bin/nutch parse data/segments/201507151245
~~~
### 3.4 更新数据库
根据抓取的结果更新数据库:
~~~
bin/nutch updated data/crawldb –dir data/segments/201507151245
~~~
现在,数据库里包含所有初始页面更新后的入口,以及从初始集合中新发现的页面的新入口。
### 3.5 反转链接
在建立索引之前,我们首先对所有的链接进行反转,这样我们才可以对页面的来源锚文本进行索引。
~~~
bin/nutch invertlinks data/linkdb –dir data/segments/201507151245
~~~
### 3.6 将抓取到的数据加入Solr索引
如果还没有安装Apache Solr,请参考[Nutch 1.10入门教程(三)——Solr安装与配置](http://www.sanesee.com/article/step-by-step-nutch-solr-settings "Nutch 1.10入门教程(三)——Solr安装与配置")安装好Solr服务器,并启动。
现在,我们对抓取到的资源建立索引:
~~~
bin/nutch index data/crawldb -linkdb data/linkdb -params solr.server.url=http://192.168.1.11:8983/solr -dir data/segments/201507151245
~~~
### 3.7 去除重复URL
一旦建立了全文索引,它必须处理重复的URL,使得URL是唯一的:
~~~
bin/nutch dedup
~~~
这个命令基于签名查找重复的URL,对重复的URL标记为STATUS_DB_DUPLICATE,Cleaning和Indexing任务将会根据标记删除它们。
### 3.8 清理
~~~
bin/nutch clean –D solr.server.url=http://192.168.1.11:8983/solr data/crawldb
~~~
从solr移除HTTP301、404以及重复的文档。
到此为止,我们使用分步抓取的方式完成了所有抓取步骤,正常抓取的情况下,可以在http://192.168.1.11:8983/solr进行搜索了