2007年10月20日

Nutch Setup and Use

http://eason982.blogspot.com/2007/10/nutch-setup-and-use.html
Nutch作為一款剛剛誕生的開源Web搜索引擎,提供了除商業搜索引擎外的一種新的選擇。個人、企業都可通過Nutch來構建適合於自身需要的搜索引擎平台,提供適合於自身的搜索服務,而不必完全被動接收商業搜索引擎的各種約束。

Nutch的工作流程可以分為兩個大的部分:抓取部分與搜索部分。抓取程序抓取頁面並把抓取回來的資料進行反向索引,搜索程序則對反向索引進行搜索回答使用者的請求,索引是聯系這兩者的紐帶。圖1是對Nutch整個工作流程的描述。

首先需要建立一個空的URL資料庫,並且把起始根urls添加到URL資料庫中(步驟1),依據URL資料庫在新創建的segment中生成fetchlist,存放了待爬行的URLs(步驟2),根據fetchlist從Internet進行相關網頁內容的爬行抓取與下載(步驟3),隨后把這些抓取到的內容解析成文本與資料(步驟4),從中提取出新的網頁連結URL,並對URL資料庫進行更新(步驟5),重復步驟2-5直到達到被指定的爬行抓取深度。以上過程構成了Nutch的整個抓取過程,可以用一個循環來對其進行描述:生成→抓取→更新→循環。

當抓取過程完成后,對抓取到的網頁進行反向索引,對重復的內容與URL進行剔除,然后對多個索引進行合並,為搜索建立統一的索引庫,而后使用者可通過由Tomcat容器提供的Nutch使用者界面提交搜索請求,然后由Lucene對索引庫進行查詢,並返回搜索結果給使用者,完成整個搜索過程。

Nutch程序採用Java語言編寫,其運行環境需要一個Tomcat容器。本文運行環境以最新的j2sdk1.4.2_12及jakarta-tomcat-5.0.28為例。

使用Nutch進行資料抓取
Nutch通過運行網絡爬蟲工具進行網絡內容的抓取,它提供了爬行企業內部網與爬行整個互聯網這兩種方式。

