我想构建一个C#应用程序:
第2点似乎有问题,因为C#的HttpWebResponse.LastModified属性不适用于某些博客和其他网站(它报告当前的日期和时间)。
有什么想法吗? 感谢
答案 0 :(得分:5)
Last-Modified标头确实没有被某些Web服务器设置,并且您无法做任何事情。对于这些情况,您需要获取HTML并对数据进行哈希处理。如果哈希在下一次检索时匹配,则它(很可能)没有改变。
如果HTML中存在不断变化的部分,您可以解析HTML树并删除其中通常不断变化的部分,例如Google广告。但是这比仅仅检查标题要花费更多的精力,取决于你的实际用例是什么,看它是否值得你的努力。最后一项努力的一个好工具是HTML Agility Pack
另一种可能产生更好结果的方法是测量页面的两个版本之间的distance并将其标记为更新超过某个阈值的那些版本。同样,在许多情况下,这将失败(现在将给出误报)。把它放在这里,以防它激发你有用的东西。
答案 1 :(得分:1)
不确定Last-Modified是否会像预期的那样发挥作用。来自RFC:
此标头字段的确切含义取决于源服务器的实现和原始资源的性质。对于文件,它可能只是文件系统上次修改时间。对于具有动态包含部分的实体,它可能是其组成部分的最后一组最后修改时间。对于数据库网关,它可能是记录的最后更新时间戳。对于虚拟对象,它可能是内部状态最后一次更改。
我对规范的解释会导致我将Last-Modified标题设置为动态生成内容的当前日期/时间(即:PHP页面)。托管页面的服务器实际上不知道何时构建的内容实际上是最后更新的(一些数据来自另一个数据库服务器,其他记录都没有指示更新时间的字段等)。它可以将文件系统时间用于PHP文件本身,但是在每次重新加载时呈现的内容都会更改,这可能不会在几个月内发生变化。在没有开发人员指导的情况下,我认为服务器/解释器无法解决这个问题。
所以不幸的是,我认为你最好的选择是像其他人一样分析页面内容,但由于动态内容方面的原因,这不容易准确识别。