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/*

 

    在執行前,用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",然后出現搜索結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM