今天在把一个多线程爬虫改写成使用协程的爬虫,在一个接口一直报concurrent.futures._base.TimeoutError
,代码是这样的
async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=3)) as session:
r = await session.post(url)
_ = await r.json()
出错的位置是最后一行
其实挺奇怪的,这是一个util,很多接口都使用这个函数,但是只有一个报错。
最后通过 https://github.com/aio-libs/aiohttp/issues/4015 找到了报错原因。
await session.post(url)
实际上只是保证接收了一个chunk,剩余部分需要使用者自行操作进行读取,为的是在得知是大文件的时候可以放弃处理,但是在我的代码里r.json()已经跳出with,连接已经关闭,所以读取body报错
修正方案即在with内操作body
async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=3)) as session:
r = await session.post(url)
_ = await r.json()
只有一个报错原因应该就是其他接口内容较少,一个chunk已经包含,即内容已经完全读取。报错的这个内容多,剩余chunks需要手动触发接收。
本文由 hunsh 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Mar 17, 2021 at 11:48 pm