【问题标题】:Asynchronous feedparser requests异步 feedparser 请求
【发布时间】:2014-07-13 21:28:58
【问题描述】:

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

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

谢谢大家, 雨果

【问题讨论】:

    标签: python asynchronous rss feedparser


    【解决方案1】:

    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))
    

    【讨论】:

    • 不错的答案,但是您没有处理来自 REST 请求的标头,这意味着您将 丢失电子标签和最后一个-修改字段!
    • 对不起,如果这是一个愚蠢的问题,我们究竟为什么需要 etag 标头以及您将如何处理上次修改的内容
    • 感谢您指出这一点,我将首先在我的代码上进行测试,如果可行,请在此处更新 :)
    • @vgoklani etag 和 modified 仅在您使用 feedparser 模块来获取 url 时直接可用,我正在使用 AIOhttp 库,它们都返回 None,我的猜测是我必须提取它来自 aiohttp 响应头
    • YES - 您需要从标题中手动提取它们。注意 - 它们并不总是存在,取决于来源....我也将 aiohttp 与 uvloop 一起使用,这是最好的方法:)
    【解决方案2】:

    您最好将获取解析解耦。 Feedparser 是一个了不起的解析库,但可能不是最好的 HTTP 客户端库。幸运的是,这很容易做到,因为 Feedparser 也可以parse a blob of text

    然后,这意味着您可以选择任何 HTTP 库 来实际执行轮询,只要它支持您的异步要求。您可能最终会使用 Twisted 及其 WebClient 之类的东西。

    另一种解决方案当然是避免自己进行所有昂贵的轮询,并依赖像 Superfeedr 这样的解决方案,它将使用 webhook 仅向您发送给定提要中的新内容。

    【讨论】:

      猜你喜欢
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多