淺析深度優(yōu)先與廣度優(yōu)先的遍歷算法(簡單實(shí)踐)

前段時(shí)間和產(chǎn)品人員徊哑、運(yùn)營人員聊產(chǎn)品相關(guān)的事情,他們提出想通過收集一些網(wǎng)站數(shù)據(jù)去分析其它產(chǎn)品功能的數(shù)據(jù)情況以及制定推廣計(jì)劃聪富,因此去了解了爬蟲相關(guān)的知識莺丑。

深度優(yōu)先和廣度優(yōu)先算法在爬蟲遍歷頁面url的算法的時(shí)候經(jīng)常用到,筆者在本文中主要與大家分享講解這兩個(gè)算法的原理墩蔓。

image

一梢莽、網(wǎng)站的url結(jié)構(gòu)

每個(gè)網(wǎng)站都是有一定結(jié)構(gòu)層次,在一個(gè)主域名下可能會有多個(gè)內(nèi)容模塊奸披,網(wǎng)站的所有內(nèi)容都是類似一個(gè)樹形結(jié)構(gòu)一層一層的昏名,如下圖:

image

二、原理剖析

我們把網(wǎng)站的結(jié)構(gòu)理解為一顆樹的結(jié)構(gòu)源内,每一個(gè)頁面就是一個(gè)節(jié)點(diǎn)葡粒,如圖:

image

▎深度優(yōu)先算法

通過深度優(yōu)先遍歷出來的結(jié)果是: A-->B-->D-->H-->E-->C-->F-->G

深度優(yōu)先算法過程簡要來說是對每一個(gè)可能的分支路徑深入到不能再深入為止份殿,而且每個(gè)節(jié)點(diǎn)只能訪問一次:

●首先訪問根節(jié)點(diǎn)膜钓,然后依次從根節(jié)點(diǎn)的未被訪問的鄰接點(diǎn)出發(fā),進(jìn)行深度優(yōu)先遍歷卿嘲,直至和根節(jié)點(diǎn)有路徑相通的節(jié)點(diǎn)都被訪問颂斜。

●若此時(shí)尚有節(jié)點(diǎn)未被訪問,則從一個(gè)未被訪問的節(jié)點(diǎn)出發(fā)拾枣,重新進(jìn)行深度優(yōu)先遍歷沃疮,直到所有頂點(diǎn)均被訪問過盒让。

由深度優(yōu)先算法的規(guī)則可知該算法具體實(shí)現(xiàn)使用遞歸實(shí)現(xiàn)的。

▎廣度優(yōu)先算法

通過廣度優(yōu)先遍歷出來的結(jié)果是: ** A-->B-->C-->D-->E-->F-->G-->H**

廣度優(yōu)先算法是從一個(gè)節(jié)點(diǎn)開始司蔬,根據(jù)層次從上到下的遍歷節(jié)點(diǎn)邑茄,在同一層中從左到右遍歷節(jié)點(diǎn):

●首先訪問根節(jié)點(diǎn),然后訪問距根節(jié)點(diǎn)距離為1的頂點(diǎn)俊啼。假設(shè)有3個(gè)節(jié)點(diǎn)與根節(jié)點(diǎn)相鄰肺缕,深度優(yōu)化搜索會在訪問根節(jié)點(diǎn)后訪問這3個(gè)節(jié)點(diǎn)。

●在完成訪問距根節(jié)點(diǎn)距離為1的節(jié)點(diǎn)后授帕,將它取出并重復(fù)相同的過程同木。其中哪一個(gè)節(jié)點(diǎn)是第一個(gè)節(jié)點(diǎn),這根據(jù)隊(duì)列的數(shù)據(jù)結(jié)構(gòu)來處理跛十。

所以也把廣度優(yōu)化算法稱為橫向順序遍歷彤路,因?yàn)樗粚右粚拥卦L問節(jié)點(diǎn)。廣度優(yōu)化搜索通過隊(duì)列實(shí)現(xiàn)芥映。

三洲尊、簡單實(shí)踐

這兩種算法在爬蟲遍歷頁面時(shí)經(jīng)常被用到,我用了廣度優(yōu)先算法做了一個(gè)簡單的爬取網(wǎng)站所有 url 的 demo 奈偏。這個(gè) demo 主要用到了 python3 的三個(gè)庫 urllib 颊郎、BeautifulSoup 以及ss l。

Urllib 庫用來網(wǎng)頁請求霎苗、響應(yīng)獲饶房浴;BeautifulSoup 庫用來將html解析為對象進(jìn)行處理唁盏;ssl是解決訪問Https時(shí)不受信任SSL證書問題内狸;這幾個(gè)庫還有其他功能,感興趣的可以去了解它們的API:

