如何判断一个网页是否更新
如何判斷一個網頁是否更新
最近的軟工項目中,我需要去判斷一個網頁是否更新,下面是我已知道的并已經代碼實現一些方法的總結:1. 根據http協議頭
? ? ? ? 在爬網頁時,我們首先會向服務器發送head請求,隨后在返回的httpheader資料中,我們可以找到Last-Modifed一欄,?即網頁最后的修改時間。但是這個判斷主要在于靜態頁面,在動態頁面中Last-Modifed只是服務器最后發送Response的時間,所以我們將其作為網頁是否更新的一個參考值,設置權重。 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數字簽名
在下載完網頁后我們可以把服務器返回的數據流先放在一個緩沖區里,再利用一些算法生成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對某些改動并不敏感,而如何在兩種方法之間權衡來
更好的判斷網頁的更新,就需要根據實際情況進行權重選擇,在這里就不詳細描述了。
相關資料參考:基于局部敏感哈希的協同過濾算法之simHash算法? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?局部敏感哈希
總結
以上是生活随笔為你收集整理的如何判断一个网页是否更新的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中了计算机病毒改怎么办,计算机中病毒了怎
- 下一篇: SPSS教程:单因素重复测量方差分析,超