Nutch 使用總結


Nutch 是一個開源Java 實現的搜索引擎。它提供了我們運行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬蟲。

 Nutch使用方法簡介: http://blog.csdn.net/pengpengfly/archive/2008/09/29/2994664.aspx

nutch1.2 eclipse tomcat6.0 配置 :http://hi.baidu.com/oliverwinner/blog/item/4be3f1370284b32f5ab5f565.html

Nutch 實戰:介紹了開源搜索引擎 Nutch 的基本信息,詳細說明了在 Eclispe 下運行 Nutch 的步驟和需要注意的問題,還分析了部分源代碼。很好的文章


Nutch 目錄結構

bin:用於命令行運行的文件;

conf:Nutch的配置文件

lib:一些運行所需要的jar文件;

plugins:存放相應的插件;

src:Nutch的所有源文件;

webapps:web運行相關文件;

nutch-0.9.war是 Nutch所提供的基於Tomcat的應用程序包。

Nutch工作流程

1. 將起始 URL 集合注入到 Nutch 系統之中。

2. 生成片段文件,其中包含了將要抓取的 URL 地址。

3. 根據URL地址在互聯網上抓取相應的內容。

4. 解析所抓取到的網頁,並分析其中的文本和數據。

5. 根據新抓取的網頁中的URL集合來更新起始URL集合,並再次進行抓取。

6. 同時,對抓取到的網頁內容建立索引,生成索引文件存放在系統之中。

 

(1)准備需要的軟件列表
        Cygwin     (下載地址:http://www.cygwin.com/setup.exe)
        Jdk(1.4.2以上版本,下載地址http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u29-download-513648.html)
        Nutch(推薦使用0.9版本,下載地址http://www.apache.org/dyn/closer.cgi/lucene/nutch/)
        Tomcat(下載地址http://tomcat.apache.org/)

(2)安裝軟件
     1)  Cygwin 打開安裝程序Cygwin.exe后,在"Choose Installation Type"頁選擇 "Install from Internet"(如果你已經把全部安裝包下載到本地,就可以選擇"Install from local directory"選項)。然后點擊"Next".
          然后選擇安裝目錄,其他可保持默認選項,點擊"Next".
          選擇保存安裝包的本地目錄,點擊"Next".
          選擇下載連接的類型,點擊Next。
          然后通過服務器先下在需要安裝的包列表,改為install比較合適,默認為default安裝不全
          完成安裝。

          圖文講解
     2) 安裝JDK ,注意安裝完成后需要在Windows的環境變量中加入JAVA_HOME=你的jdk的安裝目錄
     3) 安裝Tomcat,下載安裝版。

     4)把Nutch解壓到本地目錄,例如D:/nutch。啟動Cygwin程序,Cygwin程序會啟動一個模擬Unix/Linux的終端窗口,然后使 用方式就和Unix的Shell一樣了,Cygwin的根目錄是/cygdriver,這個目錄相當於Windows的“我的電腦”,然后進入Nutch 的目錄,例如:cd /cygdriver/d/nutch,然后運行bin/nutch命令,如果出現下面的Usage 信息,這樣Nutch就安裝完成了,非常簡單。

     注意cygwin路徑的切換方法:

     命令:cd d:/nutch

(3)使用Nutch

Nutch  的爬蟲有兩種方式
•  爬行企業內部網(Intranet crawling)。針對少數網站進行,用 crawl 命令。  
•  爬行整個互聯網。  使用低層的 inject, generate, fetch 和 updatedb 命令,具有更強的可控制性。 

      1) 添加需要爬行的內部網地址信息。
         新建一個目錄,寫入一些網址信息,例如我們需要爬行csdn的內部網。
             mkdir urls
             echo http://www.csdn.net/ >urls/csdn    后面有斜線
     2) 然后修改 conf目錄下的crawl-urlfilter.txt文件,這個文件中的正則表達式定義了那些文件可以被Nutch爬行,那些不可以被爬行。其中以“+”號開頭的表示屬於Nuch合法的Url連接,“-”號開頭相反。我們需要修改文件中的
          # accept hosts in MY.DOMAIN.NAME
           +^http://([a-z0-9]*/.)*MY.DOMAIN.NAME/
         為
        # accept hosts in MY.DOMAIN.NAME
        +^http://([a-z0-9]*/.)*csdn.net/    

