python爬蟲去重策略 爬蟲去重策略

2021-10-11 20:30:23 字數 896 閱讀 5592

下面我會從程式、資料庫等幾個層面詳細敘述一下相應的去重策略。

程式層面,像十萬以下url的抓取可以簡單的用set來實現去重。如果是百萬或者千萬量級的話,考慮到效能,我們應該使用基於hash的set實現去重。知道了前面雜湊的知識,你肯定就懂這是為什麼了。雜湊使得我們並不需要對比超長的url以及params,只需要對比其雜湊值。但是仔細想一下,會存在這樣乙個問題,就是如果set中存在這個雜湊值,並不能說明此url被抓取過。仔細想想為什麼呢?留給讀者思考。但是能保證的是,如果雜湊值不在set內,那此url肯定沒有被抓取過,這樣就達成了我們的目的:在千萬url量級下,我們並不需要保證每乙個url都被訪問僅一次,而只需要保證絕大多數url沒有被重複訪問就ok了。

可能還有小夥伴會問,如果量級再大呢?其實像筆者,就做過上億量級url的抓取,這時候基於hash的set策略可能效果也並不理想。所以我們需要更優的策略。於是,bloom filter(中文布隆過濾器)演算法成了我們新的選擇。布隆過濾器呢,原理是這樣的,乙個url過來,通過m個特別的雜湊函式對其進行運算,對映成乙個m維位陣列的m個維度。新的url誕生時,進行同樣操作並逐個與set中的位陣列做「與」運算,若結果改變則說明url一定沒有被抓取過,若結果一致則說明url有一定概率被抓取過。布隆過濾器的插入和查詢效率都是o(m),遠低於其他一般策略。

以上是程式層面我們能做的處理,下面介紹一下資料庫層面去重我們可以做的事。舉兩個例子吧,第一像mysql這種關係型資料庫,我們可以設定主鍵或者唯一索引來保證資料的唯一性。第二像mongodb這種schema free的非關係型資料庫,我們可以用先檢索再插入或者是upsert的方式保證資料的唯一性。

另外,基於記憶體的redis資料庫其高速的讀寫以及redis hash特性也使得它能勝任去重資料庫的需求。

部落格中現有**模擬登入**實現、豆瓣模擬登入**和自動頂帖**實現以及cookie的相關知識講解。

python爬蟲去重策略 爬蟲去重策略

1 使用scrapy自帶的set集合去重,當程式結束的時候會被清空,缺點 再次執行會導致資料重複。2 使用mysql做去重,對url位址進行md5,base64加密,加密之後會得到一串字元,判斷字串 是否在mysql表中,如果在表示已經爬取過了,如果不在,表示沒有爬取,執行請求,將加密後的url 3...

python爬蟲去重策略 爬蟲的去重策略

1.爬蟲時將爬取過的url存放到資料庫中,利用資料庫進行url的去重 每請求乙個url之前,都現在資料庫中查詢一下。方法最簡單,效率是最低的。2.將已經請求過的url儲存到set中,而set集合是在記憶體中建立的,訪問效率比資料庫的方式要快很多,只需要很簡單的乙個方法,就可以實現url的去重。缺點 ...

爬蟲去重策略

爬蟲去重策略 將訪問過的url儲存到資料庫中。最簡單的方式。即使資料庫有快取,但每次都從資料庫中查詢url,效率低下。將訪問過的url儲存到set中,只需要o 1 的代價就可以查詢url url經過md5等方法雜湊後儲存到set中 使用bitmap方法,將訪問過的url通過hash函式對映到某一位 ...