導(dǎo)入urllib厘擂、BeautifulSoup庫


import ssl

import urllib.request

from bs4 import BeautifulSoup

獲取網(wǎng)頁內(nèi)容


#解決訪問Https時(shí)不受信任SSL證書問題

context = ssl._create_unverified_context()

#使用urllib庫抓取URL內(nèi)容

resp=urllib.request.urlopen(link_url, context=context)

html=resp.read()

解析網(wǎng)頁內(nèi)容(這邊只解析提取網(wǎng)頁里面的鏈接)


 #使用BeautifulSoup庫解析網(wǎng)頁內(nèi)容

soup = BeautifulSoup(html, 'html.parser') 

tags = soup.find_all('a')

for tag in tags:

    child_urls.add(tag.attrs('href'))

使用廣度優(yōu)先算法進(jìn)行爬取


while not queue.empty():

    current_url = queue.get()

    if current_url not in found_urls:

        found_urls.add(current_url)

        quene.put(getLinkUrls(current_url))

四昆淡、比較分析

◆深度優(yōu)先算法采用棧的方式,有回溯操作刽严,不會保留全部節(jié)點(diǎn)昂灵,占用空間少,但運(yùn)行速度較慢舞萄。

◆廣度優(yōu)先算法采用隊(duì)列的方式眨补,無回溯操作,保留全部節(jié)點(diǎn)倒脓,運(yùn)行速度較快撑螺,但占用空間較多。

◆深度優(yōu)先算法和廣度優(yōu)先算法的時(shí)間復(fù)雜度都是O(n2)崎弃,n為節(jié)點(diǎn)數(shù)甘晤。

image

五含潘、工具推薦

借助代碼去抓取想要的數(shù)據(jù)并進(jìn)行可視化分析是最方便靈活的,但是很多產(chǎn)品和運(yùn)營說到學(xué)代碼线婚,可能馬上就放棄了遏弱。

那么有沒有不懂代碼就可以實(shí)現(xiàn)抓取數(shù)據(jù),進(jìn)行可視化分析的方法呢塞弊?以下就是我為大家推薦的三款工具:

  • NO.1 八爪魚采集器

八爪魚可以比較容易的從網(wǎng)頁精確采集你需要的數(shù)據(jù)腾窝,內(nèi)容涵蓋電商類、生活服務(wù)類居砖、社交媒體類虹脯、論壇類。

**▎八爪魚采集器優(yōu)點(diǎn):

●操作簡單奏候,完全可視化圖形操作循集,無需專業(yè)IT人員,任何會使用電腦上網(wǎng)的人都可以輕松掌握蔗草。

●采集任務(wù)自動(dòng)分配到云端多臺服務(wù)器同時(shí)執(zhí)行咒彤,提高采集效率,可以很短的時(shí)間內(nèi) 獲取成千上萬條信息咒精。

●模擬人的操作思維模式镶柱,可以登陸,輸入數(shù)據(jù)模叙,點(diǎn)擊鏈接歇拆,按鈕等,還能對不同情況采取不同的采集流程范咨。

●內(nèi)置可擴(kuò)展的OCR接口故觅,支持解析圖片中的文字,可將圖片上的文字提取出來渠啊。

●采集任務(wù)自動(dòng)運(yùn)行输吏,可以按照指定的周期自動(dòng)采集,并且還支持最快一分鐘一次的實(shí)時(shí)采集替蛉。

●內(nèi)置從入門到精通所需要的視頻教程贯溅,2分鐘就能上手使用,另外還有文檔躲查,論壇它浅,qq群等。

**▎八爪魚采集器缺點(diǎn):

●它又免費(fèi)版本熙含,當(dāng)時(shí)很多功能需要付費(fèi)或者積分罚缕。

●大量采集數(shù)據(jù)的時(shí)候,容易出現(xiàn)采集不全的情況怎静。

●判斷語錄較弱邮弹,無法進(jìn)行復(fù)雜判斷,也無法執(zhí)行復(fù)雜邏輯蚓聘。

image
  • NO.2 火車采集器 -

火車采集器成立的比較久腌乡,經(jīng)過了十幾年的迭代,可以實(shí)現(xiàn)抓取夜牡、清洗与纽、分析,挖掘及最終的可用數(shù)據(jù)呈現(xiàn)塘装,一整套服務(wù)急迂。

火車采集器優(yōu)點(diǎn):

●采集原理是基于 web 結(jié)構(gòu)的源代碼提取,幾乎適用于所有的網(wǎng)頁蹦肴,以及網(wǎng)頁中能夠看到的所有內(nèi)容僚碎;

