2010-12-04 68 views
2

我正在研究爬網程序,需要準確理解「鏈接深度」的含義。以Nutch的,例如:http://wiki.apache.org/nutch/NutchTutorialWeb Cralwer算法:深度?

深度表示從根頁面應該是 抓取的鏈接深度。

所以,說我有域www.domain.com,並希望抓取的,比方說,3深度 - 什麼,我需要做什麼?如果一個網站可以表示爲二叉樹,那麼我認爲這不會是一個問題。

+2

你說一個網站可以表示爲一個二叉樹的深度,但我認爲它可能是以圖形表示,因爲鏈接可以彼此鏈接超過一次而彼此交叉。你甚至可能有死鏈接,從來沒有鏈接到任何其他頁面,但只有它自己。所以我們可以將網站或互聯網視爲我認爲的圖表。 – themis 2012-11-28 09:34:26

回答

10

鏈接深度意味着‘跳’的數量的頁面是遠離「跳躍」意味着跟隨頁面上的鏈接。Nutch有這種限制的原因是,距離主頁非常「遠」的鏈接不太可能掌握很多信息(主頁面會鏈接到最重要的信息,所以你會得到更遠的信息,更詳細的信息),雖然可能有很多,但它們會佔用大量存儲空間,計算排名時間和帶寬。

Nutch因此使用稱爲depth-limited search的算法方案來限制其運行時間和空間使用率。如果它沒有使用這種啓發式方法,那麼它將不得不抓取整個網站來對其中的所有頁面進行排名,並找到頂部的N

要爬到深度3,請實現此算法並給它一個深度爲3的邊界。關於深度限制搜索的好處是,它是深度優先搜索(DFS)的一個變種,所以這是相當節省空間的:

function depth-limited-crawl(page p, int d) 
    if d == 0 
     return 
    /* do something with p, store it or so */ 
    foreach (page l in links(p)) 
     depth-limited-crawl(linked, d-1) 

不,一個網站不能在一般表示爲二叉樹;這是一個有向圖。如果你以某種方式刪除反向鏈接,那麼它將成爲一個多路樹。無論哪種方式,許多網站都太大,無法存儲您的抓取工具。

+0

我會嘗試深度限制搜索。在你的僞代碼中,3的邊界是如何執行的? – StackOverflowNewbie 2010-12-05 22:19:22

+0

遞歸:你用第二個參數調用它。* d * = 0,基本大小寫,立即返回;在遞歸調用中,* d *被遞減。 – 2010-12-06 10:40:25

0

鏈接深度意味着您在到達給定鏈接之前必須遵循多少鏈接。

示例:example.com鏈接到example.com/foo.html,鏈接到google.com。因此,google.com的鏈接深度爲2,相對於example.com,您可以通過2個鏈接訪問它。

要將example.com抓取到3的深度,您需要遵循指向最大深度爲3的鏈接,然後停止關注鏈接。沒有這個限制,你可以輕鬆地繼續下去。

示例:example.com鏈接到example.com/foo.html和example.com/bar.html。你遵循這兩個鏈接,他們鏈接到的鏈接,並停在那裏。

注:根頁有0

0

深度Web站點的根是在深度0的文檔,你可以通過使用根鏈路到達處於深度1.文檔您可以依次地到達在深度爲1的文檔中的鏈接將在深度2處。依此類推。

根據您的履帶,這可能僅適用於文件在同一個站點/域(通常)或文檔在其他地方舉行。

大多數網站不能用二叉樹表示,因爲「根」可能有兩個以上的「節點」。

2

我猜「深度」是時代的履帶式「跟隨鏈接」的數量。

假設你從根頁面開始。你跟每個此頁面上的鏈接:這是深度1.對於每個目標頁面,你按照鏈接:這是深度2等

注意,有可能是「循環」,而下面的鏈接。結構不是一棵樹,而是一張圖。

2
  1. 製作一個您用作隊列的列表。
  2. 追加www.domain.com, depth 0到其關閉它
  3. 當前深度是元素深度+ 1個
  4. 抓取
  5. 拉出的第一個元素的網站
  6. 追加在網站上的每個鏈接到隊列如果當前深度ISN 「T比最大深度
  7. 如果該列表不爲空,回去3時..
+0

你是指FIFO隊列嗎?這是深度限制搜索,因此可以使用堆棧更高效地完成搜索。 – 2010-12-05 00:08:14

0

那麼在Nutch的情況下,深度參數是一個相當混亂的東西,它只是意味着爬網程序正在經歷的循環次數。因此,你會到達距離你的種子網站3個鏈接的頁面......在一個給定的網站上,它可能在深度3 ......也就是說,如果他們提出的是在最高N限制內。