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

2020-12-12 騰訊網

  回復「書籍」即可獲贈Python從入門到進階共10本電子書

  今

  日

  雞

  湯

  沉舟側畔千帆過,病樹前頭萬木春。

  有圖有真相,請上面三位獲獎的幸運者及時加我微信,在公眾號裡回復「學習」二字即可獲取加我微信的方式,時間截止到11月7日晚8點之前,逾期不候,非常感謝大家的積極參與。

  言歸正傳,回到我們今天要學習的內容,主要是給大家普及一下深度優先算法的基本概念,詳情內容如下。

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

  --------- End ---------

  看完本文有收穫?請轉發分享給更多的人

  Python爬蟲與數據挖掘

  Python、網絡爬蟲 、書籍、數據分析、機器學習、數據結構、

  大數據、伺服器、Spark、Redis、C++、C、php、

  mysql、java、Android、面試題、課堂、其他

  老表說

  歡迎大家點讚,留言,轉發,轉載,感謝大家的相伴與支持。

  文末的廣告點一下也是小編先生的莫大支持噢~~~

  做知識的傳播者,隨手轉發,Python進階者與您同行。

相關焦點

  • 數據結構31 | 深度和廣度優先搜索:如何找出三度好友關係?
    在社交網絡中,我們往往通過用戶之間的連接關係,來實現推薦「可能認識的人」這麼一個功能。今天的開篇問題就是,給你一個用戶,如何找出這個用戶的所有三度(其中包含一度、二度和三度)好友關係?這就要用到今天要講的深度優先和廣度優先搜索算法。什麼是「搜索」算法?
  • 深度優先搜索算法檢測有向環的理解和使用方法
    在調度系統中牽扯到對調度數據結構的有向環進行檢測,所以使用DFS算法來檢測組裝形成的調度數據結構不存在無限循環結構,記錄分享DFS如何檢測環的。舉個慄子檢測圖解代碼實現import java.util.Arrays;public class graph
  • 算法圖解(六)| 廣度優先搜索算法
    你希望從最短的路徑,花最少的時間到達金山大橋,按照這個圖,你需要走最少三步,這就是最短路徑,如下所示:6.3、廣度優先搜索解決最短路徑問題的算法被稱為廣度優先搜索,廣度優先搜索是一種用於圖的查找算法,可回答兩類問題
  • 十大編程算法—算法六:DFS(深度優先搜索)
    算法六:DFS(深度優先搜索)深度優先搜索算法(Depth-First-Search),是搜索算法的一種。它沿著樹的深度遍歷樹的節點,儘可能深的搜索樹的分 支。當節點v的所有邊都己被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。
  • 3月書訊 :爬蟲和區塊鏈來了!
    教你學會用 Python 3 開發爬蟲全面介紹數據採集、數據存儲、動態網站爬取、App 爬取、驗證碼破解、模擬登錄、代理使用、爬蟲框架、分布式爬取等知識本書介紹了如何利用 Python 3 開發網絡爬蟲,書中首先詳細介紹了環境配置過程和爬蟲基礎知識,然後討論了 urllib、requests 等請求庫和
  • python爬蟲代碼微博 - CSDN
    Python編寫一個模擬登錄的程序,利用這個原理設計網絡爬蟲。return NoneWeiboSearch文件中的函數主要用於解析從伺服器得到的數據,比較簡單。另外,Login中解析重定位結果部分函數也在此文件中: 代碼示例:def sRedirectData(text):p = re.compile('location\.replace\([\'"](.*?)
  • AI從入門到放棄:BP神經網絡算法推導及代碼實現筆記
    PS:不同的應用場景,神經網絡的結構要有針對性的設計,這裡僅僅是為了推導算法和計算方便才採用這個簡單的結構我們以戰士打靶,目標是訓練戰士能命中靶心成為神槍手作為場景:那麼我們手裡有這樣一些數據:一堆槍擺放的位置(x,y),以及射擊結果,命中靶心和不命中靶心。
  • 教程| 基礎入門:深度學習矩陣運算的概念和代碼實現
    本文由機器之心編輯,「機器之心」專注生產人工智慧專業性內容,適合開發者和從業者閱讀參考。點擊右上角即刻關注。本文從向量的概念與運算擴展到矩陣運算的概念與代碼實現,對機器學習或者是深度學習的入門者提供最基礎,也是最實用的教程指導,為以後的機器學習模型開發打下基礎。
  • 「放下你手裡的代碼」:爬蟲技術的善與惡、罪與罰
    例如,用戶從蘇寧金融的網頁為起點,瀏覽發現了PP視頻的連結,點擊後跳轉到了PP視頻主頁,作為體育愛好者,在體育頻道中找到了相關的新浪微博的內容,再次點擊後又來到微博的頁面繼續閱讀,從而形成了一條路徑。如果把所有的可能路徑呈現出來,就會看到一個網絡結構。 網絡爬蟲模擬了人們瀏覽網頁的行為,只是用程序代替了人類的操作,在廣度和深度上遍歷網頁。
  • 從系統和代碼實現角度解析TensorFlow的內部實現原理 | 深度
    ,曾就職於360天眼實驗室,主要從事深度學習和增強學習相關研究工作。本文依據對Tensorflow(簡稱TF)白皮書[1]、TF Github[2]和TF官方教程[3]的理解,從系統和代碼實現角度講解TF的內部實現原理。以Tensorflow r0.8.0為基礎,本文由淺入深的闡述Tensor和Flow的概念。
  • 從系統和代碼實現角度解析TensorFlow的內部實現原理 | 深度
    ,曾就職於360天眼實驗室,主要從事深度學習和增強學習相關研究工作。本文依據對Tensorflow(簡稱TF)白皮書[1]、TF Github[2]和TF官方教程[3]的理解,從系統和代碼實現角度講解TF的內部實現原理。以Tensorflow r0.8.0為基礎,本文由淺入深的闡述Tensor和Flow的概念。
  • 放下你手裡的代碼:爬蟲技術的善與惡
    網絡爬蟲模擬了人們瀏覽網頁的行為,只是用程序代替了人類的操作,在廣度和深度上遍歷網頁。如果把網際網路上的網頁或網站理解為一個個節點,大量的網頁或網站通過超連結形成網狀結構。如果 robots.txt 做了訪問的限制,但是爬蟲卻沒有遵守,那就不是技術實現這麼簡單的事情了。禮儀二:爬取吞吐量的控制曾經出現假冒 Google 搜尋引擎的爬蟲去對網站進行 DDoS 攻擊,讓網站癱瘓的事情。
  • 網絡爬蟲技術有哪些用途和危害?
    對網絡用戶關注的信息進行分析和統計,最終作為一種網絡分析資源來獲得特定的利益。網絡爬蟲技術和搜尋引擎有天然的近親關係。全球各大搜尋引擎,都是網絡爬蟲技術應用的超級大戶。可以海量的抓取一定範圍內的特定主體和內容的網絡信息,作為向搜索和查詢相關內容的儲備數據資源。
  • Creator 迷宮生成:DFS與BFS 算法實現
    我的迷宮代碼實現: GUI 部分使用 Cocos Creator 遊戲引擎, 程式語言是 TypeScript。 算法與數據結構: 迷宮的生成和尋路使用的算法: [BFS]:廣度優先遍歷
  • Python開發簡單爬蟲【學習資料總結】
    一、簡單爬蟲架構 簡單爬蟲架構將待爬取的URL和已爬取的URL存放在內容中。 四、網頁解析器和BeautifulSoup 網頁解析器從HTML網頁字符串中提取出價值數據和新URL對象。
  • 基於Java的大型分布式網絡爬蟲體系結構
    【IT168 技術】分類  分布式網絡爬蟲包含多個爬蟲,每個爬蟲需要完成的任務和單個的爬行器類似,它們從網際網路上下載網頁,並把網頁保存在本地的磁碟,從中抽取URL並沿著這些URL的指向繼續爬行。由於並行爬行器需要分割下載任務,可能爬蟲會將自己抽取的URL發送給其他爬蟲。
  • 基於C#.NET的高端智能化網絡爬蟲
    有人評論我上一篇的簡單爬蟲:代碼太過簡單以至於弱爆了,真是被這群有文化的孩子給雷到了!不得不猜測你是不是攜程網的託兒,我還沒寫完你咋就知道弱爆了?看來不下點猛料你是得不到滿足啊!今天我們就來學習高級爬蟲的開發,同時我們還要利用之前的簡單爬蟲程序,來實現分布式爬蟲的Links Master部分,以提高分布式抓取的效率。下邊的我們要講的內容,涉及了眾多開源軟體。
  • 深度學習:神經網絡算法的昨天、今天和明天
    而這些應用背後的核心算法就是深度學習(Deep Learning),也是機器學習(Machine Learning)領域最火熱的一個分支。和其他機器學習算法有很大不同,深度學習依賴大量數據的迭代訓練,進而發現數據中內在的特徵(Feature),然後給出結果。
  • SEO學習搜尋引擎爬蟲網頁抓取策略
    本文主要簡單介紹了寬度(廣度)優先,兼顧深度的遍歷策略、不重複抓取策略、大站優先策略、非完全PageRank策略、OCIP策略、合作抓取策略等主流的網頁抓取策略。(Depth-First Trsversal)和不重複抓取策略④ 為了防止爬蟲無限制地寬度優先抓取,必須在某個深度上進行限制,達到這個深度後停止抓取,這個深度就是全球資訊網的直徑長度。
  • 最簡單的Python爬蟲,僅3步11行代碼爬取豆瓣電影排名
    提到網絡爬蟲,很多人望而卻步,覺得非常難,其實非如此,哪怕沒有爬蟲基礎,也可以寫出一個簡單的爬蟲。萬丈高樓平地起,今天分享一個最簡單的爬蟲,目的是通過案例,使大家對爬蟲有一個直觀的認識。第一步:確定目標爬蟲的第一步是要確定爬取的目標,沒有目標就沒有方向,更無從寫代碼。