Requests报”requests.exceptions.ChunkedEncodingError: (“Connection broken: {error message}”, ConnectionResetError(104, ‘Connection reset by peer’)) “的原因以及解决办法

  • Post category:Python
  1. 原因:

在进行网络请求时,包含请求和响应过程。而在传输响应数据的过程中,对于大文件,服务器会对其进行分块传输,你的程序会以分块的形式获取响应数据。当传输中出现异常情况,如服务端异常断开连接时,会抛出ChunkedEncodingError异常,该异常表明分块编码中出现错误。

  1. 解决办法:

2.1 增加一些请求头参数,意义参考下面的具体代码示例;

2.2 加大requests.request()函数的timeout参数的值,较小的timeout参数在网络延迟较高等情况下容易出现运行报错异常;

2.3 尝试设置请求头的Content-Length参数,让程序可以预测服务器的请求大小,减少错误拦截的可能。

下面,是一个完整的请求示例。这个示例在请求时指定了请求头,增加了ConnectionUser-AgentAccept-Encoding,通过设置 Content-Length 让程序可以预测服务器发送的数据大小。并且将请求函数的超时时间设置为15秒,防止网络响应延迟造成程序异常退出。

import requests

headers = {
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
    'Accept-Encoding': 'gzip, deflate, br',
    'Content-Length': '0'
}

try:
    response = requests.get(url, headers=headers, timeout=15)
except requests.exceptions.ChunkedEncodingError as e:
    print(e)

经过以上处理之后,可以有效避免 ChunkedEncodingError 错误,并且增加了程序的健壮性和稳定性。