aiohttp.client_exceptions.ServerDisconnectedError: Server disconnected

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 的使用及部分参数!

你可能感兴趣的:(Bug,解决记录)