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這三個屬性。例如
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <!-- Put site-specific property overrides in this file. -->
- <configuration>
- <property>
- <name>http.agent.name</name>
- <value>nutch-1.2</value>
- <description>tjt</description>
- </property>
- <property>
- <name>http.robots.403.allow</name>
- <value>true</value>
- <description></description>
- </property>
- <property>
- <name>http.agent.description</name>
- <value>tjtnutchhoho</value>
- <description></description>
- </property>
- <property>
- <name>http.agent.url</name>
- <value>http://ucooper.com</value>
- <description></description>
- </property>
- <property>
- <name>http.agent.email</name>
- <value>tangjiutao@gmail.com</value>
- <description></description>
- </property>
- <property>
- <name>http.agent.version</name>
- <value>Nutch-1.2</value>
- <description></description>
- </property>
- <!-- file properties -->
- <property>
- <name>searcher.dir</name>
- <value>E:/nutch/csdn</value>
- <description></description>
- </property>
- </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)
- <!-- file properties -->
- <property>
- <name>searcher.dir</name>
- <value>E:/nutch/csdn</value>
- <description></description>
- </property>
使用Tomcat進行搜索測試
(1)將nutch目錄的nutch-1.0.war復制到tomcat/webapps下,可以改名為nutch以簡化目錄名,不改也可以
(2)啟動tomcat,然后就在webapps下面自動生成了一個nutch的文件夾,
(3)打開 nutch/WEB-INF/classes下的nutch-site.xml文件,改為以下內容
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <configuration>
- <property>
- <name>searcher.dir</name>
- <value>E:/nutch/csdn</value>
- <description></description>
- </property>
- </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插件中被索引。