您好,登錄后才能下訂單哦!
學過網站設計的小伙伴們都知道網站通常都是分層進行設計的,最上層的是頂級域名,之后是子域名,子域名下又有子域名等等,同時,每個子域名可能還會擁有多個同級域名,而且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到木有咧?
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。