Python 2.6.1中的urllib2支持通过https代理吗
在Python 2.6.1中,urllib2支持通过https的代理吗?
我在这个网站上找到了一些信息:
注意
目前,urllib2不支持通过代理获取https地址。这可能会造成一些问题。
我正在尝试自动登录一个网站并下载文件,我有有效的用户名和密码。
proxy_info = {
'host':"axxx", # commented out the real data
'port':"1234" # commented out the real data
}
proxy_handler = urllib2.ProxyHandler(
{"http" : "http://%(host)s:%(port)s" % proxy_info})
opener = urllib2.build_opener(proxy_handler,
urllib2.HTTPHandler(debuglevel=1),urllib2.HTTPCookieProcessor())
urllib2.install_opener(opener)
fullurl = 'https://correct.url.to.login.page.com/user=a&pswd=b' # example
req1 = urllib2.Request(url=fullurl, headers=headers)
response = urllib2.urlopen(req1)
我之前在类似的页面上成功过,但没有使用HTTPS,我怀疑它无法通过代理连接——就像我没有指定代理时一样,它会卡住。我需要通过代理连接。
我需要进行身份验证,但不是使用基本身份验证,urllib2能否在通过https网站时自动处理身份验证(我通过网址提供用户名和密码)?
编辑:
不行,我测试了
proxies = {
"http" : "http://%(host)s:%(port)s" % proxy_info,
"https" : "https://%(host)s:%(port)s" % proxy_info
}
proxy_handler = urllib2.ProxyHandler(proxies)
结果我遇到了错误:
urllib2.URLError: urlopen错误 [错误号8] _ssl.c:480: 协议违反,发生EOF
3 个回答
如果将来还有人遇到这个问题,我想提醒一下,现在已经支持https代理了。不过要确保你的代理也支持这个功能,否则可能会遇到一个bug,让python库陷入无限循环(我就遇到过这种情况)。
想了解更多信息,可以查看python源代码中的单元测试,它是用来测试https代理支持的: http://svn.python.org/view/python/branches/release26-maint/Lib/test/test_urllib2.py?r1=74203&r2=74202&pathrev=74203
在Python 2.6.3和其他几个版本中已经修复了这个问题:
- _bugs.python.org/issue1424152(把_替换成http...)
http://www.python.org/download/releases/2.6.3/NEWS.txt
问题编号#1424152:修复了httplib和urllib2,使它们在通过代理时支持SSL。最初的补丁由Christopher Li提供,Senthil Kumaran进行了修改。
我不太确定你引用的Michael Foord的文章是否更新到Python 2.6.1版本——为什么不试试看呢?现在你告诉ProxyHandler这个代理只适用于http,但你可以把它也注册为https(当然,在调用ProxyHandler之前,你应该先把它格式化成一个变量,然后在字典中反复使用这个变量):这样做可能有效,也可能无效,但你连尝试都没有,这样肯定是不会成功的!-)