爬蟲:如何判斷一個網頁已經更新?

惜時如金發表於2019-04-04

一個網頁是否更新,是很多爬蟲開發人員都會碰到的問題,如果只是一次性抓取來使用,那這個問題無關緊要,抓一遍完事,但是工程中的爬蟲通常需要長期執行,如果內容更新,需要及時抓取。

思路1:定期抓取

這是一個常見的獲取更新內容的思路,這種方式無狀態,傻瓜式的,我並不需要知道網頁到底更新哪些內容,我只要每次拿網頁的內容去資料庫裡去重插入即可。 這種思路問題就是浪費資源。無論對方更新沒有,都得去抓取一遍。

思路2:RSS訂閱

RSS(簡易資訊聚合),一種基於XML格式的內容包裝和投遞協議,可以用於同步網頁內容,目前適用於部落格,新聞等。 這種思路問題是並不是所有網站都提供RSS源的,雖說有萬能的rsshub,但是rsshub也是需要開發人員自己去維護的。

思路3:If-Modified-Since 狀態碼

If-Modified-Since: 允許在對應的內容未被修改的情況下返回304未修改( 304 Not Modified )維基百科, 示例:If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

If-Modified-Since可用於web快取,它是HTTP header的一個部分,若HTTP響應有一個Last-Modified頭,快取可以使用If-Modified-Since頭來發出一個條件請求,來檢視它是否已經改變。

這種思路操作如下: 1 第一次先請求某個網頁,抓取到本地,假設檔名為 a.html。這時檔案系統有個檔案的修改時間。

2 第二次訪問網頁,如果發現本地已經有了 a.html,則向伺服器傳送一個 If-Modified-Since 的請求。 把 a.html 的修改時間寫到請求裡。

3 如果網頁更新了,伺服器會返回一個 200 的應答,這時就重新抓取網頁,更新本地檔案。

4 如果網頁沒有更新,伺服器會返回一個304的應答。這時就不需要更新檔案了。

這種思路的問題是這種方法適用於靜態網頁的更新,對於動態從伺服器取資料的動態網頁不適用。

思路4:網頁內容相似度比較

這裡的網頁內容指的是網頁的正文內容,不包括訪問量等非關鍵區域文字。 網上提供的做法有網頁指紋+海明距離的演算法,兩次抓取網頁海明距離越大,變化越大,海明距離的大小需要根據實際條件調整。

總結

網頁判斷更細沒有固定套路,需要根據專案和網站情況,選擇合適的方法進行判斷。

相關文章