Поддерживает ли urllib2 в Python 2.6.1 прокси через https
Вопрос
Делает urllib2 в Python 2.6.1 поддерживается прокси через https?
Я нашел следующее по адресу http://www.voidspace.org.uk/python/articles/urllib2.shtml:
ПРИМЕЧАНИЕ
В настоящее время urllib2 не поддерживает выборку местоположений https через прокси.Это может стать проблемой.
Я пытаюсь автоматизировать вход на веб-сайт и загрузку документа, у меня есть действительное имя пользователя / пароль.
proxy_info = {
'host':"axxx", # commented out the real data
'port':"1234" # commented out the real data
}
proxy_handler = urllib2.ProxyHandler(
{"http" : "http://%(host)s:%(port)s" % proxy_info})
opener = urllib2.build_opener(proxy_handler,
urllib2.HTTPHandler(debuglevel=1),urllib2.HTTPCookieProcessor())
urllib2.install_opener(opener)
fullurl = 'https://correct.url.to.login.page.com/user=a&pswd=b' # example
req1 = urllib2.Request(url=fullurl, headers=headers)
response = urllib2.urlopen(req1)
У меня это работало для похожих страниц, но не с использованием HTTPS, и я подозреваю, что оно не проходит через прокси-сервер - оно просто застревает так же, как когда я не указывал прокси.Мне нужно выйти через прокси.
Мне нужно пройти аутентификацию, но не используя базовую аутентификацию, будет ли urllib2 определять аутентификацию при переходе через сайт https (я указываю имя пользователя / пароль для сайта через URL)?
Редактировать:Нет, я тестировал с помощью
proxies = {
"http" : "http://%(host)s:%(port)s" % proxy_info,
"https" : "https://%(host)s:%(port)s" % proxy_info
}
proxy_handler = urllib2.ProxyHandler(proxies)
И я получаю сообщение об ошибке:
urllib2.URLError:ошибка urlopen [Ошибка № 8] _ssl.c:480:EOF произошел при нарушении протокола
Решение
Я не уверен, что статья Майкла Фурда, которую вы цитируете, обновлена до Python 2.6.1 - почему бы не попробовать?Вместо того, чтобы сообщать ProxyHandler, что прокси-сервер подходит только для http, как вы делаете сейчас, зарегистрируйте его и для https (конечно, вы должны отформатировать его в переменную только один раз, прежде чем вызывать ProxyHandler, и просто повторно использовать эту переменную в dict):это может сработать, а может и не сработать, но вы даже не пытаясь, и это конечно не для того, чтобы работать!-)
Другие советы
Исправлено в Python 2.6.3 и некоторых других ветках:
- _bugs.python.org/issue1424152 (замените _ на http...)
http://www.python.org/download/releases/2.6.3/NEWS.txt
Проблема № 1424152:Исправлено для httplib, urllib2 для поддержки SSL при работе через прокси.Оригинальный патч Кристофера Ли, изменения внесены Сентилом Кумараном.
Если у кого-то еще возникнет эта проблема в будущем, я хотел бы отметить, что сейчас он поддерживает прокси-сервер https, убедитесь, что прокси-сервер тоже поддерживает его, иначе вы рискуете столкнуться с ошибкой, которая помещает библиотеку Python в бесконечный цикл (это произошло мне).
Дополнительную информацию см. в unittest в исходном коде Python, который тестирует поддержку https-прокси:http://svn.python.org/view/python/branches/release26-maint/Lib/test/test_urllib2.py?r1=74203&r2=74202&pathrev=74203