在Python 2.5中,是否可以通过认证代理使用urllib2获取https页面?
我正在尝试为一个现有的脚本添加支持认证代理的功能。这个脚本的主要工作是连接到一个https网址(使用urllib2.Request和urllib2.urlopen),抓取页面内容,并根据找到的信息执行一些操作。起初,我希望这能像简单地添加一个urllib2.ProxyHandler({"http": MY_PROXY})作为参数传给urllib2.build_opener,然后再传给urllib2.install_opener那样简单。不幸的是,当我尝试使用urllib2.Request(ANY_HTTPS_PAGE)时,这似乎并没有奏效。通过搜索,我发现python 2.5中的urllib2似乎不支持https网址的代理功能。这让我感到很意外。
网上似乎有一些解决方案,比如http://bugs.python.org/issue1424152上有一个针对urllib2
和httplib
的补丁,声称可以解决这个问题(不过我试过后,反而出现了一个新的错误:urllib2.URLError: <urlopen error (1, 'error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol')>
)。还有一个食谱在这里http://code.activestate.com/recipes/456195,我打算接下来试试。总的来说,我对这个功能没有“开箱即用”的支持感到惊讶,这让我怀疑我是不是错过了什么明显的解决办法。所以简而言之——有没有人能提供一个简单的方法,使用认证代理通过urllib2在Python 2.5中获取https页面?理想情况下,这样的代码应该可以工作:
import urllib2
#perhaps the dictionary below needs a corresponding "https" entry?
#That doesn't seem to work out of the box.
proxy_handler = urllib2.ProxyHandler({"http": "http://user:pass@myproxy:port"})
urllib2.install_opener( urllib2.build_opener( urllib2.HTTPHandler,
urllib2.HTTPSHandler,
proxy_handler ))
request = urllib2.Request(A_HTTPS_URL)
response = urllib2.urlopen( request)
print response.read()
非常感谢