Python urllib2> HTTP代理> HTTPS请求

时间:2010-05-28 09:20:39

标签: python proxy https urllib2

这项工作很好:

import urllib2

opener = urllib2.build_opener(
                urllib2.HTTPHandler(),
                urllib2.HTTPSHandler(),
                urllib2.ProxyHandler({'http': 'http://user:pass@proxy:3128'}))
urllib2.install_opener(opener)
print urllib2.urlopen('http://www.google.com').read()

但是,如果 http 更改为 https

...
print urllib2.urlopen('https://www.google.com').read()

有错误:

Traceback (most recent call last):
  File "D:\Temp\6\tmp.py", line 13, in <module>
    print urllib2.urlopen('https://www.google.com').read()
  File "C:\Python26\lib\urllib2.py", line 124, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\Python26\lib\urllib2.py", line 389, in open
    response = self._open(req, data)
  File "C:\Python26\lib\urllib2.py", line 407, in _open
    '_open', req)
  File "C:\Python26\lib\urllib2.py", line 367, in _call_chain
    result = func(*args)
  File "C:\Python26\lib\urllib2.py", line 1154, in https_open
    return self.do_open(httplib.HTTPSConnection, req)
  File "C:\Python26\lib\urllib2.py", line 1121, in do_open
    raise URLError(err)
URLError: <urlopen error [Errno 10060]

为什么以及如何解决这个问题?

3 个答案:

答案 0 :(得分:17)

更改此行:

urllib2.ProxyHandler({'http': 'http://user:pass@proxy:3128'}))

到此:

urllib2.ProxyHandler({'https': 'http://user:pass@proxy:3128'}))

它适用于我。

答案 1 :(得分:1)

在Windows上,errno 10060是一个winsock错误,意味着连接超时。您是否可以使用代理设置为https://www.google.com的网络浏览器从同一台计算机上访问http://user:pass@proxy:3128?您确定您的代理服务器可以在同一端口上同时处理https和http吗?

答案 2 :(得分:1)

urllib2的documentation说明如下:

  

注意:目前urllib2不支持获取https位置   通过代理。但是,这可以通过将urllib2扩展为   显示在this recipe

我必须承认上面的配方不能立即用于Jython 2.5.3,但我还在尝试。

更新:我将this patch应用于Jython 2.5.3,它对我有用。我现在可以通过代理服务器获取HTTPS资源。

UPDATE2 :以下是通过HTTP代理进行基本身份验证来查询HTTPS资源的代码(请勿忘记首先安装补丁(请参阅上一次更新)):

from suds.client import Client
from suds.transport.https import HttpAuthenticated

credentials = dict(username='...', password='...', proxy={'https': 'host:port', 'http': 'host:port'})
t = HttpAuthenticated(**credentials)
url = 'https://example.com/service?wsdl'
client = Client(url, transport=t)
print client.service.getFoo()