【问题标题】:How do I use requests_html to asynchronously get() a list of URLs?如何使用 requests_html 异步获取() URL 列表?
【发布时间】:2019-11-13 21:18:29
【问题描述】:

我正在尝试使用 python 包 resuqests_html 异步获取 () 一个 URL 列表,类似于使用 Python 3.6.5 和 requests_html 0.10.0 的 async example in the README

我的理解是 AsyncHTMLSession.run() 应该与 asyncio.gather() 的工作方式非常相似:你给它一堆 awaitables,它会运行所有这些。不对吗?

这是我正在尝试的代码,我希望它可以获取页面并存储响应:

from requests_html import AsyncHTMLSession

async def get_link(url):
    r = await asession.get(url)
    return r

asession = AsyncHTMLSession()
results = asession.run(get_link("http://google.com"), get_link("http://yahoo.com"))

但是我得到了这个异常:

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    results = asession.run(get_link("google.com"), get_link("yahoo.com"))
  File ".\venv\lib\site-packages\requests_html.py", line 772, in run
    asyncio.ensure_future(coro()) for coro in coros
  File ".\venv\lib\site-packages\requests_html.py", line 772, in <listcomp>
    asyncio.ensure_future(coro()) for coro in coros
TypeError: 'coroutine' object is not callable
sys:1: RuntimeWarning: coroutine 'get_link' was never awaited

我做错了吗?

【问题讨论】:

    标签: python python-3.x asynchronous python-asyncio python-requests-html


    【解决方案1】:

    我做错了吗?

    你没有正确调用asession.run

    asyncio.gather 接受可等待对象,例如通过调用协程(异步)函数获得的协程对象。另一方面,asession.run 接受 callables,例如异步函数,它将调用这些函数来生成 awaitables。区别就像一个接受可迭代的函数和你可以传递的函数之间的区别,例如一个实例化的生成器,另一个接受可调用的可返回可迭代对象,您可以将其传递给生成器函数本身。

    由于你的异步函数有参数,你不能只将get_link 传递给asession.run;您必须使用 functools.partial 或 lambda 本身:

    results = asession.run(
        lambda: get_link("http://google.com"),
        lambda: get_link("http://yahoo.com"),
    )
    

    【讨论】:

    • 如果url和url个数不定怎么办?
    • 只需使用(参数)解包,如results = asession.run(*list_of_lambdas) where list_of_lambdas = [lambda: get_link("http://google.com"), lambda: get_link("http://yahoo.com")]
    • @deanresin 或者,如果 URL 已经在列表中:list_of_lambdas = [lambda url=url: get_link(url) for url in list_of_urls]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多