如何判断一个网页是否更新
如何判斷一個網(wǎng)頁是否更新
最近的軟工項(xiàng)目中,我需要去判斷一個網(wǎng)頁是否更新,下面是我已知道的并已經(jīng)代碼實(shí)現(xiàn)一些方法的總結(jié):1. 根據(jù)http協(xié)議頭
? ? ? ? 在爬網(wǎng)頁時,我們首先會向服務(wù)器發(fā)送head請求,隨后在返回的httpheader資料中,我們可以找到Last-Modifed一欄,?即網(wǎng)頁最后的修改時間。但是這個判斷主要在于靜態(tài)頁面,在動態(tài)頁面中Last-Modifed只是服務(wù)器最后發(fā)送Response的時間,所以我們將其作為網(wǎng)頁是否更新的一個參考值,設(shè)置權(quán)重。 URL u = new URL("https://www.zhihu.com/question/51690276/answer/131152090");HttpURLConnection http = (HttpURLConnection) u.openConnection();http.setRequestMethod("HEAD");Date lastModify =new Date(http.getLastModified());System.out.println("最后更新時間:"+lastModify);
2. 通過hash數(shù)字簽名
在下載完網(wǎng)頁后我們可以把服務(wù)器返回的數(shù)據(jù)流先放在一個緩沖區(qū)里,再利用一些算法生成hash值,然后每次查看網(wǎng)頁時先生成hash值與第一次的對比,根據(jù)差異度可以判斷更新比例。而通常按照漢明距離來計(jì)算,三個以內(nèi)即可判斷未更新。在這一次的項(xiàng)目中,我使用的是simhash算法來實(shí)現(xiàn)生成網(wǎng)頁hash數(shù)字簽名,參考的博客為:
局部敏感哈希算法,而通過java正式實(shí)現(xiàn)可使用的版本,在我的下一篇博客中有,歡迎大家去看:
通常來說,simhash算法與普通的hash碼的區(qū)別在:普通hash算法對改動過于敏感,并且針對大文本,算法耗時長,準(zhǔn)確度還不高。
而simhash的實(shí)現(xiàn)步驟歸于以下四步:
(1)將文章轉(zhuǎn)換為一組加權(quán)的特征值構(gòu)成的向量,即對文章進(jìn)行分詞,而如何去分,就十分考驗(yàn)大家的水平 了,這次的實(shí)現(xiàn)中,我對與英文是按照空格和關(guān)聯(lián)詞分的,而中文由于不太懂就直接按照逗句號了。
(2)計(jì)算hash碼,通過hash算法將每個詞變成hash值
(3)加權(quán):對hash值根據(jù)詞語的權(quán)重?fù)Q算成加權(quán)數(shù)串,1位正數(shù),0位負(fù),例如10011,權(quán)重為4,則變?yōu)?#xff1a;4 -4 4 -4 4
(4)合并:對加權(quán)后的數(shù)組串,按照每一位進(jìn)行計(jì)算,比如兩個字符串 10011 00110 一個權(quán)重為4,一個權(quán)重 為5,則為4-5 -4-5 -4+5 4+5 4-5 合并為:-1 -9 1 9 -1,然后轉(zhuǎn)換回hash碼,正數(shù)為1,負(fù)數(shù)為0,即變?yōu)?span style="white-space:pre"> 00110
然后我們計(jì)算兩個文本的simhash值的漢明距離,其實(shí)就是看有多少位的差別,一般少于三位代表兩個網(wǎng)頁為差不多的。
在這個算法中,如果你直接使用的話,或許會發(fā)現(xiàn)simhash對某些改動并不敏感,而如何在兩種方法之間權(quán)衡來
更好的判斷網(wǎng)頁的更新,就需要根據(jù)實(shí)際情況進(jìn)行權(quán)重選擇,在這里就不詳細(xì)描述了。
相關(guān)資料參考:基于局部敏感哈希的協(xié)同過濾算法之simHash算法? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?局部敏感哈希
總結(jié)
以上是生活随笔為你收集整理的如何判断一个网页是否更新的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中了计算机病毒改怎么办,计算机中病毒了怎
- 下一篇: SPSS教程:单因素重复测量方差分析,超