Python 3.x 分析Python 3堆栈跟踪请求模块Requests.exceptions.SSLError:urllib3.exceptions.MaxRetryError:url超过最大重试次数:

Python 3.x 分析Python 3堆栈跟踪请求模块Requests.exceptions.SSLError:urllib3.exceptions.MaxRetryError:url超过最大重试次数:,python-3.x,python-requests,Python 3.x,Python Requests,你好,这是我关于堆栈溢出的第一个问题 我已经编写了Python脚本,它使用最新的Python3.7和最新的请求模块。 我的请求查询可以工作,但是在一天内多次(数千)请求之后,我有时会得到这个堆栈跟踪和程序退出。这是一个大的堆栈跟踪,我不确定我应该首先调查哪些片段。任何帮助都将不胜感激 这是堆栈跟踪: File "/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py", line 453, in wrap_socket cn

你好,这是我关于堆栈溢出的第一个问题

我已经编写了Python脚本,它使用最新的Python3.7和最新的请求模块。 我的请求查询可以工作,但是在一天内多次(数千)请求之后,我有时会得到这个堆栈跟踪和程序退出。这是一个大的堆栈跟踪,我不确定我应该首先调查哪些片段。任何帮助都将不胜感激

这是堆栈跟踪:

File "/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py", line 453, in wrap_socket
    cnx.do_handshake()
  File "/usr/lib/python3/dist-packages/OpenSSL/SSL.py", line 1915, in do_handshake
    self._raise_ssl_error(self._ssl, result)
  File "/usr/lib/python3/dist-packages/OpenSSL/SSL.py", line 1639, in _raise_ssl_error
    raise SysCallError(errno, errorcode.get(errno))
OpenSSL.SSL.SysCallError: (104, 'ECONNRESET')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 343, in _make_request
    self._validate_conn(conn)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 841, in _validate_conn
    conn.connect()
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 344, in connect
    ssl_context=context)
  File "/usr/lib/python3/dist-packages/urllib3/util/ssl_.py", line 344, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py", line 459, in wrap_socket
    raise ssl.SSLError('bad handshake: %r' % e)
ssl.SSLError: ("bad handshake: SysCallError(104, 'ECONNRESET')",)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 449, in send
    timeout=timeout
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 638, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 398, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='block.io', port=443): Max retries exceeded with url: /api/v2/get_address_balance/?api_key=0d76-078a-c2c9-e524&addresses=172MQBZyt2UGfCPRwUpKCH4cmB4sRrhywy (Caused by SSLError(SSLError("bad handshake: SysCallError(104, 'ECONNRESET')")))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "Birds.py", line 291, in <module>
    main()
  File "Birds.py", line 287, in main
    loop()
  File "Birds.py", line 260, in loop
    checkBTC()
  File "Birds.py", line 186, in checkBTC
    currentBTCBalance = getBitcoinBalance()                              # Check Snapy for BTC balance
  File "Birds.py", line 111, in getBitcoinBalance
    r = requests.get(query_url)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 75, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 646, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 514, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='block.io', port=443): Max retries exceeded with url: /api/v2/get_address_balance/?api_key=0d76-078a-c2c9-e524&addresses=172MQBZyt2UGfCPRwUpKCH4cmB4sRrhywy (Caused by SSLError(SSLError("bad handshake: SysCallError(104, 'ECONNRESET')")))
文件“/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py”,第453行,在wrap_套接字中
cnx.do_握手()
文件“/usr/lib/python3/dist packages/OpenSSL/SSL.py”,第1915行,在do_握手中
self.\u raise\u ssl\u错误(self.\u ssl,结果)
文件“/usr/lib/python3/dist-packages/OpenSSL/SSL.py”,第1639行,出现错误
引发系统调用错误(errno,errorcode.get(errno))
OpenSSL.SSL.syscaller错误:(104,'ECONNRESET')
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python3/dist packages/urllib3/connectionpool.py”,第600行,在urlopen中
分块=分块)
文件“/usr/lib/python3/dist packages/urllib3/connectionpool.py”,第343行,在请求中
自我验证连接(连接)
文件“/usr/lib/python3/dist-packages/urllib3/connectionpool.py”,第841行,在“验证”连接中
连接
文件“/usr/lib/python3/dist packages/urllib3/connection.py”,第344行,在connect中
ssl(上下文=上下文)
文件“/usr/lib/python3/dist-packages/urllib3/util/ssl_uu.py”,第344行,在ssl_-wrap_套接字中
返回context.wrap\u套接字(sock,server\u hostname=server\u hostname)
文件“/usr/lib/python3/dist packages/urllib3/contrib/pyopenssl.py”,第459行,在wrap_套接字中
raise ssl.SSLError('握手错误:%r“%e”)
ssl.SSLError:(“错误握手:SysCallError(104,'ECONNRESET')”,)
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python3/dist packages/requests/adapters.py”,第449行,在send中
超时=超时
文件“/usr/lib/python3/dist packages/urllib3/connectionpool.py”,第638行,在urlopen中
_stacktrace=sys.exc_info()[2])
文件“/usr/lib/python3/dist packages/urllib3/util/retry.py”,第398行,增量
引发MaxRetryError(_池、url、错误或响应错误(原因))
urllib3.exceptions.MaxRetryError:HTTPSConnectionPool(host='block.io',port=443):url超过了最大重试次数:/api/v2/get_address\u balance/?api\u key=0d76-078a-c2c9-e524&addresses=172MQBZYYT2UGFCPRWUPKCH4CMB4SRRHYWY(由SSLError(SSLError(“错误握手:SysCallError(104,'ECONNRESET'))引起))
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“Birds.py”,第291行,在
main()
文件“Birds.py”,第287行,主
循环()
文件“Birds.py”,第260行,在循环中
检查BTC()
文件“Birds.py”,第186行,在checkBTC中
currentBTCBalance=getBitcoinBalance()#检查Snapy的BTC余额
getBitcoinBalance中的文件“Birds.py”,第111行
r=requests.get(查询url)
get中第75行的文件“/usr/lib/python3/dist packages/requests/api.py”
返回请求('get',url,params=params,**kwargs)
文件“/usr/lib/python3/dist-packages/requests/api.py”,第60行,请求中
return session.request(method=method,url=url,**kwargs)
文件“/usr/lib/python3/dist packages/requests/sessions.py”,请求中的第533行
resp=自我发送(准备,**发送)
文件“/usr/lib/python3/dist packages/requests/sessions.py”,第646行,在send中
r=适配器.send(请求,**kwargs)
文件“/usr/lib/python3/dist packages/requests/adapters.py”,第514行,在send中
raise SSLError(e,请求=请求)
requests.exceptions.SSLError:HTTPSConnectionPool(host='block.io',port=443):url超过最大重试次数:/api/v2/get_address\u balance/?api\u key=0d76-078a-c2c9-e524&addresses=172MQBZYYT2UGFCPRWUPKCH4CMB4SRRhy(由SSLError(错误握手:SysCallError(104,'econreset'))引起)

我通过以下网站回答了自己的问题:

这解释了如何使用传输适配器和智能退避。我目前每秒测试一次查询,程序已经运行了24小时,没有问题