# accept hosts in MY.DOMAIN.NAME

+^http://([a-z0-9]*\.)*
      3)接下來我們需要配置conf/nutch-site.xml,這個需要填寫相關的代理屬性,應為Nutch也許要准受Robot協議,在爬行人家網站的時候,把相關的信息提交給被爬行的網站。
         我們在這個文件中,需要在<configuration>和</configuration>之間,加入是個代理屬性,例如http.agent.name屬性      
         <property>
         <name>http.agent.name</name>
         <value>nutch-1.2</value>
         <description>csdn.com</description>
         </property>
        其中除了name字段需要准確添寫外,其他value和descrption字段可或添寫。同樣,還需要加入http.agent.description,http.agent.url和http.agent.email這三個屬性。例如

[xhtml] view plain copy
  1. <?xml version="1.0"?>  
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
  3. <!-- Put site-specific property overrides in this file. -->  
  4. <configuration>  
  5. <property>  
  6.   <name>http.agent.name</name>  
  7.   <value>nutch-1.2</value>  
  8.   <description>tjt</description>  
  9. </property>  
  10. <property>  
  11.   <name>http.robots.403.allow</name>  
  12.   <value>true</value>  
  13.   <description></description>  
  14. </property>  
  15. <property>  
  16.   <name>http.agent.description</name>  
  17.   <value>tjtnutchhoho</value>  
  18.   <description></description>  
  19. </property>  
  20. <property>  
  21.   <name>http.agent.url</name>  
  22.   <value>http://ucooper.com</value>  
  23.   <description></description>  
  24. </property>  
  25. <property>  
  26.   <name>http.agent.email</name>  
  27.   <value>tangjiutao@gmail.com</value>  
  28.   <description></description>  
  29. </property>  
  30. <property>  
  31.   <name>http.agent.version</name>  
  32.   <value>Nutch-1.2</value>  
  33.   <description></description>  
  34. </property>  
  35. <!-- file properties -->  
  36. <property>  
  37. <name>searcher.dir</name>  
  38. <value>E:/nutch/csdn</value>  
  39. <description></description>  
  40. </property>  
  41. </configuration>  

 

這里的設置,是因為nutch遵守了 robots協議,在獲取 response時,把自己的相關信息提交給被爬行的網站,以供識別。
       4)這樣就完成了全部爬行所需要的配置,下面就可以用nutch的crawl命令來派性企業內部網了
        再nutch目錄中輸入:
        bin/nutch crawl urls -dir csdn -threads 4 -depth 2 -topN 30
        這樣nutch就啟動並且開始爬行任務了,由於是簡單示例,所以以上這個命令很快就結束了,因為爬行的廣度和深度都非常小,也就是說,示例只爬行了csdn網站的很小一部分網頁。
       下面就上面命令的參數進行說明:
        Crawl命令的使用說明為: crawl <url dir> [-dir index] [-threads num] [-depth num] [-topN num]
        其中:
           urls是存放需要爬行網址的文件夾目錄。
           -dir選項是抓取的頁面的存放目錄。
           -threads選項是啟動的最大線程數。
           -depth選項是能爬行的最大深度,也就是最多爬行到第幾級的頁面,也叫爬行深度。
           -topN選項是在每層深度上,所能爬行的最多頁面數,也稱爬行廣度。     
        完成爬行后,會在-dir選項所指定的目錄中保存網頁信息和搜索需要的索引。 

********************************************************

常見報錯:

