溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

網(wǎng)絡爬蟲過程中5種網(wǎng)頁去重方法簡要介紹

發(fā)布時間:2020-07-07 18:23:14 來源:網(wǎng)絡 閱讀:271 作者:pengdongcheng 欄目:編程語言

一般的,我們想抓取一個網(wǎng)站所有的URL,首先通過起始URL,之后通過網(wǎng)絡爬蟲提取出該網(wǎng)頁中所有的URL鏈接,之后再對提取出來的每個URL進行爬取,提取出各個網(wǎng)頁中的新一輪URL,以此類推。整體的感覺就是自上而下進行抓取網(wǎng)頁中的鏈接,理論上來看,可以抓取整站所有的鏈接。但是問題來了,一個網(wǎng)站中網(wǎng)頁的鏈接是有環(huán)路的。


網(wǎng)絡爬蟲過程中5種網(wǎng)頁去重方法簡要介紹


舉個栗子,在網(wǎng)站首頁中我們可以看到首頁這個鏈接,之后我們在子網(wǎng)頁中也有可能會看到有個鏈接是指向首頁的,可能子子網(wǎng)頁還會有對應的鏈接指向首頁。按照我們之前的邏輯,抓取每個網(wǎng)頁中的所有鏈接,之后對所有的鏈接繼續(xù)抓取。就拿首頁來說,我們首先抓取的就是它,爾后子網(wǎng)頁中又有個鏈接指向首頁,子子網(wǎng)頁還有鏈接指向首頁,如此進行抓取,豈不是會導致網(wǎng)頁重復抓取,其他的網(wǎng)頁根本就沒有機會去抓取了,簡直不敢想象~~要解決這個問題并不難,此時就需要用到網(wǎng)絡爬蟲中了一個重要的知識點,就是網(wǎng)頁去重。


網(wǎng)絡爬蟲過程中5種網(wǎng)頁去重方法簡要介紹


首先介紹一個簡單的思路,也是經常用的一個通用思路。我們將已經爬取過的網(wǎng)頁放到一個列表中去,以首頁為例,當首頁被抓取之后,將首頁放到列表中,之后我們抓取子網(wǎng)頁的時候,如果再次碰到了首頁,而首頁已經被抓取過了,此時就可以跳過首頁,繼續(xù)往下抓取其他的網(wǎng)頁,而避開了將首頁重復抓取的情況,這樣下來,爬取整站就不會出現(xiàn)一個環(huán)路。以這個思路為出發(fā)點,將訪問過的URL保存到數(shù)據(jù)庫中,當獲取下一個URL的時候,就去數(shù)據(jù)庫中去查詢這個URL是否已經被訪問過了。雖然數(shù)據(jù)庫有緩存,但是當每個URL都去數(shù)據(jù)庫中查詢的話,會導致效率下降的很快,所以這種策略用的并不多,但不失為最簡單的一種方式。


網(wǎng)絡爬蟲過程中5種網(wǎng)頁去重方法簡要介紹


第二種方式是將訪問過的URL保存到set中去,通過這樣方式獲取URL的速度很快,基本上不用做查詢。但是這種方法有一個缺點,將URL保存到set中,實際上是保存到內存中,當URL數(shù)據(jù)量很大的時候(如1億條),會導致內存的壓力越來越大。對于小型的爬蟲來說,這個方法十分可取,但是對于大型的網(wǎng)絡爬蟲,這種方法就難以企及了。


網(wǎng)絡爬蟲過程中5種網(wǎng)頁去重方法簡要介紹


第三種方式是將字符進行md5編碼,md5編碼可以將字符縮減到固定的長度。一般來說,md5編碼的長度約為128bit,約等于16byte。在未縮減之前,假設一個URL占用的內存大小為50個字節(jié),一個字節(jié)等于2byte,相當于100byte。由此可見,進行md5編碼之后,節(jié)約了大量的內存空間。通過md5的方式可以將任意長度的URL壓縮到同樣長度的md5字符串,而且不會出現(xiàn)重復的情況,達到去重的效果。通過這種方式很大程度上節(jié)約了內存,scrapy框架采取的方式同md5方式有些類似,所以說scrapy在正常情況下,即使URL的數(shù)量級達到了上億級別,其占用的內存比起set方式也要少得多。


網(wǎng)絡爬蟲過程中5種網(wǎng)頁去重方法簡要介紹


第四種方式是使用bitmap方法將字符進一步壓縮。這種方式的意思是在計算機中申請8個bit,即8個位,每個位由0或者1表示,這是計算機中最小的單元。8個位組成1個byte,一個位代表一個URL的話,為什么一個位可以確定一個URL呢?因為我們可以將一個URL進行一個哈希函數(shù),然后將其映射到位上面去。舉個栗子,假設我們有8個URL,分別對應8個位,然后通過位上面的0和1的狀態(tài),便可以表明這個URL是否存在,通過這種方法便可以進一步的壓縮內存。


網(wǎng)絡爬蟲過程中5種網(wǎng)頁去重方法簡要介紹


但是bitmap方法有一個非常大的缺點,就是它的沖突會非常高,因為同用一個哈希函數(shù),極有可能將兩個不同的URL或者多個不同的URL映射到一個位置上來。實際上這種哈希的方法,它也是set方式的一種實現(xiàn)原理,它將URL進行一種函數(shù)計算,然后映射到bit的位置中去,所以這種方式對內存的壓縮是非常大的。簡單的來計算一下,還是以一億條URL來進行計算,相當于一億個bit,通過計算得到其相當于12500000byte,除以1024之后約為12207KB,大概是12MB的空間。在實際過程中內存的占用可能會比12MB大一些,但是即便是如此,相比于前面三種方法,這種方式以及大大的減少了內存占用的空間了。但是與此同時,該方法產生沖突的可能性是非常大的,所以這種方法也不是太適用的。那么有沒有方法將bitmap這種對內存濃重壓縮的方法做進一步優(yōu)化,讓沖突的可能性降下來呢?答案是有的,就是第五種方式。


網(wǎng)絡爬蟲過程中5種網(wǎng)頁去重方法簡要介紹


第五種方式是bloomfilter,該方法對bitmap進行改進,它可以通過多個哈希函數(shù)減少沖突的可能性。通過這種方式,一方面它既可以達到bitmap方法減少內存的作用,另一方面它又同時起到減少沖突的作用。關于bloomfilter原理及其實現(xiàn),后期肯定會給大家呈上,今天先讓大家有個簡單的認識。Bloomfilter適用于大型的網(wǎng)絡爬蟲,尤其是數(shù)量級超級大的時候,采用bloomfilter方法可以起到事半功倍的效果,其也經常和分布式爬蟲共同配合,以達到爬取的目的。


網(wǎng)絡爬蟲過程中5種網(wǎng)頁去重方法簡要介紹


關于網(wǎng)絡爬蟲過程中去重策略的五種方式的介紹就先到這里了,不懂的就當了解一下了,科普一下下,問題不大,希望對小伙伴們的學習有所幫助。


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI