aiohttp.client_exceptions.ServerDisconnectedError: Server disconnected
问题描述:
使用
aiohttp.ClientSession()
爬取数据时出现错误:aiohttp.client_exceptions.ServerDisconnectedError: Server disconnected。翻译:aiohttp.client_exceptions。 ServerDisconnectedError:服务器断开连接。
简单说就是服务器断开连接。网上这方面的解决方案太少了,这个问题卡了一天,所以在此将自己解决方法记录下来。。。
解决方法:
这是再 神栈Stack overflow
搜到的答案,没有解决,但是方向已经很明确了,“站在巨人的肩膀上” 最终解决了问题。
这很可能是由HTTP服务器的配置引起的。 ServerDisconnectedError至少有两个可能的原因:
1)、服务器可以限制可以从单个IP地址建立的并行TCP连接的数量。 默认情况下,aiohttp已经将并行连接的数量限制为100。 可以试着降低限制,看看是否能解决问题。 为此,您可以创建一个带有不同限值的自定义TCPConnector,并将其传递给ClientSession:
connector = aiohttp.TCPConnector(limit=50)
async with aiohttp.ClientSession(connector=connector) as session:
2)、 服务器可以限制TCP连接的持续时间。 默认情况下,aiohttp使用HTTP keep-alive,因此同一个TCP连接可以用于多个请求。 这可以提高性能,因为不必为每个请求都建立一个新的TCP连接。 但是,一些服务器限制TCP连接的持续时间,如果对许多请求使用相同的TCP连接,服务器可以在您完成连接之前关闭它。 您可以禁用HTTP keep-alive作为一种变通方法。 为此,您可以创建一个自定义TCPConnector,将参数force_close设置为True,并将其传递给ClientSession:
connector = aiohttp.TCPConnector(force_close=True) # 禁用 HTTP keep-alive
async with aiohttp.ClientSession(connector=connector) as session:
最终我的解决方法:
上面的方法1 + 超时设置:
timeout = aiohttp.ClientTimeout(total=600) # 将超时时间设置为600秒
connector = aiohttp.TCPConnector(limit=50) # 将并发数量降低async with aiohttp.ClientSession(connector=connector, timeout=timeout) as session:async with session.get(url[0], headers=headers) as response:
解决问题。
我的博客:python—aiohttp库:有介绍 aiohttp
的使用及部分参数!