问题表现
使用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版本。