(1)Exception in thread "main" java.io.IOException: Job failed!
        at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1252)
        at org.apache.nutch.crawl.Injector.inject(Injector.java:217)
        at org.apache.nutch.crawl.Crawl.main(Crawl.java:124)

請檢查nutch-default.xml的plugin.folders是否修改為./src/plugin,默認為plugins,修改后啟動正常
(2)org.apache.nutch.plugin.PluginRuntimeException: java.lang.ClassNotFoundException: org.apache.nutch.net.urlnormalizer.basic.BasicURLNormalizer


********************************************************

PDF支持:

默認情況下不支持對pdf文件的索引,要想對pdf文件也進行正確的索上,找到nutch-default.xml中的plugin.includes屬性,添加上pdf,即為parse-(text|html|js|pdf)。

Nutch的爬行結果目錄

爬行結果目錄含有segment, linkdb, indexes, index, crawldb文件夾

Nutch的數據文件
crawldb: 爬行數據庫,用來存儲所要爬行的網址
linkdb: 鏈接數據庫,用來存儲每個網址的鏈接地址,包括源地址和鏈接地址
segments: 抓取的網址被作為一個單元,而一個segment就是一個單元。一個segment包括以下子目錄:
         crawl_generate:包含所抓取的網址列表
        crawl_fetch:包含每個抓取頁面的狀態
        content:包含每個抓取頁面的內容
        parse_text:包含每個抓取頁面的解析文本
        parse_data:包含每個頁面的外部鏈接和元數據
        crawl_parse:包含網址的外部鏈接地址,用於更新crawldb數據庫
indexes: 采用Lucene的格式建立索引集
index:最終生成的目錄

WebDB內存儲了兩種實體的信息:page和link。Page實體通過描述網絡上一個網頁的特征信息來表征一個實際的網頁,因為網頁有很多個需 要描述,WebDB中通過網頁的URL和網頁內容的MD5兩種索引方法對這些網頁實體進行了索引。Page實體描述的網頁特征主要包括網頁內的link數 目,抓取此網頁的時間等相關抓取信息,對此網頁的重要度評分等。同樣的,Link實體描述的是兩個page實體之間的鏈接關系。WebDB構成了一個所抓 取網頁的鏈接結構圖,這個圖中Page實體是圖的結點,而Link實體則代表圖的邊。
  一次爬行中每次循環都會產生一個segment,每個segment內存儲的是爬蟲Crawler在單獨一次抓取循環中抓到的網頁以及這些網頁的索 引。Crawler爬行時會根據WebDB中的link關系按照一定的爬行策略生成每次抓取循環所需的fetchlist,然后Fetcher通過 fetchlist中的URLs抓取這些網頁並索引,然后將其存入segment。Segment是有時限的,當這些網頁被Crawler重新抓取后,先 前抓取產生的segment就作廢了。在存儲中。Segment文件夾是以產生時間命名的,方便我們刪除作廢的segments以節省存儲空間。
  Index是Crawler抓取的所有網頁的索引,它是通過對所有單個segment中的索引進行合並處理所得的。Nutch利用Lucene技術進 行索引,所以Lucene中對索引進行操作的接口對Nutch中的index同樣有效。但是需要注意的是,Lucene中的segment和Nutch中 的不同,Lucene中的segment是索引index的一部分,但是Nutch中的segment只是WebDB中各個部分網頁的內容和索引,最后通 過其生成的index跟這些segment已經毫無關系了。

 

Nutch之Crawler工作流程

在Nutch中,Crawler操作的實現是通過一系列子操作的實現來完成的。這些子操作Nutch都提供了子命令行可以單獨進行調用。下面就是這些子操作的功能描述以及命令行,命令行在括號中。
1) 建立初始 URL集
2) 將 URL 集注入 crawldb數據庫---inject
3) 根據 crawldb數據庫創建抓取列表---generate
4) 執行抓取,獲取網頁信息---fetch
5) 更新數據庫,把獲取到的頁面信息存入數據庫中---updatedb
6) 重復進行 3~5的步驟,直到預先設定的抓取深度。---這個循環過程被稱為“產生/抓取/更新”循環

