如果要深入學習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進行搜索了