如何判斷一個(gè)網(wǎng)頁是否更新?需要去判斷一個(gè)網(wǎng)頁是否更新,下面是我已知道的并已經(jīng)代碼實(shí)現(xiàn)一些方法的總結(jié):
1.根據(jù)http協(xié)議頭
在爬網(wǎng)頁時(shí),我們首先會(huì)向服務(wù)器發(fā)送head請(qǐng)求,隨后在返回的httpheader資料中,我們可以找到Last-Modifed一欄,即網(wǎng)頁最后的修改時(shí)間。但是這個(gè)判斷主要在于靜態(tài)頁面,在動(dòng)態(tài)頁面中Last-Modifed只是服務(wù)器最后發(fā)送Response的時(shí)間,所以我們將其作為網(wǎng)頁是否更新的一個(gè)參考值,設(shè)置權(quán)重。
2.通過hash數(shù)字簽名
在下載完網(wǎng)頁后我們可以把服務(wù)器返回的數(shù)據(jù)流先放在一個(gè)緩沖區(qū)里,再利用一些算法生成hash值,然后每次查看網(wǎng)頁時(shí)先生成hash值與第一次的對(duì)比,根據(jù)差異度可以判斷更新比例。而通常按照漢明距離來計(jì)算,三個(gè)以內(nèi)即可判斷未更新。
在這一次的項(xiàng)目中,我使用的是simhash算法來實(shí)現(xiàn)生成網(wǎng)頁hash數(shù)字簽名,參考的博客為:
局部敏感哈希算法,而通過java正式實(shí)現(xiàn)可使用的版本:
通常來說,simhash算法與普通的hash碼的區(qū)別在:普通hash算法對(duì)改動(dòng)過于敏感,并且針對(duì)大文本,算法耗時(shí)長,準(zhǔn)確度還不高。
而simhash的實(shí)現(xiàn)步驟歸于以下四步:
(1)將文章轉(zhuǎn)換為一組加權(quán)的特征值構(gòu)成的向量,即對(duì)文章進(jìn)行分詞,而如何去分,就十分考驗(yàn)大家的水平了,這次的實(shí)現(xiàn)中,我對(duì)與英文是按照空格和關(guān)聯(lián)詞分的,而中文由于不太懂就直接按照逗句號(hào)了。
(2)計(jì)算hash碼,通過hash算法將每個(gè)詞變成hash值
(3)加權(quán):對(duì)hash值根據(jù)詞語的權(quán)重?fù)Q算成加權(quán)數(shù)串,1位正數(shù),0位負(fù),例如10011,權(quán)重為4,則變?yōu)椋?-44-44
(4)合并:對(duì)加權(quán)后的數(shù)組串,按照每一位進(jìn)行計(jì)算,比如兩個(gè)字符串1001100110一個(gè)權(quán)重為4,一個(gè)權(quán)重為5,則為4-5-4-5-4+54+54-5合并為:-1-919-1,然后轉(zhuǎn)換回hash碼,正數(shù)為1,負(fù)數(shù)為0,即變?yōu)?0110
然后我們計(jì)算兩個(gè)文本的simhash值的漢明距離,其實(shí)就是看有多少位的差別,一般少于三位代表兩個(gè)網(wǎng)頁為差不多的。
在這個(gè)算法中,如果你直接使用的話,或許會(huì)發(fā)現(xiàn)simhash對(duì)某些改動(dòng)并不敏感,而如何在兩種方法之間權(quán)衡來。
更好的判斷網(wǎng)頁的更新,就需要根據(jù)實(shí)際情況進(jìn)行權(quán)重選擇。