如何确定两个网页是否相同?

时间:2009-01-19 01:33:15

标签: algorithm diff

有哪些技术可以检测网页是否与另一个网页相同?

同样,我不是指char-for-char等价物(这很容易),但足够强大,可以忽略页面上当前日期/时间等内容。

,例如,去雅虎!新闻文章加载页面,10分钟后在另一个浏览器中打开同一页面。 Baring重写,这些页面会有一些差异(时间戳,可能是广告之类的东西,可能是相关故事之类的东西),但人类可以看两者并说它们是相同的。

注意我并没有尝试修复(或依赖)URL规范化。即,弄清楚foo.html& foo.html?bar = bang是一样的。

13 个答案:

答案 0 :(得分:13)

听起来你正在采用一种强有力的方法来衡量两个页面的相似性。

鉴于页面的结构不会发生太大变化,我们可以将问题减少到测试页面上的文本是否大致相同。当然,有关摄影师页面的这种方法the problems alluded to by nickf仍然存在,但如果你主要关注雅虎!新闻或类似这应该没问题。

要与页面进行比较,您可以使用称为“字符串内核”的机器学习方法。这是R套餐和paper上最近slidesvideo lecture的早期{{3}}。

非常粗略地说,字符串内核会查找两个文档共有多少个单词,一对单词,三元组等。如果A和B是两个文档而k是字符串内核,那么k(A,B)的值越高,两个文档越相似。

如果设置阈值t并且仅说两个文档对于k(A,B)>是相同的。你应该有一个合理的方式做你想做的事情。当然,您必须调整阈值以获得最适合您应用的结果。

答案 1 :(得分:5)

您可以使用某种相似性指标(例如cosine similarity)来检测两个页面是否相同。然后,您必须定义一个最小阈值,您可以使用该阈值来接受两个文档是否相同。例如,在应用余弦度量时,我会选择一个最接近1的值,因为它的范围从-1到完全不同,1对于相同。

答案 2 :(得分:5)

对于这类问题,我发现通过学术论文搜索比要求StackOverflow要好得多,在处理具体细节时,专家通常比人群更聪明。

每个webcrawler或搜索引擎都有此问题并已解决。使用基于内核的方法like the accepted answer is suggesting可能有一个很好的方法,但您可能希望从已知可以正常工作的简单技术开始。之后您可以转到内核方法并进行测试,看看它们是否能改善您的结果。

您最好的选择是阅读Henzinger's 2006 paper 'Finding near-duplicate web pages: a large scale evaluation of algorithms'

并且您可能会考虑使用'Fingerprinting by random polynomials' Rabin 1986生成Rabin指纹作为第一步。

答案 3 :(得分:2)

我使用vgrep来做这类事情。

这是一个名为visual-grep的鲜为人知的工具,它依赖于智能眼科设备和视觉皮层等先进技术,可以快速确定并排页面的相同性,并且它非常准确和有效(它应该是因为它已经开发了很长时间了。)

标记社区维基,以防幽默警察今天出局: - )。

答案 4 :(得分:2)

根据您正在做的事情,您可能会对TemplateMaker感兴趣。你给它一些字符串(例如网页),它标记出改变的位。

在您的 Yahoo中!新闻例如,您需要获取一次页面并告诉TemplateMaker学习它。然后你再次获取它并告诉它学习那个。

当你很高兴你的TemplateMaker每次都知道什么是相同的时候,你可以获取另一个页面并询问TemplateMaker它是否与其他模板相匹配。 (如果您对此感兴趣,它会为您提供已经更改的部分。)

答案 5 :(得分:1)

您可以使用Web浏览器组件呈现两个页面的屏幕截图,然后比较图像。可能是最简单的选择。

答案 6 :(得分:0)

如果不仔细了解您要比较的页面结构,那么这可能会非常棘手。也就是说,一台机器应该如何判断一个带有几张不同图片的页面是否相同 - 如果它是一个有广告的新闻网站那么它应该是相同的,但如果它是一个摄影师的投资组合,那么它肯定是不同的。 / p>

