淺談網路爬蟲中深度優先演算法和簡單程式碼實現
學過網站設計的小夥伴們都知道網站通常都是分層進行設計的,最上層的是頂級域名,之後是子域名,子域名下又有子域名等等,同時,每個子域名可能還會擁有多個同級域名,而且URL之間可能還有相互連結,千姿百態,由此構成一個複雜的網路。
當一個網站的URL非常多的時候,我們務必要設計好URL,否則在後期的理解、維護或者開發過程中就會非常的混亂。理解以上的網頁結構設計之後,現在正式的引入網路爬蟲中的深度優先演算法。
上圖是一個二叉樹結構,透過對這個二叉樹的遍歷,來類比抓取網頁,加深對爬蟲策略的理解。深度優先演算法的主要思想是首先從頂級域名A開始,之後從中提取出兩個連結B和C,待連結B抓取完成之後,下一個要抓取的連結則是D或者E,而不是說抓取完成連結B之後,立馬去抓取連結C。抓取完連結D之後,發現連結D中所有的URL已經被訪問過了,在這之前我們已經建立了一個被訪問過的URL列表,專門用於儲存被訪問過的URL。當連結D完全被抓取完成之後,接下來就會去抓取連結E。待連結E爬取完成之後,不會去爬取連結C,而是會繼續往下深入的去爬取連結I。原則就是連結會一步一步的往下爬,只要連結下還有子連結,且該子連結尚未被訪問過,這就是深度優先演算法的主要思想。深度優先演算法是讓爬蟲一步一步往下進行抓取完成之後,再一步一步退回來,優先考慮深度。理解好深度優先演算法之後,再來看上圖,可以得到該二叉樹呈現的爬蟲抓取連結的順序依次為:A、B、D、E、I、C、F、G、H(這裡假設左邊的連結先會被爬取)。實際上,我們在做網路爬蟲過程中,很多時候都是在用這種演算法進行實現的,其實我們常用的Scrapy爬蟲框架預設也是用該演算法來進行實現的。透過上面的理解,我們可以認為深度優先演算法本質上是透過遞迴的方式來進行實現的。
下圖展示的是深度優先演算法的程式碼實現過程。
深度優先過程實際上是透過一種遞迴的方式來進行實現的。看上圖的程式碼,首先定義一個函式,用於實現深度優先過程,然後傳入節點引數,如果該節點非空的話,則將其列印出來,可以類比一下二叉樹中的頂級點A。將節點列印完成之後,看看其是否存在左節點(連結B)和右節點(連結C),如果左節點非空的話,則將其進行返回,再次呼叫深度優先函式本身進行遞迴,得到新的左節點(連結D)和右節點(連結E),以此類推,直到所有的節點都被遍歷或者達到既定的條件才會停止。右節點的實現過程亦是如此,不再贅述。
深度優先過程透過遞迴的方式來進行實現,當遞迴不斷進行,沒有跳出遞迴或者遞迴太深的話,很容易出現棧溢位的情況,所以在實際應用的過程中要有這個意識。
深度優先演算法和廣度優先演算法是資料結構裡邊非常重要的一種演算法結構,也是非常常用的一種演算法,而且在面試過程中也是非常常見的一道面試題,所以建議大家都需要掌握它,下一篇文章我們將介紹廣度優先演算法,敬請期待。
關於網路爬蟲中深度優先演算法的簡單介紹就到這裡了,小夥伴們get到木有咧?
作者:Python進階學習交流
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1020/viewspace-2816939/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java實現網路爬蟲 案例程式碼Java爬蟲
- java實現一個簡單的爬蟲小程式Java爬蟲
- 用PYTHON爬蟲簡單爬取網路小說Python爬蟲
- 演算法面試(七) 廣度和深度優先演算法演算法面試
- python實現selenium網路爬蟲Python爬蟲
- 簡單的爬蟲程式爬蟲
- 網路爬蟲——爬蟲實戰(一)爬蟲
- python爬蟲簡單實現逆向JS解密Python爬蟲JS解密
- 使用Python和requests庫的簡單爬蟲程式Python爬蟲
- 誰說爬蟲只能Python?看我用C#快速簡單實現爬蟲開發和演示!爬蟲PythonC#
- MATLAB神經網路工具箱(程式碼簡單實現)Matlab神經網路
- python網路爬蟲應用_python網路爬蟲應用實戰Python爬蟲
- python 爬蟲 簡單實現百度翻譯Python爬蟲
- 廣度優先演算法查詢路線演算法
- Python網路爬蟲實戰Python爬蟲
- 最簡單的網路圖片的爬取 --Pyhon網路爬蟲與資訊獲取爬蟲
- Java實現網路爬蟲 案例程式碼:從網上獲取《三國演義》全文Java爬蟲
- 深度殘差收縮網路:(六)程式碼實現
- 網路爬蟲爬蟲
- 《Python3網路爬蟲開發實戰程式碼》基本庫使用Python爬蟲
- 淺談JavaScript程式碼效能優化JavaScript優化
- Java網路爬蟲實操(10)Java爬蟲
- Java網路爬蟲實操(8)Java爬蟲
- Java網路爬蟲實操(9)Java爬蟲
- Java網路爬蟲實操(7)Java爬蟲
- python簡單爬蟲(二)Python爬蟲
- Java實現網路爬蟲 案例程式碼3:使用webmagic框架獲取天氣預報Java爬蟲Web框架
- python如何實現簡單的爬蟲功能?Python學習教程!Python爬蟲
- [網路爬蟲] 網路爬蟲實踐:大麥網演唱會預約搶票 【待續】爬蟲
- 網路爬蟲精要爬蟲
- 網路爬蟲示例爬蟲
- 深度聚類演算法淺談聚類演算法
- 網路爬蟲——Urllib模組實戰專案(含程式碼)爬取你的第一個網站爬蟲網站
- 網路爬蟲有什麼用?怎麼爬?手把手教你爬網頁(Python程式碼)爬蟲網頁Python
- python3網路爬蟲開發實戰_Python 3開發網路爬蟲(一)Python爬蟲
- 《Python3網路爬蟲開發實戰》教程||爬蟲教程Python爬蟲
- Django用來作為爬蟲框架淺談Django爬蟲框架
- 淺談JavaScript程式碼效能優化2JavaScript優化