1. 程式人生 > >Nutch搜尋引擎(第3期)_ Nutch簡單應用

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,因為它是用於爬取本地檔案的。如果你想爬取httphttps,應當使用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"的代稱,合併多個CrawlDbURLFilter可選擇性地過濾指定內容。

可以合併多個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包括以下幾個子目錄:

  • crawl_generate:包含所抓取的網址列表
  • crawl_fetch:包含每個抓取頁面的狀態
  • content:包含每個抓取頁面的內容
  • parse_text:包含每個抓取頁面的解析文字
  • parse_data:包含每個頁面的外部連結和元資料
  • crawl_parse:包含網址的外部連結地址,用於更新crawldb資料庫

    備註:在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/*

    在