我正在使用 feedparser python 库从提要中连续提取 RSS 数据。我以这样一种方式编写了我的 python 代码,即我可以请求 RSS 数据的单个实例。这是我目前的代码:
import feedparser
rssPR = feedparser.parse('http://www.prnewswire.co.uk/rss/consumer-technology/wireless- communications-news.rss')
rssDataList = []
for index, item in enumerate(rssPR.entries):
rssDataList.append([item.published.encode('utf-8'), item.title.encode('utf-8')])
print rssDataList[0] #for debugging purposes
print rssPR.modified #for testing purposes
我可以向我的代码添加什么,以便它仅在 RSS 已被修改时才检查新的 RSS 数据?
假设我有一个包含 10 个 RSS 项目的列表,并且 RSS 提要已经更新了 2 个新的 RSS 项目。我如何才能将这两项添加到我创建的 rssDataList 中?我不想继续向我的数据库中添加相同的 RSS。
最佳答案
关于仅当提要发生变化时才下载,您可以使用 HTTP header's ETag
作为后备也Last-Modified
.
>>> feed.etag
'"6c132-941-ad7e3080"'
>>> feed.modified
'Fri, 11 Jun 2012 23:00:34 GMT'
您可以在调用 feedparser.parse
时指定它们。如果它们仍然相同(没有变化),请求将具有状态代码 304(未修改)。
归结为这个例子:
import feedparser
url = 'http://feedparser.org/docs/examples/atom10.xml'
# first request
feed = feedparser.parse(url)
# store the etag and modified
last_etag = feed.etag
last_modified = feed.modified
# check if new version exists
feed_update = feedparser.parse(url, etag=last_etag, modified=last_modified)
if feed_update.status == 304:
# no changes
注意事项:
您需要检查 feed.etag
和 feed.modified
是否存在。
feedparser
库将自动发送带有提供的 etag
参数和 If-Modified- 的
为您提供了 If-None-Match
header Sincemodified
值。
来源:Feedparser documentation about http and etag
澄清评论中提出的问题:
这需要服务器支持这些 header 中的任何一个。
如果两个 header 都不起作用,则您不能使用它,并且必须始终从服务器下载 feed,即使它没有更改,因为在下载它之前您根本无法分辨。
这意味着您每次都必须下载提要,并存储您已经看到的条目。
如果你不想显示你以前看过的东西(例如只打印新的)你无论如何都必须保留一个看到的提要列表。一些提要为每个 条目
都有一个 id
字段,您可以在这种情况下使用它。否则,您必须有点创意才能弄清楚是什么让条目相同,特别是对于您的 Feed。
关于Python 提要解析器 : How can I check for new RSS data?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22211795/