深度優先和廣度優先


網站的樹結構

通過伯樂在線網站為例子:

 

並且我們通過訪問伯樂在線也是可以發現,我們從任何一個子頁面其實都是可以返回到首頁,所以當我們爬取頁面的數據的時候就會涉及到去重的問題,我們需要將爬過的url記錄下來,我們將上圖進行更改

在爬蟲系統中,待抓取URL隊列是很重要的一部分,待抓取URL隊列中的URL以什么樣的順序排隊列也是一個很重要的問題,因為這涉及到先抓取哪個頁面,后抓取哪個頁面。而決定這些URL排列順序的方法,叫做抓取策略。下面是常用的兩種策略:深度優先、廣度優先 

深度優先

深度優先是指網絡爬蟲會從起始頁開始,一個鏈接一個鏈接跟蹤下去,處理完這條線路之后再轉入下一個起始頁,繼續追蹤鏈接,通過下圖進行理解:

注:scrapy默認采用的是深度優先算法

這里是深度優先,所以這里的爬取的順序式:
A-B-D-E-I-C-F-G-H (遞歸實現)

深度優先算法的實現(偽代碼):

# 利用遞歸實現深度優先
def depth_tree(tree_node):
    if tree_node is not None:
        print(tree_node._data)
        if tree_node._left is not None:
            return depth_tree(tree_node._left)
        if tree_node._reght is not None:
            return depth_tree(tree_node._reght)

廣度優先

廣度優先,有人也叫寬度優先,是指將新下載網頁發現的鏈接直接插入到待抓取URL隊列的末尾,也就是指網絡爬蟲會先抓取起始頁中的所有網頁,然后在選擇其中的一個連接網頁,繼續抓取在此網頁中鏈接的所有網頁,通過下圖進行理解:

還是以這個圖為例子,廣度優先的爬取順序為:
A-B-C-D-E-F-G-H-I (隊列實現)

廣度優先代碼的實現(偽代碼):

# 利用隊列實現樹的廣度優先遍歷
def level_queue(root):
    if root is None:
        return
    my_queue=[]
    node = root
    my_queue.append(node)
    while my_queue:
        node=my_queue.pop(0)
        print(node.elem)
        if node.lchild is not None:
            my_queue.append(node.lchild)
        if node.rchild is not None:
            my_queue.append(node.rchild)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM