如何利用协程正确执行多个GET请求?requests-html异步报错排查
问题解决:requests-html异步任务执行报错修复
错误原因分析
AsyncHTMLSession.run()参数错误:该方法接受的是未被调用的协程函数(或带参数的可调用对象),你直接调用async_get_url(url)得到的是已挂起的协程对象,方法内部尝试调用coro()时就会抛出TypeError: 'coroutine' object is not callable。- 冗余的Session实例创建:每个异步任务里重新创建
AsyncHTMLSession实例完全没必要,复用同一个异步会话才能提升效率,也符合库的设计逻辑。
正确实现代码
#!/usr/bin/env python from requests_html import AsyncHTMLSession from pprint import pprint from typing import Any from functools import partial async def async_get_url(session: AsyncHTMLSession, url: str) -> Any: r = await session.get(url) # 可根据需求返回具体数据,示例返回URL和页面标题 return {"url": url, "page_title": r.html.find('title', first=True).text} if __name__ == "__main__": urls = ('https://python.org/', 'https://reddit.com/', 'https://google.com/') # 创建单个异步会话实例供所有任务复用 session = AsyncHTMLSession() # 使用partial绑定参数,生成可被run()调用的协程函数 coro_funcs = [partial(async_get_url, session, url) for url in urls] # 传入协程函数列表执行异步任务 results = session.run(*coro_funcs) pprint(results)
关键修正点
- 用
functools.partial将协程函数与session、url参数绑定,生成可被run()方法调用的函数对象,而非直接生成协程对象。 - 仅创建一个
AsyncHTMLSession实例,所有异步任务复用该会话,避免资源浪费。 - 示例返回结构化数据替代原始响应对象,更便于后续业务处理。
内容的提问来源于stack exchange,提问作者user11492382
相关产品推荐
相关产品推荐

