【发布时间】:2010-02-17 06:00:03
【问题描述】:
我想构建一个 C# 应用程序:
- 浏览我的收藏夹列表(例如,在 IE 中)
- 检查网站自我上次访问后是否更新
- 显示最近更新的网址列表
第 2 点似乎有问题,因为 C# 的 HttpWebResponse.LastModified 属性不适用于某些博客和其他网站(它报告当前日期和时间)。
有什么想法吗? 谢谢
【问题讨论】:
-
你可以为每个页面创建一个校验和,看看校验和是否改变。
我想构建一个 C# 应用程序:
第 2 点似乎有问题,因为 C# 的 HttpWebResponse.LastModified 属性不适用于某些博客和其他网站(它报告当前日期和时间)。
有什么想法吗? 谢谢
【问题讨论】:
Last-Modified 标头确实不是由某些 Web 服务器设置的,您对此无能为力。对于这些情况,您需要获取 HTML 并对数据进行哈希处理。如果哈希在下一次检索时匹配,则它(很可能)没有改变。
如果 HTML 中存在不断变化的部分,您可以解析 HTML 树并删除其中经常变化的部分,例如 Google Ads。但这开始比仅仅检查标题要付出更多的努力,这取决于您的实际用例是什么,看看它是否值得您付出努力。最后一次尝试使用的一个好工具是HTML Agility Pack
可能产生更好结果的另一种方法是测量页面的两个版本之间的distance,并将高于某个阈值的版本标记为已更新。同样,这在许多情况下都会失败(并且现在会给出误报)。只是把它扔在这里,以防它激发你做一些有用的事情。
【讨论】:
不确定Last-Modified 是否会像您期望的那样工作。来自 RFC:
这个头域的确切含义取决于源服务器的实现和原始资源的性质。对于文件,它可能只是文件系统的最后修改时间。对于具有动态包含部分的实体,它可能是其组成部分的最后修改时间集合中的最新时间。对于数据库网关,它可能是记录的最后更新时间戳。对于虚拟对象,可能是最后一次内部状态发生变化。
我对规范的解释将引导我将Last-Modified 标头设置为动态生成内容(即:PHP 页面)的当前日期/时间。托管页面的服务器实际上不知道所构建内容的最后一次更新时间(一些数据来自一个数据库服务器,另一个来自另一个数据库服务器,两个记录都没有指示更新时间的字段等)。它可以将文件系统时间用于 PHP 文件本身,但这可能连续几个月都不会改变,而渲染的内容每次重新加载都会改变。如果没有开发人员关于使用哪个值的指导,我认为服务器/解释器无法解决这个问题。
不幸的是,我认为您最好的选择是像其他人建议的那样分析页面内容本身,但由于内容方面的动态性,这并不容易准确识别。
【讨论】: