【问题标题】:How to detect changed and new items in an RSS feed?如何检测 RSS 提要中的更改和新项目?
【发布时间】:2009-03-31 08:39:38
【问题描述】:

使用feedparser 或其他Python 库下载和解析RSS 提要;我怎样才能可靠地检测到new 项目和modified 项目?

到目前为止,我在提要中看到了发布日期早于最新项目的新项目。此外,我还看到提要阅读器将发布的相同项目显示为单独的项目,但内容略有不同。我没有实现提要阅读器应用程序,我只是想要一个合理的策略来归档提要数据。

【问题讨论】:

    标签: python rss feed


    【解决方案1】:

    这取决于您对 Feed 来源的信任程度。 feedparser 为提要项提供了一个 .id 属性——该属性对于 RSS 和 ATOM 源都应该是唯一的。例如,请参见 feedparser 的ATOM docs。尽管 .id 将涵盖大多数情况,但可以想象一个来源可能会发布具有相同 id 的多个项目。在这种情况下,您别无选择,只能对项目的内容进行哈希处理。

    【讨论】:

    • 在我的情况下散列内容是可行的。 item.title 和 item.content 就够了吗?
    • 可能。我关注的一些提要在不更改内容的情况下更改了相同项目的标题;在这些情况下,我可能只关心按内容散列。这取决于您认为每个项目的“基本要素”。
    • 无论如何,解决方案是跟踪接收端的所有“旧”数据,对吗?我要么跟踪我处理过的 ID,要么跟踪我已经处理过的条目的哈希值。如果不检查 RSS 提要中的每个条目或不信任提要的时间戳,就无法识别新条目?
    【解决方案2】:

    feedparser 的documentation 中有两个HTTP Features 可以做到这一点:

    1。使用 ETags 减少带宽

    基本概念是提要发布者在发布提要时可能会提供一个特殊的 HTTP 标头,称为 ETag。您应该在后续请求中将此 ETag 发送回服务器。如果提要自您上次请求以来没有更改,服务器将返回一个特殊的 HTTP 状态代码 (304) 并且没有提要数据。

        import feedparser
        d = feedparser.parse('` <http://feedparser.org/docs/examples/atom10.xml>`_')
        d.etag``'"6c132-941-ad7e3080"'``
        d2 = feedparser.parse('` <http://feedparser.org/docs/examples/atom10.xml>`_', etag=d.etag)
        d2.status``304``
        d2.feed``{}``
        d2.entries``[]``
        d2.debug_message``'The feed has not changed since you last checked, so
        the server sent no data.  This is a feature, not a bug!'
    

    2。使用 Last-Modified 标头来减少带宽

    在这种情况下,服务器会在 HTTP 标头中发布提要的最后修改日期。您可以在后续请求中将其发送回服务器,如果提要没有更改,服务器将返回 HTTP 状态代码 304 并且没有提要数据。

    import feedparser
    d = feedparser.parse('` <http://feedparser.org/docs/examples/atom10.xml>`_')
    d.modified``(2004, 6, 11, 23, 0, 34, 4, 163, 0)``
    d2 = feedparser.parse('` <http://feedparser.org/docs/examples/atom10.xml>`_', modified=d.modified)
    d2.status``304``
    d2.feed``{}``
    d2.entries``[]``
    d2.debug_message``'The feed has not changed since you last checked, so
    the server sent no data.  This is a feature, not a bug!'
    

    【讨论】:

      猜你喜欢
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多