代码之家  ›  专栏  ›  技术社区  ›  Bill

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

  •  12
  • Bill  · 技术社区  · 16 年前

    如果一个网页与另一个网页相同,那么有哪些技术可以很好地检测?

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

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

    注意,我并没有试图修复(或依赖)URL规范化。也就是说,找出foo.html&foo.html?bar=bang相同。

    13 回复  |  直到 11 年前
        1
  •  12
  •   Community CDub    8 年前

    听起来你在寻找一种强有力的方法来衡量两页纸的相似性。

    考虑到页面的结构不会改变那么多,我们可以将问题减少到测试页面上的文本是否大致相同。当然,用这种方法 the problems alluded to by nickf 关于一个摄影师的页面仍然存在,但如果你主要关心雅虎!新闻之类的应该没问题。

    要与页面进行比较,可以使用机器学习中的一种方法,称为“字符串内核”。这是早起 paper 最近的一组 slides 在R包和A上 video lecture .

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

    如果您设置了阈值t,并且只说两个文档对于k(a,b)是相同的,那么您应该有一个合理的好方法来做您想要做的事情。当然,您必须调整阈值以获得应用程序的最佳结果。

        2
  •  5
  •   ScArcher2    16 年前

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

        3
  •  5
  •   Community CDub    8 年前

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

    每个网络爬虫或搜索引擎都有这个问题并解决了它。使用基于内核的方法可能是一种很好的方法 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 .

        4
  •  2
  •   community wiki paxdiablo    16 年前

    我用vgrep来做那种事。

    它是一个鲜为人知的工具,称为视觉grep,它依靠先进的技术,如灵敏的视觉设备和视觉皮层,可以很快地同时确定页面的相同性,而且它非常准确和有效(应该是因为它已经开发了很长时间)。

    标记社区wiki,以防幽默警察今天外出:—)。

        5
  •  2
  •   RJHunter    16 年前

    取决于你在做什么,你可能对 TemplateMaker . 你给它一些字符串(比如网页),它会标出那些变化的位。

    在你 雅虎!新闻 例如,您只需获取一次页面,然后告诉模板创建者学习它。然后你再把它拿回来告诉它去学那个。

    当你很高兴你的模板创建者每次都知道相同的内容时,你可以再取一个页面,问模板创建者它是否与其他模板匹配。(它会让你 如果您对此感兴趣,请更改。)

        6
  •  1
  •   Mike Weller    16 年前

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

        7
  •  0
  •   nickf    16 年前

    如果你不知道你要比较的页面的结构,那么这可能是非常棘手的。也就是说,一台机器怎么能告诉你一个有两张不同图片的页面是一样的——如果它是一个有广告的新闻网站,那么它应该是一样的,但是如果它是一个摄影师的作品集,那么它肯定是不同的。

    如果您知道页面的结构,那么我将手动选择页面的各个部分(使用ID、CSS选择器、xpath等)进行比较。例如,只比较 #content 页面刷新之间的分隔。从这里开始,您可能需要向逐字符比较添加一个公差级别。

    实际上,有一种服务可以做类似的事情。它叫 Rsspect (由Qwantz Fame的Ryan North撰写),它可以检测到任何网站的变化,并从中创建一个RSS源,即使你不控制页面。

        8
  •  0
  •   Genericrich    16 年前

    您可以为它们中的每一个生成一个MD5散列,然后进行比较。就像你说的,很简单。

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

    1. 确定页面中可以更改但您不关心的区域。小心!他们总是四处走动。
    2. 散列或对您关心的页面部分的DOM进行校验和。小心!这些也将一直在变化。

    您违反了屏幕抓取的第一条规则:页面本身就是不稳定的。所以这是个棘手的问题。您的解决方案永远都不够强大,无法解释您的源数据将受到的各种各样的细微变化,除非您还可以直接控制源页面,并可以针对这些问题设计解决方案。

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

        9
  •  0
  •   Robert Gould    16 年前

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

        10
  •  0
  •   Josh Smeaton    16 年前

    我想到的第一个想法是用beautifulsoup(python)将页面处理成XML文档,在它们上运行diff,并计算不同的行数。如果计数为>x%,则它们是不同的。不是很健壮,可能容易出错,但这是我在测试中所做的快速黑客攻击。

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

    一个HTML文档可以被强制转换成一个有漂亮汤的XML文档,然后使用上面列出的技术进行比较。

        11
  •  0
  •   Tim Post Samir J M Araujo    16 年前

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

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

    最后,我提取了段落<p>元素,并将缓存副本与当前逐字比较。简单来说:

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

    在那之后,一系列的分拣员会在处理其他单词(亵渎等)时忽略“如果可以,或者可以”和“的普通单词。

    这导致了一个评分系统,除了忽略小的编辑和修订(打字错误、句子结构等),但很快就会发现内容是否需要再次检查。然后返回一个分数,超过阈值的分数将被放入一个队列中,供人重新验证。

    这也有助于解释网站的重大整容变化。我不相信它完全靠自己来运作,但在人类的帮助下,它可以很好地完成它的工作。诚然,就方法论而言,该系统的效率并不如以前那么高。

        12
  •  0
  •   stalepretzel    16 年前

    您可以尝试使用HTTP头,例如if-modified-since,或者其他一些与缓存相关的头。另外,查看一个站点地图文件,看看搜索引擎需要多久检查一次,可能会有所帮助。

    我的另一个尝试(可能是结合使用)是列出 id S和 class 发现在 div 在页面上。如果这些列表不匹配,可能会有相当明显的变化。否则,它们可能非常相似。

    编辑:您也可以比较 src S的 img 元素。

        13
  •  0
  •   Kenny Chua    11 年前

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

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

    它还可以忽略像您描述的时间戳问题这样的区域