【发布时间】:2014-07-13 21:28:58
【问题描述】:
我正在使用 feedparser (Python) 从多个网站获取一些 RSS 条目。
如何使用 feedparser 进行异步请求?我的意思是,我想获得一些 RSS 条目,但我不想等待响应。当我从 feedparser 请求中获得响应时,应该调用一个回调函数。在请求之后(可能在回复之前)我想做一些计算。
谢谢大家, 雨果
【问题讨论】:
标签: python asynchronous rss feedparser
我正在使用 feedparser (Python) 从多个网站获取一些 RSS 条目。
如何使用 feedparser 进行异步请求?我的意思是,我想获得一些 RSS 条目,但我不想等待响应。当我从 feedparser 请求中获得响应时,应该调用一个回调函数。在请求之后(可能在回复之前)我想做一些计算。
谢谢大家, 雨果
【问题讨论】:
标签: python asynchronous rss feedparser
2019 年更新
使用异步
import aiohttp
import asyncio
import async_timeout
import feedparser
import pprint
INTERVAL = 60
async def fetch(session, url):
with async_timeout.timeout(10):
async with session.get(url) as response:
return await response.text()
async def fetchfeeds(loop, feedurls, ircsock):
last_entry = None
feeds = []
for url in feedurls:
feeds.append({'url':url, 'last':""})
while True:
for feed in feeds:
async with aiohttp.ClientSession(loop=loop) as session:
html = await fetch(session, feed['url'])
rss = feedparser.parse(html)
if feed['last']:
if feed['last']['title'] != rss['entries'][0]['title'] and feed['last']['link'] != rss['entries'][0]['link']:
print("new entry")
feed['last'] = rss['entries'][0]
print("MSG {}".format(feed['last']['title']))
print("MSG {}".format(feed['last']['link']))
else:
feed['last'] = rss['entries'][0]
await asyncio.sleep(INTERVAL)
loop = asyncio.get_event_loop()
loop.run_until_complete(fetchfeeds(loop, ['https://n-o-d-e.net/rss/rss.xml',
"http://localhost:8000/rss.xml"], None))
【讨论】:
您最好将获取与解析解耦。 Feedparser 是一个了不起的解析库,但可能不是最好的 HTTP 客户端库。幸运的是,这很容易做到,因为 Feedparser 也可以parse a blob of text。
然后,这意味着您可以选择任何 HTTP 库 来实际执行轮询,只要它支持您的异步要求。您可能最终会使用 Twisted 及其 WebClient 之类的东西。
另一种解决方案当然是避免自己进行所有昂贵的轮询,并依赖像 Superfeedr 这样的解决方案,它将使用 webhook 仅向您发送给定提要中的新内容。
【讨论】: