Python aiohttp模块使用笔记
本文是在使用aiohttp
模块时的一点笔记。代码在Python 3.7
下运行。
基本使用
1 |
|
资源释放
session要释放,调用
await session.close()
或使用async with
。对于response,要调用resp.close()
或使用async with
。不能在读数据(如
await resp.read()
等)之前调用await resp.release()
,否则会阻塞在读数据操作。若报
warning: Unclosed connection
,则检查资源是否释放。如:1
2
3resp = await session.get(url)
# await resp.read() # 不加这句或下面一句的话就会报warning:Unclosed connection
# await resp.release()
设置超时
1 |
|
超时要自己设置,因为默认是5分钟,太长了
代理
1 |
|
不验证ssl证书(注意考虑流量劫持)
1 |
|
指定cookie
1 |
|
通过ClientSession的cookies参数指定cookies,使用该session请求任一的站点都会带上此cookie。若响应头带有set-cookie: csrfToken=1010753502;Expires=...;Domain=...;path=/;
,session会根据该响应头更新csrfToken这个cookie值,且加上domain、expires等信息。
若不想使用该session请求任意站点都带上此Cookie,可以:
1 |
|
清除session里的cookies:session.cookie_jar.clear()
ValueError: too many file descriptoersin select()报错问题
一般是并发请求数太大导致的,通常通过减少并发数解决。
我遇到的情况:并发量设置的不高,运行一段时间后报该错误。通过搜索、调试,最后看aiohttp
文档时发现是因为请求的https站点的服务器没有正确完成ssl连接,需要指定一个叫enable_cleanup_closed
的参数为True
:
1 |
|
官方对enable_cleanup_closed
参数的解释:
Some ssl servers do not properly complete SSL shutdown process, in that case asyncio leaks SSL connections.
If this parameter is set to True, aiohttp additionally aborts underlining transport after 2 seconds. It is off by default.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!