使用aiohttp、asyncio爬取数据时报Overlapped对象待操作错误如何解决
问题原因
- 该错误为Windows系统特有的异步IO兼容问题:Python 3.8及以上版本在Windows环境下默认使用
ProactorEventLoop事件循环,依赖Windows重叠IO机制实现异步操作。 asyncio.run执行完毕后会直接销毁事件循环,此时aiohttp的ClientSession底层连接池还有未完成的后台清理操作,未执行完的重叠IO对象被强制回收就会抛出该错误。- 额外注意:你提供的代码存在拼写错误,
parse函数定义的参数名为result,但函数内部遍历用的变量是results,会先触发NameError报错,需要先修正该问题。
解决方案
- 首先修正parse函数的参数拼写,保证变量名统一:
# 修改前 def parse(result): # 修改后 def parse(results):
- 在代码入口处手动指定Windows平台使用SelectorEventLoop事件循环,规避重叠IO的兼容问题,完整入口代码如下:
if __name__ == "__main__": # 仅Windows系统需要添加该配置 asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) results = asyncio.run(main(urls)) parse(results)
- 如果修改后仍报错,升级aiohttp到最新版本即可:
pip install --upgrade aiohttp
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

