1. 程式人生 > >爬蟲去重策略對比

爬蟲去重策略對比

去重策略

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)是其中之一。隨著存入的元素數量增加,誤算率隨之增加。但是如果元素數量太少,則使用散列表足矣。

相關推薦

爬蟲策略對比

去重策略1)使用scrapy自帶的set集合去重,當程式結束的時候會被清空,缺點:再次執行會導致資料重複。2)使用mysql做去重,對url地址進行md5,base64加密,加密之後會得到一串字元,判斷字串是否在mysql表中,如果在表示已經爬取過了,如果不在,表示沒有爬取,

第四篇 爬蟲策略,以及編碼問題

english sci 不同 方法 查看 traceback 爬蟲 ascii error:    unicode和utf-8編碼 PS:數據在內存裏,使用unicode編碼會方便很多,因為這樣占用的bit是統一的,而utf8對於不同的語言占用的bit不

爬蟲策略

只需要 策略 哈希 內存 ash MF 通過 IT rap 1、將訪問過的url保存到數據庫中。(效率非常低) 2、將訪問過的url保存到set中,只需要o(1)的代價就可以查詢url。(內存占用大)(1億條url占用6個G) 3、url經過md5等方法哈希後保存到set中

python爬蟲策略

python爬蟲去重策略 1、將訪問過的URL儲存到資料庫中 2、將訪問過的URL儲存到set中,只需要o(1)的代價就可以查詢URL        1000000000*2byte*50個字元/1024/10

邊學邊敲邊記之爬蟲系列(三):url策略及實現

一、前言 今天給大家分享的是,Python爬蟲裡url去重策略及實現。 二、url去重及策略簡介 1.url去重     從字面上理解,url去重即去除重複的url,在爬蟲中就是去除已經爬取過的url,避免重複爬取,既影響爬蟲效率,又產生冗

爬蟲策略

一 1 儲存到資料庫 2 儲存到set( 佔用空間大) 3 url經過md5等方法雜湊後儲存到set中  (scrapy採用了類似方法) 4 用bitmap方法,將訪問過的url通過hash函式對映到某一位(易衝突) 5 bloomfilter方法進行改造,多重hash函式

網路爬蟲:URL策略之布隆過濾器(BloomFilter)的使用

前言:   最近被網路爬蟲中的去重策略所困擾。使用一些其他的“理想”的去重策略,不過在執行過程中總是會不太聽話。不過當我發現了BloomFilter這個東西的時候,的確,這裡是我目前找到的最靠譜的一種方法。   如果,你說URL去重嘛,有什麼難的。那麼你可

scrapy 策略修改

1、首先自定義一個‘duplication.py’檔案: class RepeatFilter(object): def __init__(self): """ 2、物件初始化 """ self.visited_set = se

RocketMQ學習筆記(14)----RocketMQ的策略

1. Exactly Only Once   (1). 傳送訊息階段,不允許傳送重複的訊息   (2). 消費訊息階段,不允許消費重複的訊息。   只有以上兩個條件都滿足情況下,才能認為訊息是“Exactly Only Once”,而要實現以上兩點,在分散式系統環   境下,不可避免要產生巨大的開銷。

【應用演算法】資訊流-推薦系統的策略

聊兩個問題,它們看似和推薦系統沒有必然關係,但實際上, 在你構建自己的推薦系統的時候,不可避免地會遇到這兩個問題。 去重是剛需 在推薦系統中,有一個剛需就是去重,那麼說在哪些地方有去重的需求呢? 主要是在兩個地方:一個是內容源去重,另一個是不重複給使用者推薦。

JS 陣列對比兩個陣列之間有相同的值或物件就刪除

建立了兩個陣列,並且封裝了一個函式以供呼叫。 var arr1 = [a,b,c,d],arr2 = [a,c,d,f]; this.arrayWeightRemoval(arr1,arr2); //返回結果 [b,f] ; // 資料去重 this.arrayWeightRem

關於python爬蟲問題

我有一篇文章寫的關於爬豬八戒網的一些公司名,但是有重複,怎麼去重? for result in results:if result.text not in res:res.append(result.text)count+=1 可以新增一個list,把你爬下的內容放進

資料對比公共類

package com.cattsoft.project.fzp.comm.util; import com.cattsoft.comm.tools.StringUtil; import java.util.*; public class ContrastDataUtil { /**

爬蟲資料

使用資料庫建立關鍵欄位(一個或者多個)建立索引進行去重 根據url地址進行去重 使用場景:url地址對應的資料不會變的情況,url地址能夠唯一判別一條資料的情況 思路:   url存在Redis中   拿到url地址,判斷url在Redis的集合中是否存在     存在:說明url地址已經被請求過

網路爬蟲過程中5種網頁方法簡要介紹

一般的,我們想抓取一個網站所有的URL,首先通過起始URL,之後通過網路爬蟲提取出該網頁中所有的URL連結,之後再對提取出來的每個URL進行爬取,提取出各個網頁中的新一輪URL,以此類推。整體的感覺就是自上而下進行抓取網頁中的連結,理論上來看,可以抓取整站所有的連結。但是問題來了,一個網站中網頁的連結是有

MYSQL 觸發器 並且允許空值重複的策略

DELIMITER // CREATE TRIGGER `kill_repeats` BEFORE INSERT ON `table_name` FOR EACH ROW BEGIN if NEW.name1<>'' and NEW.name1 in (select na

BloomFilter(大資料)+Redis(持久化)策略

之前在重構一套文章爬蟲系統時,其中有塊邏輯是根據文章標題去重,原先去重的方式是,插入文章之前檢查待插入文章的標題是否在ElasticSearch中存在,這無疑加重了ElasticSearch的負擔也勢必會影響程式的效能! BloomFilter演算法 簡介:布隆過濾器實際上

python爬蟲url

1.url去重     從字面上理解,url去重即去除重複的url,在爬蟲中就是去除已經爬取過的url,避免重複爬取,既影響爬蟲效率,又產生冗餘資料。 2.url去重策略     從表面上看,url去重策略就是消除url重複的方法,常見的url去重策略有五種,如下:

使用scrapy-deltafetch實現爬蟲增量

scrapy-deltafetch簡介 scrapy-deltafetch通過Berkeley DB來記錄爬蟲每次爬取收集的request和item,當重複執行爬蟲時只爬取新的item,實現增量去重,提高爬蟲爬取效能。 Berkeley DB簡介 Berkeley DB是一個

List的三種方式及效率對比

對List去重並保證新增順序主要有三種方式: 方式一,利用HashSet不能新增重複資料的特性 由於HashSet不能保證新增順序,所以只能作為判斷條件: private static void removeDuplicate(List<String> lis