【问题标题】:How to tell when a web page has changed by x% in VB.net?如何判断 VB.net 中的网页何时更改了 x%?
【发布时间】:2011-07-26 23:24:58
【问题描述】:

我正在尝试编写一个小实用程序,它会定期检查并告诉我网页(可能是任何 URL)的内容是否/何时发生了变化。我已经阅读了其他帖子,但他们并没有真正回答我的问题(据我所知)。

我知道静态页面有一个最后修改的标题。但是,动态页面呢?我得到了 Oli 的评论,即存储内容的哈希值是可行的,但这并不是真正的想法,因为页面上可能只是有一个时间戳(生成页面的日期时间)。显然,在这种情况下,即使没有任何重大变化,每个请求的内容也会有所不同。

所以,现在我正在考虑将其与“变化”的百分比联系起来。例如,超过 5% 的更改将导致“更改”逻辑运行。

我很想听听有关如何以有意义的方式可靠地判断页面何时发生更改的任何想法。

【问题讨论】:

    标签: .net vb.net http-headers


    【解决方案1】:

    一种解决方案是确定动态页面的静态部分,如果它们被更新,您会认为这些部分发生了“变化”。使用diff 工具(下面的示例)将原始页面源与更新的页面源进行比较。但是,如果您有几十个页面,则为页面的每个实例手动确定这些部分不一定能很好地扩展。

    两个想法:

    1) 使用HTMLAgilityPack(.NET 库)解析页面 DOM,并对存储的、先前扫描的页面和最近扫描的页面执行不同页面元素的计数。使用您认为满意的公式来标记“更改”。一个非常简单的例子是旧副本有 8 个锚点 <a> 标签,而新副本只有 5 个。

    2) 使用差异库 DiffPlex http://diffplex.codeplex.com/ 来确定单词和行的变化。您将需要通过分析提出一个更改基线,用于添加会触发有效“更改”的单词和行添加。

            var d = new Differ();
            var inlineBuilder = new InlineDiffBuilder(d);
            var result = inlineBuilder.BuildDiffModel(OldText, NewText);
            int inserted, deleted, modified = 0;
            foreach (var line in result.Lines)
            {
    
                if(line.Type == ChangeType.Inserted)
                    inserted++;
                else if(line.Type == ChangeType.Deleted)
                   deleted++;
                else if (line.Type == ChangeType.Modified)
                    modified++;
    
    
            }
            // some base line formula/threshold you come up with through analysis
            if (deleted + inserted + modifed > 10)
               changed = true;
        }
    

    【讨论】:

    • 你的第二个想法正是我所需要的。谢谢一百万!
    【解决方案2】:

    您无需编写自己的代码即可执行此操作。 diff 的不同实现有很多很多例子。 Diff 会告诉您比您需要的更多(它会告诉您具体发生了什么变化),但它应该可以解决您的问题。

    【讨论】:

      【解决方案3】:

      在确定页面的新版本与您存储的内容之间的差异时,您可能需要考虑使用 Levenshtein 距离。

      http://en.wikipedia.org/wiki/Levenshtein_distance

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多