●支持接口和插件多種擴(kuò)展延伸,滿足更加多樣化的使用需求阴幌,使火車采集器真正做到全網(wǎng)通用勺阐。

●在每個(gè)功能上都做了優(yōu)化設(shè)置,除了最基礎(chǔ)的數(shù)據(jù)采集矛双,更是融入了強(qiáng)大的數(shù)據(jù)處理和數(shù)據(jù)發(fā)布功能渊抽,全面完善了對于數(shù)據(jù)利用的整個(gè)流程。

●火車采集器在許多細(xì)節(jié)操作中配置多項(xiàng)可選方式议忽。

●分布式高速采集系統(tǒng)懒闷,占用資源少。

●實(shí)時(shí)地監(jiān)控采集,數(shù)據(jù)不易遺漏栈幸。

火車采集器缺點(diǎn):

●規(guī)則配置煩瑣毛雇。

●比較占用內(nèi)存和CPU資源,大批量采集速度不行侦镇,資源回收控制得不好灵疮。

●高級功能必須付費(fèi)版才能使用。

image
  • NO.3 Tableau -

Tableau是數(shù)據(jù)可視化做的最好的平臺之一壳繁,功能十分強(qiáng)大震捣。

Tableau 優(yōu)點(diǎn):

●優(yōu)秀的數(shù)據(jù)可視化展示效果,數(shù)據(jù)圖表制作能力強(qiáng)

●操作簡單闹炉,上手快不需要寫代碼蒿赢,數(shù)據(jù)的導(dǎo)入和加載都是向?qū)?/p>

●內(nèi)置美觀的可視化圖表,不用考慮配色渣触,表格處理好格式即可羡棵。

Tableau 缺點(diǎn):

●基于數(shù)據(jù)查詢的工具,難以處理不規(guī)范數(shù)據(jù)嗅钻,難以轉(zhuǎn)化復(fù)雜模型皂冰。

●對輸入數(shù)據(jù)類型有要求店展,運(yùn)行起來比較慢,且只能支持PC電腦秃流,這也是很多Newsroom后來拋棄它的原因赂蕴。

●本身沒有后端數(shù)據(jù)倉庫,宣稱自己是內(nèi)存BI舶胀,實(shí)際用起來對硬件要求極高概说,對于超千萬條的數(shù)據(jù)分析,必須借助于其他ETL工具處理好數(shù)據(jù)再進(jìn)行前端分析

●無法支持中國式復(fù)雜表樣

●本地化服務(wù)差

●價(jià)格昂貴

image

由此可見嚣伐,工具有很多優(yōu)點(diǎn)糖赔,但也有局限,對于有大量數(shù)據(jù)需求以及比較復(fù)雜的需求時(shí)候還是需要通過代碼實(shí)現(xiàn)轩端,建議感興趣的產(chǎn)品和運(yùn)營可以稍微了解下 python 放典。

image

以上,就是我對深度優(yōu)先與廣度優(yōu)先的遍歷算法的個(gè)人理解以及部分推薦的三個(gè)工具船万,大數(shù)據(jù)時(shí)代的到來刻撒,對數(shù)據(jù)爬取的需求越來越大,讓我們一起學(xué)習(xí)起來耿导。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末声怔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舱呻,更是在濱河造成了極大的恐慌醋火,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箱吕,死亡現(xiàn)場離奇詭異芥驳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)茬高,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門兆旬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怎栽,你說我怎么就攤上這事丽猬。” “怎么了熏瞄?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵脚祟,是天一觀的道長。 經(jīng)常有香客問我强饮,道長由桌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮行您,結(jié)果婚禮上铭乾,老公的妹妹穿的比我還像新娘。我一直安慰自己邑雅,他們只是感情好片橡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布妈经。 她就那樣靜靜地躺著淮野,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吹泡。 梳的紋絲不亂的頭發(fā)上骤星,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機(jī)與錄音爆哑,去河邊找鬼洞难。 笑死,一個(gè)胖子當(dāng)著我的面吹牛揭朝,可吹牛的內(nèi)容都是我干的队贱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼潭袱,長吁一口氣:“原來是場噩夢啊……” “哼柱嫌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屯换,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤编丘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后彤悔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘉抓,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年晕窑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抑片。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杨赤,死狀恐怖敞斋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情望拖,我是刑警寧澤渺尘,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站说敏,受9級特大地震影響鸥跟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一医咨、第九天 我趴在偏房一處隱蔽的房頂上張望枫匾。 院中可真熱鬧,春花似錦拟淮、人聲如沸干茉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽角虫。三九已至,卻和暖如春委造,著一層夾襖步出監(jiān)牢的瞬間戳鹅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工昏兆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留枫虏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓爬虱,卻偏偏與公主長得像隶债,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子跑筝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容