深度優先和廣度優先

網站的樹結構

經過伯樂在線網站爲例子:node

 

而且咱們經過訪問伯樂在線也是能夠發現,咱們從任何一個子頁面其實都是能夠返回到首頁,因此當咱們爬取頁面的數據的時候就會涉及到去重的問題,咱們須要將爬過的url記錄下來,咱們將上圖進行更改算法

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

深度優先

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

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

這裏是深度優先,因此這裏的爬取的順序式:
A-B-D-E-I-C-F-G-H (遞歸實現)網站

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

# 利用遞歸實現深度優先
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隊列的末尾,也就是指網絡爬蟲會先抓取起始頁中的全部網頁,而後在選擇其中的一個鏈接網頁,繼續抓取在此網頁中連接的全部網頁,經過下圖進行理解:spa

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

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

# 利用隊列實現樹的廣度優先遍歷
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)
相關文章
相關標籤/搜索