網路爬蟲過程中5種網頁去重方法簡要介紹

2021-09-11 13:32:59 字數 2115 閱讀 2720

一般的,我們想抓取乙個**所有的url,首先通過起始url,之後通過網路爬蟲提取出該網頁中所有的url鏈結,之後再對提取出來的每個url進行爬取,提取出各個網頁中的新一輪url,以此類推。整體的感覺就是自上而下進行抓取網頁中的鏈結,理論上來看,可以抓取整站所有的鏈結。但是問題來了,乙個**中網頁的鏈結是有環路的。

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

首先介紹乙個簡單的思路,也是經常用的乙個通用思路。我們將已經爬取過的網頁放到乙個列表中去,以首頁為例,當首頁被抓取之後,將首頁放到列表中,之後我們抓取子網頁的時候,如果再次碰到了首頁,而首頁已經被抓取過了,此時就可以跳過首頁,繼續往下抓取其他的網頁,而避開了將首頁重複抓取的情況,這樣下來,爬取整站就不會出現乙個環路。以這個思路為出發點,將訪問過的url儲存到資料庫中,當獲取下乙個url的時候,就去資料庫中去查詢這個url是否已經被訪問過了。雖然資料庫有快取,但是當每個url都去資料庫中查詢的話,會導致效率下降的很快,所以這種策略用的並不多,但不失為最簡單的一種方式。

第二種方式是將訪問過的url儲存到set中去,通過這樣方式獲取url的速度很快,基本上不用做查詢。但是這種方法有乙個缺點,將url儲存到set中,實際上是儲存到記憶體中,當url資料量很大的時候(如1億條),會導致記憶體的壓力越來越大。對於小型的爬蟲來說,這個方法十分可取,但是對於大型的網路爬蟲,這種方法就難以企及了。

第三種方式是將字元進行md5編碼,md5編碼可以將字元縮減到固定的長度。一般來說,md5編碼的長度約為128bit,約等於16byte。在未縮減之前,假設乙個url占用的記憶體大小為50個位元組,乙個位元組等於2byte,相當於100byte。由此可見,進行md5編碼之後,節約了大量的記憶體空間。通過md5的方式可以將任意長度的url壓縮到同樣長度的md5字串,而且不會出現重複的情況,達到去重的效果。通過這種方式很大程度上節約了記憶體,scrapy框架採取的方式同md5方式有些類似,所以說scrapy在正常情況下,即使url的數量級達到了上億級別,其占用的記憶體比起set方式也要少得多。

第四種方式是使用bitmap方法將字元進一步壓縮。這種方式的意思是在計算機中申請8個bit,即8個位,每個位由0或者1表示,這是計算機中最小的單元。8個位組成1個byte,乙個位代表乙個url的話,為什麼乙個位可以確定乙個url呢?因為我們可以將乙個url進行乙個雜湊函式,然後將其對映到位上面去。舉個栗子,假設我們有8個url,分別對應8個位,然後通過位上面的0和1的狀態,便可以表明這個url是否存在,通過這種方法便可以進一步的壓縮記憶體。

但是bitmap方法有乙個非常大的缺點,就是它的衝突會非常高,因為同用乙個雜湊函式,極有可能將兩個不同的url或者多個不同的url對映到乙個位置上來。實際上這種雜湊的方法,它也是set方式的一種實現原理,它將url進行一種函式計算,然後對映到bit的位置中去,所以這種方式對記憶體的壓縮是非常大的。簡單的來計算一下,還是以一億條url來進行計算,相當於一億個bit,通過計算得到其相當於12500000byte,除以1024之後約為12207kb,大概是12mb的空間。在實際過程中記憶體的占用可能會比12mb大一些,但是即便是如此,相比於前面三種方法,這種方式以及大大的減少了記憶體占用的空間了。但是與此同時,該方法產生衝突的可能性是非常大的,所以這種方法也不是太適用的。那麼有沒有方法將bitmap這種對記憶體濃重壓縮的方法做進一步優化,讓衝突的可能性降下來呢?答案是有的,就是第五種方式。

第五種方式是bloomfilter,該方法對bitmap進行改進,它可以通過多個雜湊函式減少衝突的可能性。通過這種方式,一方面它既可以達到bitmap方法減少記憶體的作用,另一方面它又同時起到減少衝突的作用。關於bloomfilter原理及其實現,後期肯定會給大家呈上,今天先讓大家有個簡單的認識。bloomfilter適用於大型的網路爬蟲,尤其是數量級超級大的時候,採用bloomfilter方法可以起到事半功倍的效果,其也經常和分布式爬蟲共同配合,以達到爬取的目的。

關於網路爬蟲過程中去重策略的五種方式的介紹就先到這裡了,不懂的就當了解一下了,科普一下下,問題不大,希望對小夥伴們的學習有所幫助。

陣列去重的5種常用方法

1 利用indexof功能的特點 var arr 1 1,2 3,4 6,2 3 var newarr for var i 0 iconsole.log newarr 2 將陣列的每乙個元素依次與其他元素做比較,發現重複元素,刪除 var arr 1 23,1 1,1 3,23 5,6 7,9 9,...

陣列去重的5種方法

這種方法最簡單最直觀,也最容易理解,如下 let arr 2 8,5 0,5 2,6 7,2 6,8 9 let newarr for let i 0 i arr.length i console.log newarr 輸出結果為 2,8,5,0,6,7,9 這種方法很好理解,利用了indexof ...

js中實現陣列去重的5種方法

這是在逛網頁的時候看到的方法,覺得以後會有用到的時候,就先收藏下來,這裡是自己手敲的為了加深印象 function unique1 array return n 判斷瀏覽器是否支援indexof,indexof為ecmascript5新方法,ie8以下 包括ie8,ie8只支援部分ecma5 不支援...