【问题标题】:Building a C# application that shows recently updated web sites构建一个显示最近更新的网站的 C# 应用程序
【发布时间】:2010-02-17 06:00:03
【问题描述】:

我想构建一个 C# 应用程序:

  1. 浏览我的收藏夹列表(例如,在 IE 中)
  2. 检查网站自我上次访问后是否更新
  3. 显示最近更新的网址列表

第 2 点似乎有问题,因为 C# 的 HttpWebResponse.LastModified 属性不适用于某些博客和其他网站(它报告当前日期和时间)。

有什么想法吗? 谢谢

【问题讨论】:

  • 你可以为每个页面创建一个校验和,看看校验和是否改变。

标签: c# html


【解决方案1】:

Last-Modified 标头确实不是由某些 Web 服务器设置的,您对此无能为力。对于这些情况,您需要获取 HTML 并对数据进行哈希处理。如果哈希在下一次检索时匹配,则它(很可能)没有改变。

如果 HTML 中存在不断变化的部分,您可以解析 HTML 树并删除其中经常变化的部分,例如 Google Ads。但这开始比仅仅检查标题要付出更多的努力,这取决于您的实际用例是什么,看看它是否值得您付出努力。最后一次尝试使用的一个好工具是HTML Agility Pack

可能产生更好结果的另一种方法是测量页面的两个版本之间的distance,并将高于某个阈值的版本标记为已更新。同样,这在许多情况下都会失败(并且现在会给出误报)。只是把它扔在这里,以防它激发你做一些有用的事情。

【讨论】:

  • 如果页面包含谷歌文字广告,那会失败,是吗?
  • 这些通常是 java 脚本调用,您应该在从服务器返回的内容中看到所有脚本标签,但是如果数据库驱动的网页显示您拥有的日期会发生变化。跨度>
  • 这种方法的问题是页面具有动态元素,例如加载时发生变化的文字广告。其中一些(例如 Google 广告)可以被过滤掉,但这样做可能会变得乏味且不完整。
【解决方案2】:

不确定Last-Modified 是否会像您期望的那样工作。来自 RFC:

这个头域的确切含义取决于源服务器的实现和原始资源的性质。对于文件,它可能只是文件系统的最后修改时间。对于具有动态包含部分的实体,它可能是其组成部分的最后修改时间集合中的最新时间。对于数据库网关,它可能是记录的最后更新时间戳。对于虚拟对象,可能是最后一次内部状态发生变化。

我对规范的解释将引导我将Last-Modified 标头设置为动态生成内容(即:PHP 页面)的当前日期/时间。托管页面的服务器实际上不知道所构建内容的最后一次更新时间(一些数据来自一个数据库服务器,另一个来自另一个数据库服务器,两个记录都没有指示更新时间的字段等)。它可以将文件系统时间用于 PHP 文件本身,但这可能连续几个月都不会改变,而渲染的内容每次重新加载都会改变。如果没有开发人员关于使用哪个值的指导,我认为服务器/解释器无法解决这个问题。

不幸的是,我认为您最好的选择是像其他人建议的那样分析页面内容本身,但由于内容方面的动态性,这并不容易准确识别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-07
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2012-06-27
    相关资源
    最近更新 更多