异步feedparser请求

2024-04-24 21:50:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用feedparser(Python)从几个网站获取一些RSS条目。在

如何使用feedparser执行异步请求?我是说,我想得到一些RSS条目,但我不想等待响应。当我从feedparser请求得到响应时,应该调用一个回调函数。在请求之后(可能在回复之前),我想做一些计算。在

谢谢大家, 雨果


Tags: 函数网站条目rssfeedparser雨果
2条回答

您最好将解析中提取解耦。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))

相关问题 更多 >