7)  根據sengments 的內容更新 linkdb數據庫---invertlinks
8)  建立索引---index

9) 在索引中丟棄有重復內容的網頁和重復的URLs (dedup).
10) 將segments中的索引進行合並生成用於檢索的最終index(merge).

11)  用戶通過用戶接口進行查詢操作
12) 將用戶查詢轉化為lucene 查詢
13) 返回結果
其中,1~6屬於爬蟲部分;7~10 屬於索引部分;11~13屬於查詢部分。

 在創建一個WebDB之后, “產生/抓取/更新”循環(步驟3-6)根據一些種子URLs開始啟動。當這個循環徹底結束,Crawler根據抓取中生成的segments創建索引 (步驟7-10)。在進行重復URLs清除(步驟9)之前,每個segment的索引都是獨立的(步驟8)。最終,各個獨立的segment索引被合並為 一個最終的索引index(步驟10)。
  其中有一個細節問題,Dedup操作主要用於清除segment索引中的重復URLs,但是我們知道,在WebDB中是不允許重復的URL存在的,那 么為什么這里還要進行清除呢?原因在於抓取的更新。比方說一個月之前你抓取過這些網頁,一個月后為了更新進行了重新抓取,那么舊的segment在沒有刪 除之前仍然起作用,這個時候就需要在新舊segment之間進行除重。

 

Nutch本身的搜索測試:

在 cygwin 中輸入 ”bin/nutch org.apache.nutch.searcher.NutchBean csdn” ,即調用 NutchBean 的 main 方法搜索關鍵字 ”csdn” ,在 cygwin 可以看到搜索出: Total hits: 29 ( hits 相當於 JDBC 的 results )

注意: 如果發現搜索結果始終為 0 ,則需要配置一下 nutch-1.2/conf 的 nutch-site.xml   試試添加下面這段:(注意之前的http.agent.name必須有,如果沒有這個property,則搜索結果一直為0)

[xhtml] view plain copy
  1. <!-- file properties -->  
  2. <property>  
  3. <name>searcher.dir</name>  
  4. <value>E:/nutch/csdn</value>  
  5. <description></description>  
  6. </property>  

 

使用Tomcat進行搜索測試  
(1)將nutch目錄的nutch-1.0.war復制到tomcat/webapps下,可以改名為nutch以簡化目錄名,不改也可以

(2)啟動tomcat,然后就在webapps下面自動生成了一個nutch的文件夾,

(3)打開 nutch/WEB-INF/classes下的nutch-site.xml文件,改為以下內容

[xhtml] view plain copy
  1. <?xml version="1.0"?>  
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
  3. <configuration>  
  4. <property>  
  5. <name>searcher.dir</name>  
  6. <value>E:/nutch/csdn</value>  
  7. <description></description>  
  8. </property>  
  9. </configuration>  


 (4) 啟動Tomcat,打開瀏覽器在地址欄中輸入:http://localhost:8080/nutch ,就可以看到搜索頁面了.

注意:從網頁上復制的代碼可能存在一些非英文編碼字符,會造成影響,我就遇到了這個問題。把前面的空格等都去掉就解決了。

 

nutch抓取下來,但搜索不到結果的解決方案

(1)在 cygwin 中輸入 ”bin/nutch org.apache.nutch.searcher.NutchBean csdn”測試是否已經抓取了頁面,如果有結果,則說明有

(2)查看tomcat的 webapps/nutch/WEB-INF/classes下的nutch-site.xml文件里,是否設置了searcher.dir屬性,這是必須的

(3)別忘了在設置完成后,要重啟下tomcat。(注意每次修改nutch-site.xml 文件后都要重新啟動tomcat)

(4)貌似nutch/conf/nutch-site.xml也要設置searcher.dir屬性,都進行設置

 

中文亂碼問題

