如何判斷一個網頁是否更新?需要去判斷一個網頁是否更新,下面是我已知道的並已經程式碼實現一些方法的總結:
1. 根據http協議頭
在爬網頁時,我們首先會向伺服器傳送head請求,隨後在返回的httpheader資料中,我們可以找到Last-Modifed一欄, 即網頁最後的修改時間。但是這個判斷主要在於靜態頁面,在動態頁面中Last-Modifed只是伺服器最後傳送Response的時間,所以我們將其作為網頁是否更新的一個參考值,設定權重。
2. 透過hash數字簽名
在下載完網頁後我們可以把伺服器返回的資料流先放在一個緩衝區裡,再利用一些演算法生成hash值,然後每次檢視網頁時先生成hash值與第一次的對比,根據差異度可以判斷更新比例。而通常按照漢明距離來計算,三個以內即可判斷未更新。
在這一次的專案中,我使用的是simhash演算法來實現生成網頁hash數字簽名,參考的部落格為:
區域性敏感雜湊演算法,而透過java正式實現可使用的版本:
通常來說,simhash演算法與普通的hash碼的區別在:普通hash演算法對改動過於敏感,並且針對大文字,演算法耗時長,準確度還不高。
而simhash的實現步驟歸於以下四步:
(1)將文章轉換為一組加權的特徵值構成的向量,即對文章進行分詞,而如何去分,就十分考驗大家的水平 了,這次的實現中,我對與英文是按照空格和關聯詞分的,而中文由於不太懂就直接按照逗句號了。
(2)計算hash碼,透過hash演算法將每個詞變成hash值
(3)加權:對hash值根據詞語的權重換算成加權數串,1位正數,0位負,例如10011,權重為4,則變為:4 -4 4 -4 4
(4)合併:對加權後的陣列串,按照每一位進行計算,比如兩個字串 10011 00110 一個權重為4,一個權重 為5,則為4-5 -4-5 -4+5 4+5 4-5 合併為:-1 -9 1 9 -1,然後轉換回hash碼,正數為1,負數為0,即變為 00110
然後我們計算兩個文字的simhash值的漢明距離,其實就是看有多少位的差別,一般少於三位代表兩個網頁為差不多的。
在這個演算法中,如果你直接使用的話,或許會發現simhash對某些改動並不敏感,而如何在兩種方法之間權衡來。
更好的判斷網頁的更新,就需要根據實際情況進行權重選擇。
如何判斷一個網頁是否更新?需要去判斷一個網頁是否更新,下面是我已知道的並已經程式碼實現一些方法的總結:
1. 根據http協議頭
在爬網頁時,我們首先會向伺服器傳送head請求,隨後在返回的httpheader資料中,我們可以找到Last-Modifed一欄, 即網頁最後的修改時間。但是這個判斷主要在於靜態頁面,在動態頁面中Last-Modifed只是伺服器最後傳送Response的時間,所以我們將其作為網頁是否更新的一個參考值,設定權重。
2. 透過hash數字簽名
在下載完網頁後我們可以把伺服器返回的資料流先放在一個緩衝區裡,再利用一些演算法生成hash值,然後每次檢視網頁時先生成hash值與第一次的對比,根據差異度可以判斷更新比例。而通常按照漢明距離來計算,三個以內即可判斷未更新。
在這一次的專案中,我使用的是simhash演算法來實現生成網頁hash數字簽名,參考的部落格為:
區域性敏感雜湊演算法,而透過java正式實現可使用的版本:
通常來說,simhash演算法與普通的hash碼的區別在:普通hash演算法對改動過於敏感,並且針對大文字,演算法耗時長,準確度還不高。
而simhash的實現步驟歸於以下四步:
(1)將文章轉換為一組加權的特徵值構成的向量,即對文章進行分詞,而如何去分,就十分考驗大家的水平 了,這次的實現中,我對與英文是按照空格和關聯詞分的,而中文由於不太懂就直接按照逗句號了。
(2)計算hash碼,透過hash演算法將每個詞變成hash值
(3)加權:對hash值根據詞語的權重換算成加權數串,1位正數,0位負,例如10011,權重為4,則變為:4 -4 4 -4 4
(4)合併:對加權後的陣列串,按照每一位進行計算,比如兩個字串 10011 00110 一個權重為4,一個權重 為5,則為4-5 -4-5 -4+5 4+5 4-5 合併為:-1 -9 1 9 -1,然後轉換回hash碼,正數為1,負數為0,即變為 00110
然後我們計算兩個文字的simhash值的漢明距離,其實就是看有多少位的差別,一般少於三位代表兩個網頁為差不多的。
在這個演算法中,如果你直接使用的話,或許會發現simhash對某些改動並不敏感,而如何在兩種方法之間權衡來。
更好的判斷網頁的更新,就需要根據實際情況進行權重選擇。