url去重方案:
1. 通過資料庫進行url的去重,獲取一條資料的時候,將url也儲存到資料庫中,在獲取其他url的時候,先從資料庫中查詢是否存在這個url,如果存在就丟棄,反之就儲存。效率太低。
2. 通過set(),在記憶體中符url進行去重。 對記憶體的占用太高。
eg:100000000條url * 50字元 * 2bytes /1024(kb)/1024(mb)/1024(gb) = 9gb
3. 通過set(),但是不是將url直接儲存在set集合中,而是通過一定的加密方式加密後,將加密後的資料儲存在set集合中。scrapy框架採用的就是這種方式。md5加密之後資料長度變得統一,變成16位的。
100000000條url * 16字元 * 2bytes /1024(kb)/1024(mb)/1024(gb) = 1gb
4. 布隆過濾
100000000條url * 1(bit) /8(bytes)/1024(mb)/1024(gb) = 12mb
(採用多重雜湊對映乙個資料,儲存該資料的狀態 0 1)
100000000條 * 1bit = 12500000byte = 12500kb = 12.5mb
資料有可能出現衝突,但是概率已經很小了
布隆過濾是基於記憶體的,為了保證儲存的狀態不丟失,最好持久化
5.redis去重
大量URL去重
size medium 問題 i 有大量的字串格式的url,如何從中去除重複的,優化時間空間複雜度 i 我的思路,1.將url存入hash鍊錶,b 每個url讀入到hash鍊錶中 b 遇到重複的就捨棄,否則加入到鍊錶裡面,最後遍歷得到所有不重複的url。空間複雜度m,時間複雜度為o n n m m為...
爬蟲URL去重策略
爬蟲為何要進行去重 特點 應用簡單 效率非常低下 使用方法 效率 效率十分低下,並使用很少。不進行計算 特點 速度較快 記憶體占用會越來越大 效率 100000000 2byte 50個字元 1024 1024 1024 9g 特點 md5能將任意長度字串壓縮成固定長度md5字串,並且不會重複。效率...
用redis實現scrapy的url去重與增量爬取
scrapy 自帶了去重方案,通過rfpdupefilter類完成去重,檢視原始碼。def request seen self,request fp self.request fingerprint request if fp in self.fingerprints return true sel...