如何使用 requests_html 异步 get() 一个 URL 列表?
How do I use requests_html to asynchronously get() a list of URLs?
我正在尝试使用 python 包 resuqests_html, similar to the async example in the README 使用 Python 3.6.5 和 requests_html 0.10.0 异步获取()一个 URL 列表。
我的理解是 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?
您没有正确调用 asession.run
。
asyncio.gather
接受等待对象,例如通过调用协程(异步)函数获得的协程对象。另一方面,asession.run
接受 callables,例如异步函数,它将调用这些函数来生成可等待对象。区别就像一个接受迭代的函数和你可以传递的函数之间的区别,例如一个实例化的生成器,另一个接受将 return 可迭代的可调用对象,并且您可以传递一个生成器函数本身。
因为你的异步函数有参数,你不能只将 get_link
传递给 asession.run
;您必须使用 functools.partial
或 lambda 本身:
results = asession.run(
lambda: get_link("http://google.com"),
lambda: get_link("http://yahoo.com"),
)
我正在尝试使用 python 包 resuqests_html, similar to the async example in the README 使用 Python 3.6.5 和 requests_html 0.10.0 异步获取()一个 URL 列表。
我的理解是 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?
您没有正确调用 asession.run
。
asyncio.gather
接受等待对象,例如通过调用协程(异步)函数获得的协程对象。另一方面,asession.run
接受 callables,例如异步函数,它将调用这些函数来生成可等待对象。区别就像一个接受迭代的函数和你可以传递的函数之间的区别,例如一个实例化的生成器,另一个接受将 return 可迭代的可调用对象,并且您可以传递一个生成器函数本身。
因为你的异步函数有参数,你不能只将 get_link
传递给 asession.run
;您必须使用 functools.partial
或 lambda 本身:
results = asession.run(
lambda: get_link("http://google.com"),
lambda: get_link("http://yahoo.com"),
)