Python urllib2> HTTP-прокси> HTTPS-запрос - PullRequest
10 голосов
/ 28 мая 2010

Это прекрасно работает:

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 ]

17 голосов
/ 14 июля 2010

Изменить эту строку:

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

к этому:

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

У меня отлично работает.

1 голос
/ 18 октября 2013

Документация для urllib2 гласит следующее:

Примечание. В настоящее время urllib2 не поддерживает выборку местоположений https. через прокси. Однако это можно включить, расширив urllib2 как показано в этот рецепт .

Должен признать, что рецепт не работал сразу для Jython 2.5.3, но я все еще пытаюсь.

ОБНОВЛЕНИЕ : я применил этот патч к Jython 2.5.3, и он работал для меня. Теперь я могу получать HTTPS-ресурсы через прокси-сервер.

UPDATE2 : Вот код для запроса ресурсов HTTPS с обычной аутентификацией через HTTP-прокси (НЕ ЗАБУДЬТЕ УСТАНОВИТЬ ПАТЧ ПЕРВЫЙ (см. Предыдущее обновление)):

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()
1 голос
/ 28 мая 2010

В Windows errno 10060 - ошибка winsock, означающая, что время соединения истекло. Вы можете набрать https://www.google.com с той же машины, используя веб-браузер с прокси-сервером, установленным на http://user:pass@proxy:3128? Вы уверены, что ваш прокси-сервер может обрабатывать как https, так и http на одном и том же порту?

...