7

使用feedparser或其他 Python 库来下载和解析 RSS 提要;如何可靠地检测new物品和modified物品?

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

4

2 回答 2

6

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

于 2009-04-01T01:22:33.940 回答
1

feedparser的文档中有两个HTTP 功能可以完成此操作:

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!'
于 2020-11-04T00:10:52.423 回答