You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用协程正确执行多个GET请求?requests-html异步报错排查

问题解决:requests-html异步任务执行报错修复

错误原因分析

  1. AsyncHTMLSession.run()参数错误:该方法接受的是未被调用的协程函数(或带参数的可调用对象),你直接调用async_get_url(url)得到的是已挂起的协程对象,方法内部尝试调用coro()时就会抛出TypeError: 'coroutine' object is not callable。
  2. 冗余的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:07:13