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

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



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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章