ゞ沉默是金ゞ

          魚(yú)離不開(kāi)水,但是沒(méi)有說(shuō)不離開(kāi)哪滴水.
          posts - 98,comments - 104,trackbacks - 0

          nutch

              Nutch是一個(gè)由Java實(shí)現(xiàn)的,剛剛誕生開(kāi)放源代碼(open-source)web搜索引擎。

            盡管Web搜索是漫游Internet的基本要求, 但是現(xiàn)有web搜索引擎的數(shù)目卻在下降. 并且這很有可能進(jìn)一步演變成為一個(gè)公司壟斷了幾乎所有的web搜索為其謀取商業(yè)利益.這顯然不利于廣大Internet用戶(hù).

            Nutch為我們提供了這樣一個(gè)不同的選擇. 相對(duì)于那些商用的搜索引擎, Nutch作為開(kāi)放源代碼搜索引擎將會(huì)更加透明, 從而更值得大家信賴(lài). 現(xiàn)在所有主要的搜索引擎都采用私有的排序算法, 而不會(huì)解釋為什么一個(gè)網(wǎng)頁(yè)會(huì)排在一個(gè)特定的位置. 除此之外, 有的搜索引擎依照網(wǎng)站所付的費(fèi)用, 而不是根據(jù)它們本身的價(jià)值進(jìn)行排序. 與它們不同, Nucth沒(méi)有什么需要隱瞞, 也沒(méi)有動(dòng)機(jī)去扭曲搜索的結(jié)果. Nutch將盡自己最大的努力為用戶(hù)提供最好的搜索結(jié)果.

          Nutch必須能夠做到

            Nutch 致力于讓每個(gè)人能很容易, 同時(shí)花費(fèi)很少就可以配置世界一流的Web搜索引擎. 為了完成這一宏偉的目標(biāo), Nutch必須能夠做到:

            * 每個(gè)月取幾十億網(wǎng)頁(yè)

            * 為這些網(wǎng)頁(yè)維護(hù)一個(gè)索引

            * 對(duì)索引文件進(jìn)行每秒上千次的搜索

            * 提供高質(zhì)量的搜索結(jié)果

            * 以最小的成本運(yùn)作

          Nutch主要分為兩個(gè)部分

            爬蟲(chóng)crawler和查詢(xún)searcherCrawler主要用于從網(wǎng)絡(luò)上抓取網(wǎng)頁(yè)并為這些網(wǎng)頁(yè)建立索引。Searcher主要利用這些索引檢索用戶(hù)的查找關(guān)鍵詞來(lái)產(chǎn)生查找結(jié)果。兩者之間的接口是索引,所以除去索引部分,兩者之間的耦合度很低。

            CrawlerSearcher兩部分盡量分開(kāi)的目的主要是為了使兩部分可以分布式配置在硬件平臺(tái)上,例如將CrawlerSearcher分別放在兩個(gè)主機(jī)上,這樣可以提升性能。

          爬蟲(chóng),Crawler

            Crawler的重點(diǎn)在兩個(gè)方面,Crawler的工作流程和涉及的數(shù)據(jù)文件的格式和含義。數(shù)據(jù)文件主要包括三類(lèi),分別是web database,一系列的segment加上index,三者的物理文件分別存儲(chǔ)在爬行結(jié)果目錄下的db目錄下webdb子文件夾內(nèi),segments文件夾和index文件夾。那么三者分別存儲(chǔ)的信息是什么呢?

            Web database,也叫WebDB,其中存儲(chǔ)的是爬蟲(chóng)所抓取網(wǎng)頁(yè)之間的鏈接結(jié)構(gòu)信息,它只在爬蟲(chóng)Crawler工作中使用而和Searcher的工作沒(méi)有任何關(guān)系。WebDB內(nèi)存儲(chǔ)了兩種實(shí)體的信息:pagelinkPage實(shí)體通過(guò)描述網(wǎng)絡(luò)上一個(gè)網(wǎng)頁(yè)的特征信息來(lái)表征一個(gè)實(shí)際的網(wǎng)頁(yè),因?yàn)榫W(wǎng)頁(yè)有很多個(gè)需要描述,WebDB中通過(guò)網(wǎng)頁(yè)的URL和網(wǎng)頁(yè)內(nèi)容的MD5兩種索引方法對(duì)這些網(wǎng)頁(yè)實(shí)體進(jìn)行了索引。Page實(shí)體描述的網(wǎng)頁(yè)特征主要包括網(wǎng)頁(yè)內(nèi)的link數(shù)目,抓取此網(wǎng)頁(yè)的時(shí)間等相關(guān)抓取信息,對(duì)此網(wǎng)頁(yè)的重要度評(píng)分等。同樣的,Link實(shí)體描述的是兩個(gè)page實(shí)體之間的鏈接關(guān)系。WebDB構(gòu)成了一個(gè)所抓取網(wǎng)頁(yè)的鏈接結(jié)構(gòu)圖,這個(gè)圖中Page實(shí)體是圖的結(jié)點(diǎn),而Link實(shí)體則代表圖的邊。

            一次爬行會(huì)產(chǎn)生很多個(gè)segment,每個(gè)segment內(nèi)存儲(chǔ)的是爬蟲(chóng)Crawler在單獨(dú)一次抓取循環(huán)中抓到的網(wǎng)頁(yè)以及這些網(wǎng)頁(yè)的索引。Crawler爬行時(shí)會(huì)根據(jù)WebDB中的link關(guān)系按照一定的爬行策略生成每次抓取循環(huán)所需的fetchlist,然后Fetcher通過(guò)fetchlist中的URLs抓取這些網(wǎng)頁(yè)并索引,然后將其存入segmentSegment是有時(shí)限的,當(dāng)這些網(wǎng)頁(yè)被Crawler重新抓取后,先前抓取產(chǎn)生的segment就作廢了。在存儲(chǔ)中。Segment文件夾是以產(chǎn)生時(shí)間命名的,方便我們刪除作廢的segments以節(jié)省存儲(chǔ)空間。

            IndexCrawler抓取的所有網(wǎng)頁(yè)的索引,它是通過(guò)對(duì)所有單個(gè)segment中的索引進(jìn)行合并處理所得的。Nutch利用Lucene技術(shù)進(jìn)行索引,所以Lucene中對(duì)索引進(jìn)行操作的接口對(duì)Nutch中的index同樣有效。但是需要注意的是,Lucene中的segmentNutch中的不同,Lucene中的segment是索引index的一部分,但是Nutch中的segment只是WebDB中各個(gè)部分網(wǎng)頁(yè)的內(nèi)容和索引,最后通過(guò)其生成的index跟這些segment已經(jīng)毫無(wú)關(guān)系了。

          Crawler工作流程

            在分析了Crawler工作中設(shè)計(jì)的文件之后,接下來(lái)我們研究Crawler的抓取流程以及這些文件在抓取中扮演的角色。Crawler的工作原理:首先Crawler根據(jù)WebDB生成一個(gè)待抓取網(wǎng)頁(yè)的URL集合叫做Fetchlist,接著下載線程Fetcher根據(jù)Fetchlist將網(wǎng)頁(yè)抓取回來(lái),如果下載線程有很多個(gè),那么就生成很多個(gè)Fetchlist,也就是一個(gè)Fetcher對(duì)應(yīng)一個(gè)Fetchlist。然后Crawler用抓取回來(lái)的網(wǎng)頁(yè)更新WebDB,根據(jù)更新后的WebDB生成新的Fetchlist,里面是未抓取的或者新發(fā)現(xiàn)的URLs,然后下一輪抓取循環(huán)重新開(kāi)始。這個(gè)循環(huán)過(guò)程可以叫做產(chǎn)生/抓取/更新循環(huán)。

            指向同一個(gè)主機(jī)上Web資源的URLs通常被分配到同一個(gè)Fetchlist中,這可防止過(guò)多的Fetchers對(duì)一個(gè)主機(jī)同時(shí)進(jìn)行抓取造成主機(jī)負(fù)擔(dān)過(guò)重。另外Nutch遵守Robots Exclusion Protocol,網(wǎng)站可以通過(guò)自定義Robots.txt控制Crawler的抓取。

            在Nutch中,Crawler操作的實(shí)現(xiàn)是通過(guò)一系列子操作的實(shí)現(xiàn)來(lái)完成的。這些子操作Nutch都提供了子命令行可以單獨(dú)進(jìn)行調(diào)用。下面就是這些子操作的功能描述以及命令行,命令行在括號(hào)中。

            1. 創(chuàng)建一個(gè)新的WebDb (admin db -create).

            2. 將抓取起始URLs寫(xiě)入WebDB (inject).

            3. 根據(jù)WebDB生成fetchlist并寫(xiě)入相應(yīng)的segment(generate).

            4. 根據(jù)fetchlist中的URL抓取網(wǎng)頁(yè) (fetch).

            5. 根據(jù)抓取網(wǎng)頁(yè)更新WebDb (updatedb).

            6. 循環(huán)進(jìn)行35步直至預(yù)先設(shè)定的抓取深度。

            7. 根據(jù)WebDB得到的網(wǎng)頁(yè)評(píng)分和links更新segments (updatesegs).

            8. 對(duì)所抓取的網(wǎng)頁(yè)進(jìn)行索引(index).

            9. 在索引中丟棄有重復(fù)內(nèi)容的網(wǎng)頁(yè)和重復(fù)的URLs (dedup).

            10. segments中的索引進(jìn)行合并生成用于檢索的最終index(merge).

          Crawler詳細(xì)工作流程是

            在創(chuàng)建一個(gè)WebDB之后(步驟1), “產(chǎn)生/抓取/更新循環(huán)(步驟36)根據(jù)一些種子URLs開(kāi)始啟動(dòng)。當(dāng)這個(gè)循環(huán)徹底結(jié)束,Crawler根據(jù)抓取中生成的segments創(chuàng)建索引(步驟710)。在進(jìn)行重復(fù)URLs清除(步驟9)之前,每個(gè)segment的索引都是獨(dú)立的(步驟8)。最終,各個(gè)獨(dú)立的segment索引被合并為一個(gè)最終的索引index(步驟10)。

            其中有一個(gè)細(xì)節(jié)問(wèn)題,Dedup操作主要用于清除segment索引中的重復(fù)URLs,但是我們知道,在WebDB中是不允許重復(fù)的URL存在的,那么為什么這里還要進(jìn)行清除呢?原因在于抓取的更新。比方說(shuō)一個(gè)月之前你抓取過(guò)這些網(wǎng)頁(yè),一個(gè)月后為了更新進(jìn)行了重新抓取,那么舊的segment在沒(méi)有刪除之前仍然起作用,這個(gè)時(shí)候就需要在新舊segment之間進(jìn)行除重。

            NutchLucene

            Nutch是基于Lucene的。LuceneNutch提供了文本索引和搜索的API

            一個(gè)常見(jiàn)的問(wèn)題是:我應(yīng)該使用Lucene還是Nutch

            最簡(jiǎn)單的回答是:如果你不需要抓取數(shù)據(jù)的話,應(yīng)該使用Lucene

            常見(jiàn)的應(yīng)用場(chǎng)合是:你有數(shù)據(jù)源,需要為這些數(shù)據(jù)提供一個(gè)搜索頁(yè)面。在這種情況下,最好的方式是直接從數(shù)據(jù)庫(kù)中取出數(shù)據(jù)并用Lucene API 建立索引。

            在你沒(méi)有本地?cái)?shù)據(jù)源,或者數(shù)據(jù)源非常分散的情況下,應(yīng)該使用Nutch

          posted on 2011-03-22 21:02 ゞ沉默是金ゞ 閱讀(2039) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): Java EE

          FeedBack:
          # re: nutch
          2011-03-23 12:18 | sadf
          sadfasdf  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 青浦区| 会同县| 华亭县| 佛坪县| 灵璧县| 叙永县| 哈密市| 通道| 雅安市| 河池市| 磐安县| 芮城县| 阿拉尔市| 林周县| 铜鼓县| 罗甸县| 嘉兴市| 奇台县| 大庆市| 墨脱县| 四子王旗| 奉节县| 彭阳县| 连山| 苏尼特左旗| 翁源县| 乌兰县| 淮南市| 安陆市| 庆云县| 崇阳县| 五华县| 自治县| 德昌县| 会理县| 湖北省| 红安县| 溧水县| 任丘市| 麻栗坡县| 山东省|