1)mysql
使用scrapy自帶的set集合去重,當程序結束的時候會被清空,缺點:再次運行會致使數據重複。redis
2)sql
使用mysql作去重,對url地址進行md5,base64加密,加密以後會獲得一串字符,判斷字符串數據結構
是否在mysql表中,若是在表示已經爬取過了,若是不在,表示沒有爬取,執行請求,將加密後的urlscrapy
地址存入表中。缺點: 可是這個方法對mysql壓力過大,致使崩潰,不推薦函數
3)編碼
使用scrapy_redis的去重策略,會將已經爬取的url地址通過編碼後存入redis,而且會作數據持久化,當爬蟲再次啓動時,會從新加載本地的數據,對爬蟲的url作去重。缺點:若是數據量較大的時候,會佔用較多的內存空間加密
4)url
使用布隆去重,採用多重哈希,將url地址映射到位陣列中的某個點上,空間和時間利用率更高(推薦).net
若是想判斷一個元素是否是在一個集合裏,通常想到的是將全部元素保存起來,而後經過比較肯定。鏈表,樹等等數據結構都是這種思路. 可是隨着集合中元素的增長,咱們須要的存儲空間愈來愈大,檢索速度也愈來愈慢。不過世界上還有一種叫做散列表(又叫哈希表,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 版權聲明:本文爲博主原創文章,轉載請附上博文連接!