● 爬行企業內部網
爬行企業內部網(Intranet Crawling)這種方式適合於針對一小撮Web服務器,並且網頁數在百萬以內的情況。它使用crawl命令進行網絡爬行抓取。在進行爬行前,需要對Nutch進行一系列的配置,過程如下:
首先,需要創建一個目錄,並且在此目錄中創建包含起始根URLs的文件。我們以爬行搜狐網站(http://www.sohu.com)為例進行講述。
#cd /usr/local/nutch
#mkdir urls
#touch urls/sohu
因此文件urls/sohu的內容為:http://www.sohu.com/。依據爬行網站的實際情況,可繼續在此文件末尾添加其他URL或者在URL目錄里添加其他包含URL的文件。需要注意的是,在Nutch0.7的版中不需要創建目錄,直接創建包含起始根URL的文件即可。

接下來,要編輯conf/crawl-urlfilter.txt文件,將文中MY.DOMAIN.NAME部分替換為準備爬行的域名,並去掉前面的注釋。因此在本文中進行域名替換后的形式為:
+^http://([a-z0-9]*\.)*sohu.com/

文件conf/crawl-urlfilter.txt主要用於限定爬行的URL形式,其中URL的形式使用正則表達式進行描述。

然后,編輯文件conf/nutch-site.xml,並且必須包含以下內容:
< ?xml version="1.0"?>
< ?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
< !-- Put site-specific property overrides in this file. -->
nfiguration>
<>
<>http.agent.name< /name>
<>sohu.com< /value>
<>sohu.com< /description>
< /property>
< /configuration>
除http.agent.name外,在<> < /configuration>間一般還包括http.agent.description、http.agent.url、http.agent.email這三個選項。
最后,開始爬行抓取。完成對Nutch的配置后,運行crawal命令進行爬行。在本文中爬行腳本為:
#bin/nutch crawl urls -dir sohu -depth 5 -topN 1000

其中命令行中各參數項含義分別為:dir指定爬行結果的存放目錄,此處dir為sohu;depth指定從根URL起將要爬行的深度,此例depth設定為5;N設定每一層爬行靠前的N個URL,此例N值設定為1000。另外,crawl還有一個參數項:threads,它設定並行爬行的進程數。在爬行過程中,可通過Nutch日志文件查看爬行的進展狀態,爬行完成后結果存放在sohu目錄里。

● 爬行整個互聯網
爬行整個互聯網(Whole-web crawling)是一種大規模網絡爬行,與第一種爬行方式相對,具有更強的控制性,使用inject、generate、fetch、updatedb等比較低層次的命令,爬行量大,可能需要數台機器數周才能完成。
首先,需要下載一個包含海量URL的文件。下載完成后,將其拷貝到Nutch主目錄,並且解壓縮文件。
wget http://rdf.dmoz.org/rdf/content.rdf.u8.gz
#cd /usr/local/nutch
#cp /home/zyhua/content.rdf.u8.gz .
#gunzip content.rdf.u8.gz
content.rdf.u8包含了約三百萬個URL,在此僅隨機抽取五萬分之一的URL進行爬行。同第一種方法一樣,首先需要建立包含起始根URL的文件及其父目錄。

#mkdir urls
#bin/nutch org.apache.nutch.tools.DmozParser content.rdf.u8 -subset 50000 > urls/urllist
採用Nutch的inject命令將這些URL添加crawldb中。這里,目錄crawl是爬行資料存儲的根目錄。
#bin/nutch inject crawl/crawldb urls

然后,編輯文件conf/nutch-site.xml,內容及方法與“爬行企業內部網”類似,此處略過。接著,開始爬行抓取。可以將整個爬行抓取的命令寫成一個shell腳本,每次抓取只需執行此腳本即可,即生成→抓取→更新的過程。根據需要可反復運行此腳本進行爬行抓取。腳本範例及相應的說明如下:

#!/bin/sh
bin/nutch generate crawl/crawldb crawl/segments
lastseg=`ls -d crawl/segments/2* tail -1`
echo $lastseg
bin/nutch fetch $lastseg
bin/nutch updatedb crawl/crawldb $lastseg
#chmod u+x crawl //使其可執行。
#./crawl //運行腳本開始爬行抓取。

最后,進行索引。爬行抓取完后,需要對抓取回來的內容進行索引,以供搜索查詢。過程如下:

#bin/nutch invertlinks crawl/linkdb crawl/segments/* //倒置所有連結
#bin/nutch index crawl/indexes crawl/crawldb crawl/linkdb crawl/segments/*

使用Nutch進行資料搜索
Nutch為使用者提供了友好的搜索界面,它需要一個servlet容器來提供服務,本文選用了開源的Tomcat容器。首先,將Nutch的war文件部署到Tomcat容器里。
#rm -rf
$CATALINA_HOME/webapps/ROOT*
#cp /usr/local/nutch/nutch*.war $CATALINA_HOME/webapps/ROOT.war

啟動Tomcat,它會自動解開war文件。
#$CATALINA_HOME/bin/catalina.sh start

修改文件nutch-site.xml,指定Nutch的資料存放目錄。增加以下內容到文件nutch-site.xml中。

<>
<>searcher.dir< /name>
<>/usr/local/nutch/sohu< /value>
< /property>
< /configuration>

//在第二種爬行方法中的值為/usr/local/nutch/crawl。

修改server.xml,使輸入中文進行搜索時不出現亂碼現象。將以下內容添加到server.xml文件適當的地方。
URIEncoding=”UTF-8” useBodyEncodingForURI=”true”
配置更改完成后,重啟Tomcat服務器。
#$CATALINA_HOME/bin/catalina.sh stop
#$CATALINA_HOME/bin/catalina.sh start

Nutch的運行維護
隨著Internet上網頁的不斷更新,企業網站數量的不斷增加,需要定期進行爬行抓取,保證搜索結果的準備性與時效性。因此Nutch的運行與維護主要集中在對已有資料的增添與更新上,具體包括了爬行、索引及資料的合並等操作。主要有以下兩種典型情況。

● 重爬行抓取
重爬行抓取的作用主要表現在兩個方面,一方面是對已有內容進行更新,另一方面是發現新的內容。Nutch的Wiki網站提供的重爬行的完整腳本,其連結為:
http://wiki.apache.org/nutch/IntranetRecrawl
該連結提供了Nutch.0.7及Nutch0.8兩種版本的重爬行腳本。將腳本內容保存為文件/usr/local/nutch/bin/recrawl,便可執行,運行腳本進行重爬行。

#chmod u+x bin/recrawl
#/usr/local/nutch/bin/recrawl servlet_path crawl_dir depth adddays [topN]
//請務必使用recrawl的絕對路徑運行此腳本。

recrawl的工作過程包括以下四步:基於“生成→抓取→更新→循環”的資料爬行抓取;segments的合並及無用內容的剔除;重索引及重復內容的剔除;在Tomcat容器中重載應用程序配置。

使用Cron定期進行重爬行抓取,將如下內容添加到文件/etc/crontab末尾重啟Cron即可。
00 01 * * 6 root /usr/local/nutch/bin/recrawl
#每週六凌晨01:00進行重爬行抓取。僅供參考。

● 新增URL后的爬行抓取
主要針對第一種爬行方式,用於解決新增URL時的爬行問題。主要包括以下幾步:對新增URL的爬行抓取;新資料與已有資料的合並;重載應用程序配置。對新增URL的爬行方式與舊URLs的爬行方式相同。Nutch的Wiki網站同樣提供了進行資料合並的腳本代碼,連結為:
http://wiki.apache.org/nutch/MergeCrawl
將其保存為文件/usr/local/nutch/bin/mergecrawl,使可執行,進行資料合並。

#chmod u+x bin/mergecrawl
#bin/mergecrawl merge_dir dir1 dir2 ...
修改$CATALINA_HOME/webapps/ROOT/WEB-INF/classes/nutch-site.xml文件中searcher.dir屬性的值為新目錄名。在Tomcat服務器中重載應用程序配置。
#touch $CATALINA_HOME/webapps/ROOT/WEB-INF/web.xml



沒有留言: