【发布时间】:2016-12-10 05:05:54
【问题描述】:
注意事项:
versions
Python 2.7.11 and my requests version is '2.10.0'
'OpenSSL 1.0.2d 9 Jul 2015'
Please read the below comment by Martijn Pieters before reproducing
最初我尝试使用以下代码从https://www.neco.navy.mil/necoattach/N6945016R0626_2016-06-20__INFO_NAS_Pensacola_Base_Access.docx 获取 pdf
code1:
>>> import requests
>>> requests.get("https://www.neco.navy.mil/necoattach/N6945016R0626_2016-06-20__INFO_NAS_Pensacola_Base_Access.docx",verify=False)
错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\mob140003207\AppData\Local\Enthought\Canopy\User\lib\site-packa
ges\requests\api.py", line 67, in get
return request('get', url, params=params, **kwargs)
File "C:\Users\mob140003207\AppData\Local\Enthought\Canopy\User\lib\site-packa
ges\requests\api.py", line 53, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Users\mob140003207\AppData\Local\Enthought\Canopy\User\lib\site-packa
ges\requests\sessions.py", line 468, in request
resp = self.send(prep, **send_kwargs)
File "C:\Users\mob140003207\AppData\Local\Enthought\Canopy\User\lib\site-packa
ges\requests\sessions.py", line 576, in send
r = adapter.send(request, **kwargs)
File "C:\Users\mob140003207\AppData\Local\Enthought\Canopy\User\lib\site-packa
ges\requests\adapters.py", line 447, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: SysCallError(10054, 'WSAECONNRESE
T')",)
经过谷歌搜索,我发现您已使用 SSL 验证,并且使用带有适配器的会话可以解决问题。但是我仍然有错误,请在下面找到代码和错误
代码2:
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
import ssl
import traceback
class MyAdapter(HTTPAdapter):
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(num_pools=connections,
maxsize=maxsize,
block=block,
ssl_version=ssl.PROTOCOL_TLSv1)
s = requests.Session()
s.mount('https://', MyAdapter())
print "Mounted "
r = s.get("https://www.neco.navy.mil/necoattach/N6945016R0626_2016-06-20__INFO_NAS_Pensacola_Base_Access.docx", stream=True, timeout=120)
错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\mob140003207\AppData\Local\Enthought\Canopy\User\lib\site-packa
ges\requests\sessions.py", line 480, in get
return self.request('GET', url, **kwargs)
File "C:\Users\mob140003207\AppData\Local\Enthought\Canopy\User\lib\site-packa
ges\requests\sessions.py", line 468, in request
resp = self.send(prep, **send_kwargs)
File "C:\Users\mob140003207\AppData\Local\Enthought\Canopy\User\lib\site-packa
ges\requests\sessions.py", line 576, in send
r = adapter.send(request, **kwargs)
File "C:\Users\mob140003207\AppData\Local\Enthought\Canopy\User\lib\site-packa
ges\requests\adapters.py", line 447, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: SysCallError(10054, 'WSAECONNRESET')",)
【问题讨论】:
-
您能否指定您正在使用的请求版本以及 Python 的确切版本?我设法在请求 2.10.0 的 Python 3.5 中运行您的第二个代码示例而没有问题。您能否也看看this 答案,它建议猴子修补
ssl.wrap_socket() -
你用的是什么版本的openssl?
-
我很喜欢赏金,但我没有想出答案,将其标记为重复项才公平。
-
对那些试图复制的人的重要提示:Python 2.7.9 和更新版本显着升级了 Python 的 SSL 功能。见PEP 466。如果您想帮助重现并找到解决方案,则必须使用至少是新版本的版本。 (在 OS X 上,使用 Homebrew 构建的 Python 作为Apple's system Python uses an outdated OpenSSL version)。
-
@The6thSense 这很有道理。从您的 Windows 机器上,我建议 Martijn 可能是正确的,并且您遇到了防火墙问题(甚至可能是 Windows 防火墙),因为that error 表示套接字已被对等方断开连接。当您在服务器上运行并看到“证书验证失败”错误时,可能是因为远端证书存在问题 - 除了忽略它之外,您无能为力。
标签: python python-2.7 ssl python-requests