通过Python urllib2
我尝试通过HTTPS获取数据而我在公司NTLM代理后面。
我跑
proxy_url = ('http://user:pw@ntlmproxy:port/')
proxy_handler = urllib2.ProxyHandler({'http': proxy_url})
opener = urllib2.build_opener(proxy_handler, urllib2.HTTPHandler)
urllib2.install_opener(opener)
f = urllib2.urlopen('https://httpbin.org/ip')
myfile = f.read()
print myfile
但是我得到了错误
urllib2.URLError: <urlopen error [Errno 8] _ssl.c:507:
EOF occurred in violation of protocol>
如何解决此错误?
注意0:使用相同的代码,我可以检索不相关的HTTP等效http://httpbin.org/ip
。
注1:在普通浏览器中,我可以通过同一公司代理访问https://httpbin.org/ip
(以及其他HTTPS网站)。
注2:我正在网上阅读许多类似的问题,有些人认为它可能与证书验证有关,但是urllib2
做了< strong>不无论如何验证证书。
注3:有些人在类似的情况下建议 monekypatching ,但我想,没有办法monkeypatch _ssl.c
。
答案 0 :(得分:0)
问题在于Python的标准HTTP库不完全使用Microsoft的专有NTLM身份验证协议。
我通过设置一个支持NTLM的本地代理解决了这个问题 - ntlmaps
为我做了诀窍。(*) - 提供了对公司代理的身份验证并指向我的python没有身份验证凭据的本地代理的代码。
此外,我必须在上面列出的python代码中添加一个HTTPS的proxy_handler。所以我更换了两行
proxy_url = 'http://user:pw@ntlmproxy:port/'
proxy_handler = urllib2.ProxyHandler({'http': proxy_url})
有两行
proxy_url = 'http://localproxy:localport/'
proxy_url_https = 'https://localproxy:localport/'
proxy_handler = urllib2.ProxyHandler({'http': proxy_url, 'https': proxy_url_https})
然后请求完美无缺。
(*)ntlmaps
是一个Python程序。由于某些原因,在我的个人环境中,我需要代理是一个python程序。)