一個網頁是否更新,是很多爬蟲開發人員都會碰到的問題,如果只是一次性抓取來使用,那這個問題無關緊要,抓一遍完事,但是工程中的爬蟲通常需要長期執行,如果內容更新,需要及時抓取。
思路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:網頁內容相似度比較
這裡的網頁內容指的是網頁的正文內容,不包括訪問量等非關鍵區域文字。 網上提供的做法有網頁指紋+海明距離的演算法,兩次抓取網頁海明距離越大,變化越大,海明距離的大小需要根據實際條件調整。
總結
網頁判斷更細沒有固定套路,需要根據專案和網站情況,選擇合適的方法進行判斷。