在文本框中輸入關鍵字,就可以進行搜索了.不過用戶在使用時會發現,對於英文單詞的搜索一切正常,而當要搜索中文詞語時會出現亂碼。其實這個問題是 Tomcat設置的問題,解決辦法是修改tomcat的配置文件,打開tomcat/conf下的server.xml文件,將其中的Connector 部分改成如下形式即可:

 

 

 

     <Connector port="8080" protocol="HTTP/1.1"

                connectionTimeout="20000"

                redirectPort="8443" />

 

改為

 

     <Connector port="8080" protocol="HTTP/1.1"

                connectionTimeout="20000"

                redirectPort="8443"

            URIEncoding="UTF-8"

            useBodyEncodingForURI="true"/>

 

然后重啟 tomcat 即可。

 

 

索引查看

LukeAll 3.01打開爬行結果目錄下的index目錄

注意:低版本Luke不能打開該文件,需要高版本的Luke,下載地址

http://code.google.com/p/luke/downloads/list

 

Dedian同志翻譯的Doug Cutting 訪談錄 -- 關於搜索引擎的開發

http://www.blogjava.net/dedian/archive/2006/08/02/Doug_Cutting_Interview.html

注:Doug Cutting是Lucene、Nutch的開發人員

 

關於鏈接分析模塊:

你有實現你自己的PageRank或者WebRank算法系統在你的Nutch里嗎?什么是你做網頁排名(Ranking)的考慮?
是的,Nutch里面有一個鏈接分析模塊。它是可選的,因為對於站內搜索來說,網頁排名是不需要的。

 

Nutch目前對中文分詞的支持還不夠完善,從測試的結果來看它是將中文詞語分成單獨 的字進行處理的。但是瑕不掩瑜,作為一個開源的搜索引擎項目,Nutch的功能不僅可圈可點,而且從對它源代碼的解讀中可以使我們對搜索引擎的運行機理和 相關算法有了更加深入的了解。此外,Nutch優秀的設計架構使得用戶能夠非常容易的開發自己的插件,以實現個性化的需求與功能。相信隨着Nutch不斷 的改進和成熟,在不久的將來,基於Nutch的個人搜索引擎以及行業垂直搜索引擎會不斷的涌現出來。

 

 

下面部分轉自:http://blog.csdn.net/liyang23456/archive/2007/08/20/1751253.aspx

 

2.Nutch You should know

2.1 一份文檔

nutch的文檔不多,而且多是安裝文檔,要深入nutch,就必須一字不漏的閱讀:

Introduction to Nutch, Part 1 Crawling    和 Introduction to Nutch, Part 2 Searching

然后就是看源碼了,好在nutch的源碼非常均勻,簡短,沒有花哨的技巧,很容易把事情看明白。

2.2 三個目錄

首先理解nutch的三個數據目錄:

1.crawdb,linkdb 是web link目錄,存放url 及url的互聯關系,作為爬行與重新爬行的依據,頁面默認30天過期。

2.segments 是主目錄,存放抓回來的網頁。頁面內容有bytes[]的raw content 和 parsed text的形式。nutch以廣度優先的原則來爬行,因此每爬完一輪會生成一個segment目錄。

3.index 是lucene的索引目錄,是indexs里所有index合並后的完整索引,注意索引文件只對頁面內容進行索引,沒有進行存儲,因此查詢時要去訪問segments目錄才能獲得頁面內容。

 

3.Nutch 每條索引記錄的字段

url: 作為唯一標標識值,由BasicIndexingFilter類產生。

segment: 由Indexer類產生。Nutch抓回來的頁面內容放在segments目錄,lucene只會索引,不會store原文內容,因此在查詢時要以 segment與url作為外鍵,由FetchedSegments類根據hitsDetail從segments目錄獲得content。

boost:優先級,由Indexer類調用插件計算產生。

title:顯示標題,在BasicIndexingFilter插件中被索引和存儲。

content: 主要的被搜索項,在BasicIndexingFilter插件中被索引。


免責聲明!

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



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