爬蟲的增量式抓取和資料更新

2021-09-22 07:58:38 字數 1606 閱讀 8246

不管是產生新頁面,還是原本的頁面更新,這種變化都被稱為增量, 而爬取過程則被稱為增量爬取。那如何進行增量式的爬取工作呢?回想一下爬蟲的工作流程:

傳送url請求 ----- 獲得響應 ----- 解析內容 ----- 儲存內容

我們可以從幾種思路入手:

不難發現,其實增量爬取的核心是去重, 至於去重的操作在哪個步驟起作用,只能說各有利弊,就像我說的,everything is tradeoff。

在我看來,前兩種思路需要根據實際情況取乙個(也可能都用)。第一種思路適合不斷有新頁面出現的**,比如說**的新章節,每天的最新新聞等等;第二種思路則適合頁面內容會更新的**。第三個思路是相當於是最後的一道防線。這樣做可以最大程度上達到去重的目的。

最簡單的去重方式自然是將所有訪問過的url和其對應的內容儲存下來,然後過一段時間重新爬取一次並進行比較,然後決定是否需要覆蓋。這顯然是不實際的,因為會消耗很多資源。目前比較實際的做法就是給url或者其內容(取決於這個**採用哪種更新方式)上乙個標識,這個標識有個比較好聽的名字,叫資料指紋

這裡很容易想到的一種資料指紋就是雜湊值,根據雜湊函式的特性,我們可以為任意內容生成乙個獨一無二的定長字串,之後只要比較這個雜湊值就行了。雜湊值是乙個很偉大的發明,幾乎在任何地方都有它的影子,它利用數學特性,計算機只要經過簡單的計算就可以得到唯一的特徵值,這個計算過程的開銷基本可以忽略不計,當然這是題外話了。

不過即使用了雜湊值,你仍需要乙個地方儲存所有的雜湊值,並且要能做到方便的取用。如果你的儲存介質是資料庫,一般的資料庫系統都能提供索引,如果把雜湊值作為唯一索引呢,這應該是可行的。有些資料庫也提供查詢後再插入的操作,不過本質上應該也是索引。和雜湊值類似的還有md5校驗碼,殊途同歸。

除了自建指紋,其實在傳送請求時還有一些技巧,比如說304狀態碼,last-modified欄位,檔案大小和md5簽名。具體參考[8],很好理解,就不細說了。

綜上所述,在資料量不大的時候,幾百個或者就幾千個的時候,簡單自己寫個小函式或者利用集合的特性去重就行了。如果資料量夠大,資料指紋的價值就體現出來了,它可以節省可觀的空間,同時可以引入bloomfilter作為去重的手段。另外,如果要對資料做持久化(簡單說就是去重操作不會被事故影響,比如說斷電),就需要用到redis資料庫

python的redis客戶端庫也是開源的,位址是:redis-py。不過在開始之前,你首先需要乙個有redis資料庫執行的主機(搭建乙個很簡單)。

但應該如何將這一特性融入到爬蟲中呢?如果是自己寫的爬蟲**,新增上述**即可;如果使用的是scrapy框架,我們可以在middleware上下功夫,在spider模組收到要處理的url時,寫乙個spider中介軟體用來判斷這條url的指紋是否在redis資料庫中存在,如果存在的話,就直接捨棄這條url;如果是要判斷頁面的內容是否更新,可以在download中介軟體中新增**來校驗,原理一樣。當然,資料庫的操作可以用類似write()和query()的方法進行封裝,此處不表。

參考:(1).

(2).   = python爬蟲定時增量更新資料

網路爬蟲 資料抓取,反爬蟲(更新版)

想要反網路爬蟲,首先需要了解網路爬蟲,基本概念不說了,這裡主要對網路爬蟲的特徵進行闡述 反爬蟲的思路主要是區別爬蟲和正常人工訪問的區別,進行策反,所以發爬蟲需要兩步走,第一步識別,第二部策反 識別的思路主要是根據爬蟲的特徵,但需要考慮人工操作,大體來說,識別分為以下常見方式 識別 低成本高收益的是普...

分布式爬蟲的部署以及增量式爬蟲的作用

分布式 概念 需要搭建乙個分布式的機群,然後在機群的每一台電腦中執行同一組程式,讓其對某乙個 的資料進行聯合分布爬取。原生的scrapy框架是不可以實現分布式?因為排程器不可以被共享 管道不可以被共享 如何實現分布式?scrapy scrapy redis實現分布式 scrapy redis元件的作...

爬蟲案例(1) 抓取京東的手機資料

1.需求分析 訪問京東 的首頁,搜尋手機,分析頁面,抓取一下商品的資訊 商品 標題 商品詳情頁 在這個過程中我們可以通過京東 進行分析,獲取到我們需要的資訊,在分析過程中我們會看到 有兩個名稱spu和sku。接下來就需要了解一下spu和sku的概念 spu standard product unit...