Nutch搜尋引擎(第3期)_ Nutch簡單應用
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/*
在