1、Nutch命令詳解
Nutch采用了一種命令的方式進行工作,其命令可以是對局域網方式的單一命令也可以是對整個Web進行爬取的分步命令。
要看Nutch的命令說明,可執行"Nutch"命令。
下面是單個命令的說明:
-
crawl
crawl是"org.apache.nutch.crawl.Crawl"的別稱,它是一個完整的爬取和索引過程命令。
使用方法:
Shell代碼
bin/nutch crawl <urlDir> [-dir d] [-threads n] [-depth i] [-topN]
參數說明:
<urlDir>:包括URL列表的文本文件,它是一個已存在的文件夾。
[-dir <d>]:Nutch保存爬取記錄的工作目錄,默認情況下值為:./crawl-[date],其中[date]為當前目期。
[-threads <n>]:Fetcher線程數,覆蓋默認配置文件中的fetcher.threads.fetch值(默認為10)。
[-depth <i>]:Nutch爬蟲迭代的深度,默認值為5。
[-topN <num>]:限制每一次迭代中的前N條記錄,默認值為 Integer.MAX_VALUE。
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
crawl-tool.xml
其他文件:
crawl-urlfilter.txt
-
readdb
readdb命令是"org.apache.nutch.crawl.CrawlDbReader"的別稱,返回或者導出Crawl數據庫(crawldb)中的信息。
使用方法:
Shell代碼
bin/nutch readdb <crawldb> (-stats | -dump <out_dir> | -url <url>)
參數說明:
<crawldb>:crawldb目錄
[-stats]:在控制台打印所有的統計信息
[-dump <out_dir>]:導出crawldb信息到指定文件夾中的文件
[-url <url>]:打印指定URL的統計信息
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
示例:
Shell代碼
$ bin/nutch readdb fullindex/crawldb -stats
CrawlDb statistics start: fullindex/crawldb
Statistics for CrawlDb: fullindex/crawldb
TOTAL urls: 468030
retry 0: 467361
retry 1: 622
retry 2: 32
retry 3: 15
min score: 0.0
avg score: 0.0034686408
max score: 61.401
status 1 (db_unfetched): 312748
status 2 (db_fetched): 80671
status 3 (db_gone): 69927
status 4 (db_redir_temp): 1497
status 5 (db_redir_perm): 3187
CrawlDb statistics: done
備注:
-stats命令是一個快速查看爬取信息的很有用的工作,其輸出信息表示了:
db_unfetched:鏈接到已爬取頁面但還沒有被爬取的頁面數(原因是它們沒有通過url過濾器的過濾,或者包括在了TopN之外被Nutch丟棄)。
db_gone:表示發生了404錯誤或者其他一些臆測的錯誤,這種狀態阻止了對其以后的爬取工作。
db_fetched:表示已爬取和索引的頁面,如果其值為0,那肯定出錯了。
-
readlinkdb
readlinkdb是"org.apache.nutch.crawl.LinkDbReader"的別稱,導出鏈接庫中信息或者返回其中一個URL信息。
使用方法:
Shell代碼
Bin/nutch readlinkdb <linkdb> (-dump <out_dir> | -url <url>)
參數說明:
<linkdb>:linkdb工作目錄
[-dump <out_dir>]:導出信息到文件夾下
[-url <url>]:打印某個URL的統計信息
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
示例:
Shell代碼
$ bin/nutch readlinkdb fullindex/linkdb -url www.hebut.edu.cn - no link information
-
inject
inject是"org.apache.nutch.crawl.Injector"的別稱,注入新URL到crawldb中。
使用方法:
Shell代碼
bin/nutch injector <crawldb> <urldir>
參數說明:
<crawldb>:crawldb文件夾
<urldir>:保存有URL的文件的文件夾目錄
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
以下配置文件參數影響到了注入方式:
db.default.fetch.interval:按天設置爬取間隔,默認值30.0f。
db.score.injected:設置URL的默認打分,默認值1.0f。
urlnormalizer.class:規范化URL的類,默認值為org.apache.nutch.net.BasicUrlNormalizer。
-
generate
generate是"org.apache.nutch.crawl.Generator",從Crawldb中抓取新的Segment。
使用方法:
Shell代碼
bin/nutch generator <crawldb> <segments_dir> [-topN <num>] [-numFetchers <fetchers>] [-adddays <days>]
參數說明:
<crawldb>:crawldb目錄
<segments_dir>:新建的爬取Segment目錄
[-topN <num>]:選取前多少個鏈接,默認值為Long.MAX_VALUE
[-numFetchers <fetchers>]:抓取分區數量。默認Configuration keyà mapred.map.tasks à1
[-adddays <days>]:添加 <days>到當前時間,配置crawling urls ,以將很快被爬取db.default.fetch.interval默認值為0。爬取結束時間在當前時間以前的。
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
示例:
Shell代碼
bin/nutch generate /my/crawldb /my/segments -topN 100 -adddays 20
備注:
generate.max.per.host:設置單個主機最大的URL數量,默認情況下為unlimited。
-
fetch
fetch是"org.apache.nutch.fetcher.Fetcher"的代稱,它負責一個segment的爬取。
使用方法:
Shell代碼
bin/nutch fetch <segment> [-threads <n>] [-noParsing]
參數說明:
<segment>:segment目錄
[-threads <n>]:運行的fetcher線程數默認值 Configuration Key àfetcher.threads.fetch à10
[-noParsing]:禁用自動解析segment數據
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
備注:
Fetcher依賴於多個插件以爬取不同的協議,目前已有的協議及支撐插件如下:
http:
protocol-http
protocol-httpclient
https:
protocol-httpclient
ftp:
protocol-ftp
file:
protocol-file
當爬取網上文檔的時候,不應該使用protocol-file,因為它是用於爬取本地文件的。如果你想爬取http、https,應當使用protocol-httpclient。
-
parse
parse是"org.apache.nutch.parse.ParseSegment"的代稱,它對一個segment運行ParseSegment。
使用方法:
Shell代碼
bin/nutch parse <segment>
參數說明:
<segment>:Segment文件夾
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
備注:
它依賴於多個插件來解析不同格式的內容,支持的格式及插件有:
內容格式 |
插件 |
備注 |
text/html |
parse-html |
使用NekoHTML 或者TagSoup解析HTML |
application/x-javascript |
parse-js |
解析JavaScript 文檔(.js) |
audio/mpeg |
parse-mp3 |
解析MP3 Audio文檔(.mp3) |
application/vnd.ms-excel |
parse-msexcel |
解析MSExcel文檔(.xls) |
application/vnd.ms-powerpoint |
parse-mspowerpoint |
解析MSPower!Point 文檔 |
application/msword |
parse-msword |
解析MSWord文檔 |
application/rss+xml |
parse-rss |
解析RSS文檔(.rss) |
application/rtf |
parse-rtf |
解析RTF文檔(.rtf) |
application/pdf |
parse-pdf |
解析PDF文檔 |
application/x-shockwave-flash |
parse-swf |
解析Flash 文檔(.swf) |
text-plain |
parse-text |
解析Text文檔(.txt) |
application/zip |
parse-zip |
解析Zip文檔(.zip) |
other types |
parse-ext |
通過基於content-type或者路徑前綴的外部命令來解析文檔 |
默認情況下只有txt、HTML、JS格式的插件可用,其他的需要在nutch-site.xml中配置使用。
-
readseg
readseg是"org.apache.nutch.segment.SegmentReader"的代稱,它讀取並導出Segment數據。
使用方法:
Shell代碼
bin/nutch readseg <segment>
參數說明:
<segment>:Segment文件夾
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
備注:
在Nutch0.9前的版本為了segread。
-
updatedb
updatedb是"org.apache.nutch.crawl.CrawlDb"的代稱,用fetch過程中獲取的信息更新crawldb。
使用方法:
Shell代碼
bin/nutch updatedb <crawldb> <segment> [-noadditions]
參數說明:
<crawldb>:crawldb目錄
<segment>:已經爬取的segment目錄
[-noadditions]:是否添加新的鏈接到crawldb中
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
-
invertlinks
invertlinks是"org.apache.nutch.crawl.LinkDb"的代稱,它用從segment中獲取到的信息更新linkdb。
使用方法:
Shell代碼
bin/nutch invertlinks <linkdb> (-dir segmentsDir | segment1 segment2 ...)
參數說明:
<linkdb>:linkdb目錄
<segment>:segment目錄,可以指定至少一個的文件夾
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
-
index
index是"org.apache.nutch.indexer.Indexer"的代稱,創建一個segment的索引,利用crawldb和linkdb中的數據對索引中的頁面打分。
使用方法:
Shell代碼
bin/nutch index <index> <crawldb> <linkdb> <segment> ...
參數說明:
<index>:索引創建后的保存目錄
<crawldb>:crawldb目錄
<linkdb>:linkdb目錄
<segment>:segment目錄,可以指定多個
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
-
merge
merge是"org.apache.nutch.indexer.IndexMerger"的代稱,它合並多個segment索引。
使用方法:
bin/nutch merge [-workingdir <workingdir>] <outputIndex> <indexesDir> ...
參數說明:
[-workingdir <workingdir>]:提定工作目錄
<outputIndex>:合並后的索引存儲目錄
<indexesDir>:包含待合並的索引目錄,可以指定多個
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
-
mergedb
mergedb是"org.apache.nutch.crawl.CrawlDbMerger"的代稱,合並多個CrawlDb,URLFilter可選擇性地過濾指定內容。
可以合並多個DB到一個中。當你分別運行爬蟲並希望最終合並DB時,它會相當有用。可選擇地,可以運行當前URLFilter過濾數據庫中的URL,以濾去不需要的URL。當只有一個DB時也很有用,它意味着你可以通過這個工作去濾掉那些DB中你不想要的URL。
只用這個工具來過濾也是可能的,在這種情況下,只指定一個crawldb。
如果同一個URL包括在多個CrawlDb中,只有最近版本的才會被保留,即由org.apache.nutch.crawl.CrawlDatum.getFetchTime()值決定的。然而,所有版本的元數據被聚合起來,新的值代替先前的值。
使用方法:
bin/nutch mergedb output_crawldb crawldb1 [crawldb2 crawldb3 ...] [-filter]
參數說明:
output_crawldb:CrawlDb輸出文件夾
crawldb1 [crawldb2 crawldb3 ...]:一個或者多個CrawlDb(s)
-filter:采用的URLFilters
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
-
mergelinkdb
mergelinkdb是"org.apache.nutch.crawl.LinkDbMerger"的代稱,用於合並多個linkdb,可以選擇性的使用URLFilter來過濾指定內容。
當分別從多個segment群中分布式建立LinkDb而又需要合並為一個時很有用。或者,也可以指定單個LinkDb,只是用它來過濾URL。
只用這個工具來過濾也是可能的,在這種情況下,只指定一個LinkDb。
如果一個URL包含在多個LinkDb中,所有的內部鏈接被聚合,但是最多db.max.inlinks 指定的內鏈數會添加進來。 如果被激活,URLFilter可以應用到所有的目標URL及其內鏈中。如果目標鏈接被禁止,所有的該目標鏈接的內鏈將和目標鏈接一起被移去。如果某些內鏈被禁止,那么只有他們會被移去,在校驗上面提到的最大限制數時他們不會被計算在內。
使用方法:
bin/nutch mergelinkdb output_linkdb linkdb1 [linkdb2 linkdb3 ...] [-filter]
參數說明:
output_linkdb:輸出linkdb
linkdb1 [linkdb2 linkdb3 ...]:多於一個的輸入LinkDb(s)
-filter:Actual URLFilters to be applied on urls and links in LinkDb(s)
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
-
mergesegs
mergesegs是"org.apache.nutch.segment.SegmentMerger"的代稱,用於合並多個segment,可以選擇性地輸出到一個或者多個固定大小的segment中。
使用方法:
Shell代碼
bin/nutch mergesegs output_dir (-dir segments | seg1 seg2 ...) [-filter] [-slice NNNN]
參數說明:
output_dir:結果segment的名稱或者segment片的父目錄
-dir segments:父目錄,包括多個segment
seg1 seg2 ...:segment目錄列表
-filter:通過URLFilters過濾
-slice NNNN:創建多個輸出segment,每一個中包括了NNNN個URL
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
-
dedup
dedup是"org.apache.nutch.indexer.DeleteDuplicates"的別名,它segment indexes中去掉重復的頁面。
使用方法:
Shell代碼
bin/nutch dedup <indexes> ...
參數說明:
<indexes>:indexes索引文件
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
-
plugin
plugin是"org.apache.nutch.plugin.PluginRepository"的代稱,用於從插件庫中加載一個插件並執行其主方法。
使用方法:
Shell代碼
bin/nutch plugin <pluginId> <className> [args ...]
參數說明:
<pluginId>:期望執行的插件ID
<className>:包含主方法的類名
[args]:傳入插件的參數
配置文件:
hadoop-default.xml
hadoop-site.xml
nutch-default.xml
nutch-site.xml
-
solrindex
solrindex是"org.apache.nutch.indexer.solr.SolrIndexer"的代稱,用於對抓取的內容進行索引建立,前提是要有solr環境。
使用方法:
Shell代碼
bin/nutch solrindex <solr url> <crawldb> -linkdb <linkdb> (<segment> ... | -dir <segments>)
參數說明:
<solr url>:這是你想索引數據的HTTP的Solr實例
<crawldb>:這個參數指明crawldb目錄的路徑
-linkdb <linkdb>:這個參數指明linkdb目錄的路徑,是可以省略的,當缺省時,不影響該solrindex命令的執行
<segment> ...:指一個目錄包含的segment
-dir <segments>:指segment的全路徑
[-noCommit]:索引segment后,不發送提交
[-deleteGone]:刪除網頁中的輸入段和重定向
2、Nutch簡單應用
下面我們將一步一步進行Nutch網絡爬行。
-
第一步:建立urls目錄
在目錄"/home/hadoop/nutch /runtime/local"下建立urls目錄,見下圖:
-
第二步: 建立抓取網站文本
在urls目錄下建立url.txt文件,並輸入你想爬的網站網址。
http://www.hebut.edu.cn/
-
第三步:編輯 nutch-site.xml文件
進入到"/home/hadoop/nutch/runtime/local/conf"目錄下,修改nutch-site.xml文件,增加以下內容。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>http.agent.name</name>
<value>My Nutch Spider</value>
</property>
<property>
<name>http.agent.description</name>
<value>this is a crawler of xiapi</value>
</property>
</configuration>
備注:參考了眾多文獻,大部分都只是添加紅色標注部分,其余的根據個人情況添加,我們這里也只把紅色部分添加到"nutch-site.xml"文件里。
知識點:
Nutch中的所有配置文件都放置在總目錄下的conf 子文件夾中,最基本的配置文件是
conf/nutch-default.xml。這個文件中定義了Nutch 的所有必要設置以及一些默認值,它是不
可以被修改的。如果你想進行個性化設置,你需要在conf/nutch-site.xml 進行設置,它會對
默認設置進行屏蔽。
Nutch考慮了其可擴展性,你可以自定義插件plugins 來定制自己的服務,一些plugins
存放於plugins 子文件夾。Nutch的網頁解析與索引功能是通過插件形式進行實現的,例如,
對HTML 文件的解析與索引是通過HTML document parsing plugin,parse-html 實現的。所以你完全可以自定義各種解析插件然后對配置文件進行修改,然后你就可以抓取並索引各種類型的文件了。
-
第四步:編輯 regex-urlfilter.txt文件
進入到"/home/hadoop/nutch/runtime/local/conf"目錄下,修改regex-urlfilter.txt文件,在"# accept anything else"下面輸入:"+^http://(\.*)*",然后保存,見下圖:
知識點:
-
Nutch 的爬蟲有兩種方式
-
爬行企業內部網:針對少數網站進行,用crawl 命令。
-
爬行整個互聯網:使用低層的inject,generate,fetch 和updatedb 命令,具有更強的可控制性。
-
-
舉例
-
+^http://([a-z0-9]*\.)*apache.org/
-
+^http://(\.*)*
-
句點符號匹配所有字符,包括空格、Tab 字符甚至換行符;
-
IP 地址中的句點字符必須進行轉義處理(前面加上"\"),因為IP 地址中的句點具有它本來的含義,而不是采用正則表達式語法中的特殊含義。
-
-
-
第六步:開始抓取網頁
使用下面命令進行抓取。
nutch crawl urls –dir crawl –depth 3 –topN 5
備注:這里是不帶索引的,如果要對抓取的數據建立索引,運行如下命令。
nutch crawl urls -solr http://localhost:8983/solr/ -depth 3 -topN 5
我們這里暫時先采用不帶索引的進行網頁抓取。
備注:運行這個命令必須在"/home/hadoop/nutch/runtime/local"目錄下進行,不然會提示urls這個目錄找不到。錯誤根源是我們寫的命令中的urls這個目錄的路徑是相對路徑。
-
第七步:觀察生成目錄
抓取后,在"/home/hadoop/nutch/runtime/local"目錄下生成一個crawl 文件夾。
下表2-1所示的生成的crawl文件夾中所包含的目錄。
表2-1 Nutch數據集
目錄 |
描述 |
crawldb |
爬行數據庫,用來存儲所要爬行的網址 |
linkdb |
鏈接數據庫,用來存儲每個網址的鏈接地址,包括源地址和鏈接地址 |
segments |
存放抓取的頁面,與上面鏈接深度depth 相關,抓取的網址被作為一個單元,而一個segment就是一個單元。 一個segment包括以下幾個子目錄:
|
備注:在Nutch-1.3之后,抓取文件后,生成的目錄只有crawldb,linkdb,segments,而沒有了indexs和index目錄。
知識點:
crawldb/ linkdb:web link目錄,存放url 及url 的互聯關系,作為爬行與重新爬行的依據,頁面默認30 天過期(可以在nutch-site.xml 中配置)。
當depth 設為3,則在segments 下生成3個以時間命名的子文件夾。
第八步:為剛才的數據建立索引,用Solr搜索。
執行下面語句建立索引。
nutch solrindex http://127.0.0.1:8983/solr/ crawl/crawldb -linkdb crawl/linkdb crawl/segments/*
在執行前,用SecureCRT打開另一個控制台,執行下面命令,不然執行會失敗。
java –jar start.jar
上面這個比較麻煩,我們用第二種。
nutch solrindex http://127.0.0.1:8080/solr/ crawl/crawldb -linkdb crawl/linkdb crawl/segments/*
第二種情況就不需要另開一個終端啟動Solr了,因為我們這時是用的Tomcat中配置的Solr,此時這個Solr已經在運行了。注意上面的端口號。
點擊"Search",然后出現搜索結果如下: