python - 如何使用 requests_html 异步 get() URL 列表?

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

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

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

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

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

我做错了什么吗?

最佳答案

Am I doing something wrong?

您没有正确调用session.run

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

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

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

关于python - 如何使用 requests_html 异步 get() URL 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58845758/

相关文章:

python - 无法处理 python 2 中的文件名

python - 使用 OpenCV 的 VideoCapture 和 Python 从视频中抓取慢速图像(帧)

python - 如何对多个外键执行排除 Django 查询

python list n files then next n files in a directory并将其映射到映射器函数

python - 按值获取 python 字典中的项目位置

多响应golang的异步请求

javascript - 容易理解 "asynchronous event"的定义?

javascript - 无法在 $.post 回调中设置作用域变量

python - 随着主窗口大小的调整而调整 QDialog 的大小

python - 如何查看 html 选择器中的隐藏内容?