1、將url保存到數(shù)據(jù)庫中,檢查時在數(shù)據(jù)庫中查找。效率太低,頻繁的切換內(nèi)外存。使用mysql做去重,對url地址進行md5,base64加密,加密之后會得到一串字符,判斷字符串是否在mysql表中,如果在表示已經(jīng)爬取過了,如果不在,表示沒有爬取,執(zhí)行請求,將加密后的url地址存入表中。缺點: 但是這個方法對mysql壓力過大,導致崩潰,不推薦
2、將url保存到程序內(nèi)存set集合中,查詢速度快,但是占用內(nèi)存太大。

3、與第二種方法類似,只是進一步改進之后,將url通過哈希編碼壓縮在保存在程序內(nèi)存set集合中,相較于第二種方法直接保存,可以大大壓縮存儲空間。scrapy采用此方法。使用scrapy_redis的去重策略,會將已經(jīng)爬取的url地址經(jīng)過編碼后存入redis,并且會做數(shù)據(jù)持久化,當爬蟲再次啟動時,會重新加載本地的數(shù)據(jù),對爬蟲的url做去重。缺點:如果數(shù)據(jù)量較大的時候,會占用較多的內(nèi)存空間。
4、用bitmap方法,將訪問過的URL通過hash函數(shù)映射到某一位。這個方法將url通過哈希算法進一步壓縮空間至某位上,存儲空間大大減小,但是沖突率很高,很有可能兩個不同的url哈希到同一個位,導致第二個沒有的url被判斷為已存在。
5、布隆過濾器:通過boolmfilter算法壓縮url,在壓縮存儲空間的同時,也 大大降低沖突率,一億url經(jīng)過布隆過濾器后大約為11 M存儲空間。布隆過濾器呢,原理是這樣的,一個URL過來,通過M個特別的哈希函數(shù)對其進行運算,映射成一個M維位數(shù)組的M個維度。新的URL誕生時,進行同樣操作并逐個與set中的位數(shù)組做“與”運算,若結(jié)果改變則說明URL一定沒有被抓取過,若結(jié)果一致則說明URL有一定概率被抓取過。布隆過濾器的插入和查詢效率都是O(M),遠低于其他一般策略。
常用方法:
redis集合和布隆過濾器