Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 20, 2013 15:58:43

valet
Зарегистрирован: 2013-09-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает модуль python requests через прокси по https-протоколу

Здравствуйте, уважаемые программисты на python.

Только начал изучать python, пишу небольшой скрипт для работы с твиттером с использованием прокси…

Не могу заставить модуль python requests работать через прокси по https.
С офсайта этого модуля:

If you need to use a proxy, you can configure individual requests with the proxies argument to any request method:

import requests
proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)

Но проблема в том, что это почему-то не работает именно для https-протокола.


Вот для наглядности скрипт на python с использованием requests с подключением через прокси, который получает страницы сервисов по получению IP по http и по https протоколам:
#!/usr/bin/env python
#_*_ coding: utf-8 _*_
import requests
proxy_line = 'http://193.106.31.10:8085'
proxies = {
  "http": proxy_line,
  "https": proxy_line,
}
print ('proxy:', proxy_line)
r2 = requests.get("http://ifconfig.me/ip", proxies=proxies) #сервис для получения IP по http-протоколу - это работает
print ('page via http:', r2.text)
r = requests.get("https://ipdb.at/", proxies=proxies) #сервис для получения IP по https-протоколу - это почему-то не работает!
print ('page via https:', r.text)

И вот результат его выполнения:
./test_https.py 
('proxy:', 'http://193.106.31.10:8085')
('page via http:', u'193.106.31.10\n')
('page via https:', u'<html><head><title>400 Bad Request</title></head>\r\n<body><h2>400 Bad Request</h2></body></html>\r\n')

То есть как видим, удается получить страницу по http и выдается ошибка при попытки получения страницы по https.
Используемый мною прокси 193.106.31.10:8085 (привязан к моему IP) точно умеет работать по https, так как аналогичный скрипт на php+curl у меня работает - то есть сервис https://ipdb.at/ успешно возвращает страницу на которой IP 193.106.31.10.

Большая просьба помочь разобраться как с помощью модуля requests работать именно по https-протоколу с использованием прокси, никакое гугление вот уже несколько суток ничего не дает, надежда только на форум.

Отредактировано valet (Сен. 20, 2013 15:59:29)

Офлайн

#2 Сен. 20, 2013 17:42:17

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Не работает модуль python requests через прокси по https-протоколу

Прокси должен уметь работать с методом CONNECT, чтобы вы могли через HTTP доступаться до HTTPS.



Офлайн

#3 Сен. 20, 2013 17:44:23

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Не работает модуль python requests через прокси по https-протоколу

Неспособность прокси поддерживать CONNECT, кстати, может как раз вызывать ошибку 400 Bad Request.
По сути, это ошибка синтаксиса HTTP(S) протокола.



Офлайн

#4 Сен. 21, 2013 03:57:29

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Не работает модуль python requests через прокси по https-протоколу

valet
Не могу заставить модуль python requests работать через прокси по https
Замените urllib3 в пакете на последнюю версию



Офлайн

#5 Сен. 21, 2013 11:19:49

valet
Зарегистрирован: 2013-09-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает модуль python requests через прокси по https-протоколу

Lexander
Прокси должен уметь работать с методом CONNECT, чтобы вы могли через HTTP доступаться до HTTPS.
Это он умеет. Аналогичный скрипт на php+curl работает!

Вот такой скрипт на php:
<?php

$proxy_line = 'http://193.106.31.10:8085';
echo “$proxy_line<hr>”;

if( $curl = curl_init() ){
//опции
curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);

curl_setopt($curl, CURLOPT_PROXY, "$proxy_line“);

curl_setopt($curl, CURLOPT_URL, ”https://ipdb.at/“);
curl_setopt($curl, CURLOPT_POST, 0);
$out = curl_exec($curl);
echo ”$out“;
}

else echo ”curl_init fail";

?>

Благополучно возвращает:

IP address is numbered 193.106.31.10. This IP address is active in Ukraine. IP Country code is UA. IP address is assigned to “TOO Centr Informacionnyh Technologii”. In organization “TOO Centr Informacionnyh Technologii”. It is also assigned to a hostname unassigned10.citonline.com.ua. IP address longitude is 32.0 and latitude is 49.0.

То есть четко видим что через этот прокси поддерживает работу с https-протоколом.
Вот как написать тоже самое на python? Почему модуль requests это не поддерживает?

Отредактировано valet (Сен. 21, 2013 14:34:48)

Офлайн

#6 Сен. 21, 2013 11:20:52

valet
Зарегистрирован: 2013-09-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает модуль python requests через прокси по https-протоколу

pyuser
Замените urllib3 в пакете на последнюю версию
А можно подробнее, как именно это сделать? Я пока совсем слабо ориентируюсь в python что там да как обновляется/заменяется…
Вот я скачал https://pypi.python.org/packages/source/u/urllib3/urllib3-1.7.tar.gz, куда это положить или как установить? В README.rst ни слова об этом…

Попробовал так:
pip install urllib3
Downloading/unpacking urllib3
  Downloading urllib3-1.7.tar.gz (61Kb): 61Kb downloaded
  Running setup.py egg_info for package urllib3
Installing collected packages: urllib3
  Running setup.py install for urllib3
Successfully installed urllib3
Cleaning up...
Как я понимаю установилась как раз последняя версия. Но результаты те же, может нужно еще где-то в самом модуле python requests что-то менять?

Отредактировано valet (Сен. 21, 2013 11:34:15)

Офлайн

#7 Сен. 21, 2013 14:36:57

valet
Зарегистрирован: 2013-09-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает модуль python requests через прокси по https-протоколу

Ребята, помогите пожалуйста разобраться. За рабочее решение как заставить модуль python requests работать через прокси по https-протоколу готов заплатить.
Не могу продолжить работу уже который день из-за сабжа…

Офлайн

#8 Сен. 21, 2013 20:58:41

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Не работает модуль python requests через прокси по https-протоколу

Попробуйте через Grab :)

Офлайн

#9 Сен. 22, 2013 00:18:31

valet
Зарегистрирован: 2013-09-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает модуль python requests через прокси по https-протоколу

lorien
Попробуйте через Grab
Да, спасибо, через Grab все работает
Видимо в python requests какой-то баг.

Офлайн

#10 Сен. 22, 2013 07:14:18

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Не работает модуль python requests через прокси по https-протоколу

valet
Видимо в python requests какой-то баг
Баг был в urllib3.
Пакет python_requests включает в себя пакет urllib3, лежит в path_to_requests/packages/urllib3, именно эту папку и нужно подменить.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version