2017-02-12 2 views
0

Если веб-сайт, с которым я пытаюсь подключиться через прокси, является незащищенным (HTTP), тогда я могу подключиться, однако, если он защищен (HTTPS) , то я не могу.Как подключиться к HTTPS через прокси с помощью urllib2 (в Python)

Следующий код работает:

import urllib2 

proxy_support = urllib2.ProxyHandler({'http':'xxx.xxx.xxx.xx'}) 
opener = urllib2.build_opener(proxy_support) 
urllib2.install_opener(opener) 

html = urllib2.urlopen('http://www.example.com').read() 

Однако приведенный ниже код не работает,

proxy_support = urllib2.ProxyHandler({'https':'xxx.xxx.xxx.xx'}) 
opener = urllib2.build_opener(proxy_support) 
urllib2.install_opener(opener) 

html = urllib2.urlopen('https://www.example.com').read() 

Вместо этого я получаю следующее отслеживающий:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen 
    return opener.open(url, data, timeout) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open 
    response = self._open(req, data) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open 
    '_open', req) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain 
    result = func(*args) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1240, in https_open 
    context=self._context) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open 
    raise URLError(err) 
urllib2.URLError: <urlopen error [Errno 61] Connection refused> 

ответ

0

Согласно https://docs.python.org/2/library/urllib2.html:

Изменено в версии 2.7.9: добавлены cafile, capath, cadefault и контекст.

Это один позволил мне подключиться к локальному сайту HTTPS, который использует самозаверяющий сертификат SSL:

html = urllib2.urlopen('http://www.example.com'),\ 
context=ssl._https_verify_certificates(False) 

я заметил в вашем TRACEBACK сходство с моим. Код, так же, как вы писали, работает на Ubuntu 14.04 (Python 2.7.6), но не в 16.04 (Python 2.7.13) с исключением до последнего:

File "/usr/lib/python2.7/urllib2.py", line 154, in urlopen 
    return opener.open(url, data, timeout) 
    File "/usr/lib/python2.7/urllib2.py", line 429, in open 
    response = self._open(req, data) 
    File "/usr/lib/python2.7/urllib2.py", line 447, in _open 
    '_open', req) 
    File "/usr/lib/python2.7/urllib2.py", line 407, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.7/urllib2.py", line 1241, in https_open 
    context=self._context) 
    File "/usr/lib/python2.7/urllib2.py", line 1198, in do_open 
    raise URLError(err) 
urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)> 

Я не уверен, если эта работа на вашем конце.