Python urllib2 > HTTP Proxy > HTTPS request

匿名 (未验证) 提交于 2019-12-03 01:20:02

问题:

This work fine:

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() 

But, if http change to https:

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

There are errors:

Traceback (most recent call last):   File "D:\Temp\6\tmp.py", line 13, in      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: 

Why and how solve this problem?

回答1:

Change this line:

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

to this:

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

It works fine for me.



回答2:

On Windows, errno 10060 is a winsock error meaning the connection timed out. Are you able to reach https://www.google.com from the same machine using a web browser with a proxy set to http://user:pass@proxy:3128 ? Are you sure your proxy server can handle both https and http on the same port?



回答3:

The documentation for urllib2 says the following:

Note: Currently urllib2 does not support fetching of https locations through a proxy. However, this can be enabled by extending urllib2 as shown in this recipe.

I must admit above recipe didn't work right away for Jython 2.5.3, but I'm still trying.

UPDATE: I applied this patch to Jython 2.5.3, and it worked for me. I can fetch HTTPS resources over a proxy server now.

UPDATE2: Here is the code to query HTTPS resources with Basic authentication over HTTP Proxy (DON'T FORGET TO INSTALL PATCH FIRST (see previous update)):

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() 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!