2024-04-24 21:50:26 发布
网友
我使用feedparser(Python)从几个网站获取一些RSS条目。在
如何使用feedparser执行异步请求?我是说,我想得到一些RSS条目,但我不想等待响应。当我从feedparser请求得到响应时,应该调用一个回调函数。在请求之后(可能在回复之前),我想做一些计算。在
谢谢大家, 雨果
您最好将从解析中提取的解耦。Feedparser是一个惊人的解析库,但可能不是最好的HTTP客户端库。幸运的是,这很容易实现,因为Feedparser也可以parse a blob of text。在
然后,这意味着您可以选择任何HTTP库来实际执行轮询,只要它支持您的异步需求。您可能最终会使用Twisted及其WebClient之类的东西。在
另一个解决方案当然是避免自己做那些昂贵的轮询,而依赖于像Superfeedr这样的解决方案,它将使用webhook只向您发送给定提要中的最新消息。在
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只向您发送给定提要中的最新消息。在
2019年更新
使用异步
相关问题 更多 >
编程相关推荐