天天看點

淺談網絡爬蟲中廣度優先算法和代碼實作

前幾天給大家分享了網絡爬蟲中深度優先算法的介紹及其代碼實作過程,沒來得及上車的小夥伴們可以戳這篇文章——

淺談網絡爬蟲中深度優先算法和簡單代碼實作

。今天小編給大家分享網絡爬蟲中廣度優先算法的介紹及其代碼實作過程。

淺談網絡爬蟲中廣度優先算法和代碼實作

廣度優先算法和深度優先算法恰好相反,這裡繼續以上圖的二叉樹為例。廣度優先算法的主要思想是首先從頂級域名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到木有咧?

繼續閱讀