2009-11-07 149 views
-1

示例場景:請注意,根據網站的不同,這可能會很深或很淺。 蜘蛛掃描鏈接的第一頁。它將它存儲爲array1。遞歸嵌套循環

蜘蛛進入第一個鏈接,它現在在第二頁上。它會看到鏈接,並將其存儲爲array2。

蜘蛛進入第二頁上的第一個鏈接,它現在在第三頁。 它看到鏈接,並將其存儲爲array 3.

請注意,這是一般情況。我想強調需要在循環中執行多個循環。

rootArray [數組1,數組2,ARRAY3 ....]

我該怎麼辦遞歸嵌套循環? array2是array1中每個VALUE的子元素(我們假設結構非常均勻,array1中的每個VALUE在array2中都有相似的鏈接)。數組3是array2的每個值的子元素。等等。

回答

1

您會希望將這些結果存儲在樹中,而不是數組的集合。 Page1會有每個鏈接的子節點。其中每一個都有鏈接的子節點等。另一種方法是將所有鏈接存儲在一個數組中,通過網站遞歸來查找有問題的鏈接。你真的需要他們在一個類似於該網站的結構嗎?

當你添加任何新的鏈接到列表/樹/任何你已經得到的時候,你還想檢查重複的鏈接。否則,諸如page_1 - > page_2 - > page_1之類的循環會破壞您的應用。

這裏你真正的目標是什麼?網頁抓取工具並不完全是新技術。

2
module Scratch 
    def self.recur(arr, depth, &fn) 
    arr.each do |a| 
     a.is_a?(Array) ? recur(a, depth+1, &fn) : fn.call(a, depth) 
    end 
    end 
    arr = [[1, 2, 3], 4, 5, [6, 7, [8, 9]]] 
    recur(arr, 0) { |x,d| puts "#{d}: #{x}" } 
end 
+0

我喜歡這個,因爲我甚至無法識別語言。回到我的幼兒園。 – 2012-02-25 01:15:08

1

這一切都取決於你正在嘗試做的。

如果你正在收穫鏈接,那麼一個散列或集合將工作得很好。一個數組也可以使用,但可能導致一些陷阱。

如果您需要顯示網站的結構,您需要一個樹或數組數組以及標記您訪問過哪些網址的方式。

在任何情況下,您都需要避免冗餘鏈接進入循環。對你下降的深度以及你是否記得和/或關注網站外的鏈接進行某種限制也是很常見的。