1)
使用scrapy自帶的set集合去重,當程序結束的時候會被清空,缺點:再次運行會導致數據重復。
2)
使用mysql做去重,對url地址進行md5,base64加密,加密之后會得到一串字符,判斷字符串
是否在mysql表中,如果在表示已經爬取過了,如果不在,表示沒有爬取,執行請求,將加密后的url
地址存入表中。缺點: 但是這個方法對mysql壓力過大,導致崩潰,不推薦
3)
使用scrapy_redis的去重策略,會將已經爬取的url地址經過編碼后存入redis,並且會做數據持久化,當爬蟲再次啟動時,會重新加載本地的數據,對爬蟲的url做去重。缺點:如果數據量較大的時候,會占用較多的內存空間
4)
使用布隆去重,采用多重哈希,將url地址映射到位陣列中的某個點上,空間和時間利用率更高(推薦)
如果想判斷一個元素是不是在一個集合里,一般想到的是將所有元素保存起來,然后通過比較確定。鏈表,樹等等數據結構都是這種思路. 但是隨着集合中元素的增加,我們需要的存儲空間越來越大,檢索速度也越來越慢。不過世界上還有一種叫作散列表(又叫哈希表,Hash table)的數據結構。它可以通過一個Hash函數將一個元素映射成一個位陣列(Bit Array)中的一個點。這樣一來,我們只要看看這個點是不是 1 就知道可以集合中有沒有它了。這就是布隆過濾器的基本思想。
Hash面臨的問題就是沖突。假設 Hash 函數是良好的,如果我們的位陣列長度為 m 個點,那么如果我們想將沖突率降低到例如 1%, 這個散列表就只能容納 m/100 個元素。顯然這就不叫空間有效了(Space-efficient)。解決方法也簡單,就是使用多個 Hash,如果它們有一個說元素不在集合中,那肯定就不在。如果它們都說在,雖然也有一定可能性它們在說謊,不過直覺上判斷這種事情的概率是比較低的。
布隆去重的優點和缺點
優點
相比於其它的數據結構,布隆過濾器在空間和時間方面都有巨大的優勢。布隆過濾器存儲空間和插入/查詢時間都是常數。另外, Hash 函數相互之間沒有關系,方便由硬件並行實現。布隆過濾器不需要存儲元素本身,在某些對保密要求非常嚴格的場合有優勢
缺點
但是布隆過濾器的缺點和優點一樣明顯。誤算率(False Positive)是其中之一。隨着存入的元素數量增加,誤算率隨之增加。但是如果元素數量太少,則使用散列表足矣。
---------------------
作者:一篇藍天
來源:CSDN
原文:https://blog.csdn.net/qq_41676216/article/details/80830036
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!