學過網站設計的小夥伴們都知道網站一般都是分層進行設計的,最上層的是頂級域名,以後是子域名,子域名下又有子域名等等,同時,每一個子域名可能還會擁有多個同級域名,並且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到木有咧?設計