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

yizhihongxing

问题表现

使用Python的Requests库发送请求,却得到以下错误信息:

requests.exceptions.ChunkedEncodingError: ("Connection broken: {error message}", ConnectionResetError(104, 'Connection reset by peer'))

问题原因

这个错误表示连接已经被断开,可能是由于的以下原因导致:

  • 服务器或代理程序主动关闭了连接。
  • 网络中断或不稳定,导致连接断开。
  • 目标主机过载或崩溃。

解决办法

有三个与这个错误相关的解决方案。

重试

重试通常是处理这种错误的最佳方法。您可以使用Python的requests库中的Retry类来实现这一点。您可以根据自己的需要将它定义为诸如以下内容的功能。

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

def requests_retry_session(
    retries=3,
    backoff_factor=0.3,
    status_forcelist=(500, 502, 504),
    session=None,
):
    session = session or requests.Session()
    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session

response = requests_retry_session().get("http://www.example.com")

使用stream参数

另一种解决方案是在请求中使用stream参数。通过将stream参数设置为True,您请求的响应将分块发送,因此不会一次性将整个响应加载到内存中。这可以降低内存使用,并可能有助于避免ChunkedEncodingError错误。以下是一个范例:

import requests

response = requests.get("http://www.example.com", stream=True)
for chunk in response.iter_content(chunk_size=1024):
    if chunk:
        # process chunk

升级OpenSSL版本

如果出现这个错误,可能还是由于您使用的OpenSSL版本错误。您需要升级OpenSSL到最新版本。可以从OpenSSL官方网站上下载并安装最新版本。但请注意,这可能需要您重新编译Python。

总结

ChunkedEncodingError是由于与目标服务器的连接中断而导致的。可能是由于服务器故障、网络中断或代理关闭连接。使用Retry类或stream参数可以降低这种问题的发生率。如果还是无法解决,则可以升级OpenSSL版本。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Requests报”requests.exceptions.ChunkedEncodingError: (“Connection broken: {error message}”, ConnectionResetError(104, ‘Connection reset by peer’)) “的原因以及解决办法 - Python技术站

(1)
上一篇 2023年3月19日
下一篇 2023年3月19日

相关文章

合作推广
合作推广
分享本页
返回顶部