如何判断一个网页是否更新

如何判断一个网页是否更新

最近的软工项目中,我需要去判断一个网页是否更新,下面是我已知道的并已经代码实现一些方法的总结:

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算法   

                                           局部敏感哈希



你可能感兴趣的:(simhash,网页更新)