1. 程式人生 > >淺談網路爬蟲中廣度優先演算法和程式碼實現

淺談網路爬蟲中廣度優先演算法和程式碼實現

前幾天給大家分享了網路爬蟲中深度優先演算法的介紹及其程式碼實現過程,沒來得及上車的小夥伴們可以戳這篇文章——淺談網路爬蟲中深度優先演算法和簡單程式碼實現。今天小編給大家分享網路爬蟲中廣度優先演算法的介紹及其程式碼實現過程。



廣度優先演算法和深度優先演算法恰好相反,這裡繼續以上圖的二叉樹為例。廣度優先演算法的主要思想是首先從頂級域名A開始,之後從中提取出兩個連結B和C,待連結B抓取完成之後,下一個要抓取的連結則是連結B的同級兄弟連結C,而不是說抓取完成連結B之後,立馬往下去抓取子連結C或D。待C抓取完成之後,再返回去繼續抓取兄弟連結B下的子連結D或者E,爾後再返回去抓取C連結下的兄弟連結F、G、H,以此類推。



從面上看去,廣度優先演算法是一種以分層的方式進行抓取的策略。首先將第一層的節點抓取完成,爾後抓取第二層的節點,再是依次抓取第三層的節點,以此類推,直到抓取完畢或者達到既定的抓取條件為止。可以認為廣度優先演算法是一種按照層次的方法進行遍歷,所以也被稱為寬度優先演算法。理解好廣度優先演算法之後,再來看上圖,可以得到該二叉樹呈現的爬蟲抓取連結的順序依次為:A、B、C、D、E、F、G、H 、I(這裡假設左邊的連結先會被爬取)。通過上面的理解,我們可以認為到廣度優先演算法本質上是通過佇列的方式來進行實現的。



下圖展示的是廣度優先演算法的程式碼實現過程。



最開始傳入一個頂節點node(連結A),然後判斷節點是否非空,如果為空,則返回,反之非空的話,則將其放入到一個佇列列表中,然後開始進行迴圈。對佇列列表中的元素(此時只有節點A)使用pop()方法將其進行取出,然後將該節點的資料進行列印。將節點列印完成之後,看看其是否存在左節點(連結B)和右節點(連結C),如果左節點非空的話,則得到新的左節點(連結B),將其放入到佇列列表中去。爾後程式繼續往下執行,右節點的實現過程亦是如此,此時將得到右節點(連結C),將其也放入到佇列列表中去。此時佇列列表中的元素有連結B和連結C,之後再次進行新一輪的迴圈。通過這種方式,我們便實現了廣度優先演算法中的分層抓取連結的過程。這個邏輯相對於深度優先演算法來說,更為簡單。



深度優先演算法和廣度優先演算法是資料結構裡邊非常重要的一種演算法結構,也是非常常用的一種演算法,而且在面試過程中也是非常常見的一道面試題,所以建議大家都需要掌握它。



關於網路爬蟲中廣度優先演算法的簡單介紹就到這裡了,小夥伴們get到木有咧?