介紹 Nutch 第一部分:抓取過程詳解(2)
通過上文現在我們有了一些基本的概念了,現在應該接觸實際的操作了,因為懂得原理和實踐還是有很大差距的。
抓取是一個迴圈的過程:抓取蜘蛛從WebDB中產生了一個 fetchlist 集合;抽取工具根據fetchlist從網路上下載網頁內容;蜘蛛程式根據抽取工具發現的新連結更新WebDB;然後再產生新的fetchlist;周而復始。(註:蜘蛛是分兩個部分的。有一次在公司的一個討論會上還就此爭論了一番,google也是如此,以後會給出例子。)這個抓取迴圈在nutch中經常指: generate/fetch/update 迴圈。
一般來說同一網域名稱下的 url 連結會被合成到同一個 fetchlist。這樣做的考慮是:當同時使用多個蜘蛛抓取的時候,不會產生重複抓取的現象。Nutch 遵循 Robots Exclusion Protocol, 你可以用robots.txt 定義保護私人網頁資料不被抓去。
上面這個抓取工具的組合是Nutch的最外層的,你也可以直接使用更底層的工具,自己組合這些底層工具的執行順序達到同樣的結果。這就是Nutch迷人的地方吧。下面把上述過程分別詳述一下,括弧內就是底層工具的名字:
- 建立一個新的WebDB (admin db -create)。
- 把開始抓取的跟Url 放入WebDb (inject)。
- 從WebDb的新 segment 中產生 fetchlist (generate)。
- 根據 fetchlist 列表抓取網頁的內容 (fetch)。
- 根據抓取回來的網頁連結url更新 WebDB (updatedb)。
- 重複上面3-5個步驟直到到達指定的抓取層數。
- 用計算出來的網頁url權重 scores 更新 segments (updatesegs)。
- 對抓取回來的網頁建立索引(index)。
- 在索引中消除重複的內容和重複的url (dedup)。
- 合并多個索引到一個大索引,為搜尋提供索引庫(merge)。
在建立了一個新的WebDB後,抓取迴圈 generate/fetch/update 就根據 最先第二步指定的根 url 在一定周期下自動迴圈了。當抓取迴圈結束後,就會產生一個最終的索引。從第7步到第10步。
需要說明的是:上面第 8 步中每個 segment 的索引都是單獨建立的,之後才消重(第9步)。第10步就是大功告成,合并單獨的索引到一個大索引庫。
Dedup 工具可以從 segment 的索引中去除重複的url。因為 WebDB 中不允許重複的url , 也就是說 fetchlist 中不會有重複的url,所以不需要對 fetchlist 執行 dedup 操作。上文說過,預設的抓取周期是30天,如果已經產生的舊 fetch 沒有刪除,而又產生了新的fetch 這是還是會出現重複的url的。當只有一個抓取程式啟動並執行時候是不會發生上述情況的。
從上面的介紹可以看出,一般情況下我們只要從頭執行的程式就可以了,不需要接觸底層的工具。但是搜尋引擎有很多“意外”,很多的時間需要花費在維護上,所以底層的工具也是需要掌握的。我將會在下文給你示範如何運行上述過程。
開篇說過,本文是面向一個中型的搜尋引擎的,如果做像百度這樣的抓取互連網資料的引擎,你就需要參考下面的資源。
資源清單:
Nutch project page Nutch項目的大本營,想必大家都知道。
2、郵件清單: nutch-user 和 nutch-dev
3、在寫本文的時候 Map Reduce 已經放到nutch的svn中了,不過還不是發布版本。我記得是Doug Cutting 在簽入完 MapReduce 後就去度假了,呵呵。
更多資源:
Nutch tutorial還有一個好訊息,寫過Eclipse Plugin 的人都知道,Eclipse 架構的強大之處,Nutch 的Plugin 也是基於Eclipse 的,不過現在的版本是 2.0 。詳情看這裡 PluginCentral
search option
Building Nutch: Open Source Search
Nutch: A Flexible and Scalable Open Source Web Search Engine
原文地址: http://today.java.net/pub/a/today/2006/01/10/introduction-to-nutch-1.html