如果您确实知道页面的结构,那么我要做的是手动选择页面的一部分(使用ID,CSS选择器,XPath等)进行比较。例如,仅比较页面刷新之间的#content div。从那里,您可能需要为char-by-char比较添加容差级别。

实际上,有一项服务可以做类似的事情。它被称为Rsspect(由Qwantz成名的Ryan North编写),它将检测任何网站的变化并从中创建RSS源,即使您不控制该页面。

答案 7 :(得分:0)

您可以为每个人生成MD5哈希值,然后进行比较。就像你说的那样,很容易。

您正在寻找的是一种比较具有可以更改的任意元素的两个页面的技术。这是一个难题。

  1. 确定页面中可以更改且您不关心的区域。小心!他们总会四处走动。
  2. 哈希或对您关注的页面部分的DOM进行一些校验和。小心!这些也将一直在变化。
  3. 你违反了屏幕抓取的第一条规则:页面本质上是不稳定的。所以这是一个棘手的问题。您的解决方案将足够强大,可以解释您的源数据将受到的各种微妙变化,除非您还可以直接控制源页面,并可以针对此设计您的解决方案。

    祝你好运!我有过尝试解决这个问题的系统的经验,这确实是一个难以破解的难题。

答案 8 :(得分:0)

这样做的方法是不要比较整个页面,因为正如你所说的那样,人类也不会被欺骗。假设您对Yahoo!的新闻文章感兴趣页面,所以你应该看看新闻部分。然后你可以做任何事情,新旧版本之间的哈希或文字比较。

答案 9 :(得分:0)

我想到的第一个想法是使用BeautifulSoup(Python)将页面处理成XML文档,对它们运行差异,并计算不同的行数。如果计数> X%,他们是不同的。不是非常强大,可能容易出错,但这是我为测试做的快速入侵。

您可能需要查看此页面,其中讨论了比较两个XML文档:
    http://www.ibm.com/developerworks/xml/library/x-diff/index.html

可以将html文档强制转换为带有漂亮汤的XML文档,然后使用其中列出的技术进行比较。

答案 10 :(得分:0)

我有类似的问题。我试图为用户提交的链接目录设计一个安全的链接系统。用户将在博客或新闻站点上发布页面并将链接提交给索引。人类会验证链接是否合适,然后将页面添加到索引中。

问题是想出一种自动化检查的方法,确保链接随着时间的推移仍然适用。例如,有人在几周后修改了页面并插入了种族辱骂?新闻网站是否开始告诉人们'你必须订阅阅读这个故事'?

我最终提取了段落< p>元素并将缓存的副本与当前单词进行比较。简单来说:

cached[] = { "Lorem", "Ipsum", "..." };
scanned[] = { "Lorem, "foo", ... };

在那之后,一系列的分拣机会对它进行处理,同时忽略常用词'if but can or and'同时处理权重较大的其他词(亵渎等)。

这导致了一个评分系统,它几乎可以忽略次要编辑和修改(拼写错误,句子结构等),但很快就会发现是否需要再次检查内容。然后返回一个分数,高于阈值的分数将被放入队列中供人重新验证。

这也有助于解释网站的重大外观变化。我不相信它可以完全独立运行,但它确实可以通过人类的一些帮助很好地完成它的工作。不可否认,就方法论而言,该系统的效率并不高。

答案 11 :(得分:0)

您可以尝试使用If-Modified-Since之类的HTTP标头,或其他一些与缓存相关的标头。此外,查看站点地图文件以查看搜索引擎预计检查的频率可能会有所帮助。

我的另一种尝试(可能是结合使用)是列出页面上id中找到的所有classdiv es。如果这些列表不匹配,则可能存在相当明显的变化。否则,它们可能非常相似。

编辑:您还可以比较srcimg元素。

答案 12 :(得分:0)

我最近遇到了这个问题,并在这里开发了一个JavaScript解决方案: https://github.com/kennychua/pdiffy/

它允许您比较页面的图像(最好是无损PNG格式),它会告诉您图像是否不同,如果是,它会突出显示差异。

它还能够忽略您描述的时间戳问题等区域

相关问题