1匪蟀、將url保存到數(shù)據(jù)庫中椎麦,檢查時在數(shù)據(jù)庫中查找。效率太低材彪,頻繁的切換內(nèi)外存观挎。使用mysql做去重,對url地址進行md5查刻,base64加密键兜,加密之后會得到一串字符凤类,判斷字符串是否在mysql表中穗泵,如果在表示已經(jīng)爬取過了,如果不在谜疤,表示沒有爬取佃延,執(zhí)行請求,將加密后的url地址存入表中夷磕。缺點: 但是這個方法對mysql壓力過大履肃,導(dǎo)致崩潰,不推薦
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哈希到同一個位秀菱,導(dǎo)致第二個沒有的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集合和布隆過濾器