一個網(wǎng)頁是否更新,是很多爬蟲開發(fā)人員都會碰到的問題,如果只是一次性抓取來使用,那這個問題無關(guān)緊要,抓一遍完事,但是工程中的爬蟲通常需要長期運行,如果內(nèi)容更新,需要及時抓取。
思路1:定期抓取
這是一個常見的獲取更新內(nèi)容的思路,這種方式無狀態(tài),傻瓜式的,我并不需要知道網(wǎng)頁到底更新哪些內(nèi)容,我只要每次拿網(wǎng)頁的內(nèi)容去數(shù)據(jù)庫里去重插入即可。
這種思路問題就是浪費資源。無論對方更新沒有,都得去抓取一遍。
思路2:RSS訂閱
RSS(簡易信息聚合),一種基于XML格式的內(nèi)容包裝和投遞協(xié)議,可以用于同步網(wǎng)頁內(nèi)容,目前適用于博客,新聞等。
這種思路問題是并不是所有網(wǎng)站都提供RSS源的,雖說有萬能的rsshub,但是rsshub也是需要開發(fā)人員自己去維護的。
思路3:If-Modified-Since 狀態(tài)碼
If-Modified-Since: 允許在對應(yīng)的內(nèi)容未被修改的情況下返回304未修改( 304 Not Modified )維基百科,
示例:If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
If-Modified-Since可用于web緩存,它是HTTP header的一個部分,若HTTP響應(yīng)有一個Last-Modified頭,緩存可以使用If-Modified-Since頭來發(fā)出一個條件請求,來查看它是否已經(jīng)改變。
這種思路操作如下:
1 第一次先請求某個網(wǎng)頁,抓取到本地,假設(shè)文件名為 a.html。這時文件系統(tǒng)有個文件的修改時間。
2 第二次訪問網(wǎng)頁,如果發(fā)現(xiàn)本地已經(jīng)有了 a.html,則向服務(wù)器發(fā)送一個 If-Modified-Since 的請求。 把 a.html 的修改時間寫到請求里。
3 如果網(wǎng)頁更新了,服務(wù)器會返回一個 200 的應(yīng)答,這時就重新抓取網(wǎng)頁,更新本地文件。
4 如果網(wǎng)頁沒有更新,服務(wù)器會返回一個304的應(yīng)答。這時就不需要更新文件了。
這種思路的問題是這種方法適用于靜態(tài)網(wǎng)頁的更新,對于動態(tài)從服務(wù)器取數(shù)據(jù)的動態(tài)網(wǎng)頁不適用。
思路4:網(wǎng)頁內(nèi)容相似度比較
這里的網(wǎng)頁內(nèi)容指的是網(wǎng)頁的正文內(nèi)容,不包括訪問量等非關(guān)鍵區(qū)域文本。
網(wǎng)上提供的做法有網(wǎng)頁指紋+海明距離的算法,兩次抓取網(wǎng)頁海明距離越大,變化越大,海明距離的大小需要根據(jù)實際條件調(diào)整。
總結(jié)
網(wǎng)頁判斷更細沒有固定套路,需要根據(jù)項目和網(wǎng)站情況,選擇合適的方法進行判斷。