Python прокси не работает

Python-сообщество

Уведомления

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

Не работает модуль 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:

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

Вот для наглядности скрипт на python с использованием requests с подключением через прокси, который получает страницы сервисов по получению IP по http и по https протоколам:

То есть как видим, удается получить страницу по 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)

Источник

[python][proxy] скрипт не ходит через прокси

Вот нарыл в инете такой скрипт для забора тем писем с gmail’a, который запускается из conky:

Первый вопрос: Почему закомменченные строки в ф-ии readmail не выводят в консоль читаемый утф8, а лишь его коды, хоть я и сделал encode. Пришлось выводить в файл сначала, а потом cat этот файл в конки.

Воторой вопрос: На домашнем компе все работает (но через вышеозначенный костыль), но на работе нужно, чтоб скрипт забирал страницу через прокси. Заменяем ф-ию auth на следующее:

Не работает. Что поправить, чтоб через прокси ходил?

Попробуй использовать urllib2

При выводе на консоль надо decode.

Хм. странное дело 🙂
Раскомментил вывод в консоль с encode и все пучком. Что-то я, видимо, напутал в процессе изысканий.
Первый вопрос снят.
Сейчас попробую с urllib2

Я ж говорю, что все уже хорошо с выводом в утф8. Причем, использую encode, а не decode. почему-то.

А вот со вторым вопросом есть кое-какие прояснения. Попробовал забрать какую-нть страницу простым методом без прокси:

И все ок. Забирается! То есть, видимо, читается переменная окружения http_proxy.

Но как я ни бился, с gmail’ом такое не прокатывает. Конечно, пытаясь авторизоваться. Не работает через liburl, как в первом примере, так и с liburl2 не работает из примера из руководства:

Могу предположить, что все дело в том, что gmail использует https, а не http. Соответственно и на значение переменной http_proxy ему как-то все равно.

Попробуйте установить переменную HTTPS_PROXY

>И все ок. Забирается! То есть, видимо, читается переменная окружения http_proxy.

Прокси, кстати, можно и в коде определять, через сам urllib2

>Но как я ни бился, с gmail’ом такое не прокатывает.

И, да, если тебе очень хочется — то может проще взять fetchmail и работать уже с ним через скрипт?

Читайте также:  Не работает 4 положение печки шевроле лачетти

Ужас-то какой — прямо заблудились в трех соснах. Один говорит — «encode», другой — «decode»! Что делать?

Не знаю точно, как в py3k, а в python 2.x дело происходит так — если у нас есть unicode-объект my_unicode_object то получаем следующее:

  • если делаем `print my_unicode_object’, то my_unicode_object кодируется в байты с использованием значения sys.stdout.encoding (которое должно по идее соответствовать представлению python о «кодировке терминала»). Если не вышло — UnicodeEncodeError.
  • если делаем `sys.stdout.write(my_unicode_object)’ то к my_unicode_object применяется str() (при этом используется значение sys.getdefaultencoding(), например, «ascii»), а то, что получилось, — если получилось, отправляется в stdout

И, наконец, для самых маленьких:

Надо понимать, что, в конечном итоге, в файл (в т.ч. и терминал) пойдут именно байты.

разве я не так сказал? 🙂 decode возвращает unicode пригодное для print

decode возвращает unicode пригодное для print

Ага, пригодное, особенно если defaultencoding — ascii.

Прошу обратить внимание на:

Видно, что https? Не? И работает. А с гмэйлом нет. Хотя на гмэйле аутентифицироваться надо. И, возможно, не работает как раз аутентификация через https. То есть я ее не умею готовить.

Спасибо, anonymous, fetchmail уж слишком здоровый, хотя расширенный функционал дает. Хотелось бы обойтись без него.

В скрипте уже пытался определять прокси, никак не выходит. Питон я первый раз вижу, хоть и опыт программинга большой.

Короче, сами попробуйте из-за прокси этим скриптом вытянуть свою почту (темы) с гмэйла. Может у кого удастся.

разве я не так сказал? 🙂 decode возвращает unicode пригодное для print

Как сказать? Тут даже вопрос не в том, что decode возвращает, а в том, к чему decode применяется.

К примеру, если применить decode «в лоб» к unicode object, то может получиться так:

WTF? Откуда UnicodeEncodeError, я же использовал decode, кажется, нет? Понятно, что декодировать unicode object просто-напросто нельзя, т.к. декодировать там нечего. Поэтому к объекту применяется str(), который использует defaultencoding (т.е. ‘ascii’), чтобы кодировать объект в байты, к которым можно будет потом применить decode. Такие дела.

Честно говоря, мой предыдущий пост, в основном, относился к топикстартеру, так что можете не принимать его особо на свой счет. Ну, если, конечно же, у вас проблем с юникодом нет.

Ага, пригодное, особенно если defaultencoding — ascii.

Это уже проблема print и юзера который не выставил локаль.

Откуда UnicodeEncodeError, я же использовал decode, кажется, нет?

ой, я и забыл про это. Тогда ты прав. Слава богу в py3k разобрались с этим бардаком.

Да что вы прицепились к юникоду-то 🙂 Уже все решено давно, хоть и спасибо за доп инфу.
Лучше с фетчем с гмэйла помогите.

[offtop]Надо буит Следжа Хаммера пересмотреть. Вспомнить детство.[/offtop]

> Да что вы прицепились к юникоду-то

Если бы не прицепились, вы бы так до конца жизни и гадали, где там что вызывать — encode или decode. А надо не гадать, а знать.

Shylent, ты прав, конечно, надо знать. И я вам благодарен.
А теперь к делу. 🙂

>К примеру, если применить decode «в лоб» к unicode object, то может получиться так:

Имхо, главное, что стоит упоминать в каждом руководстве по питону — то, что питоновский unicode не имеет никакого отношения к utf-8. Люди, вдохновившись всегда работающим print-ом в линуксе, совершенно упускают этот факт. Оттуда и постоянные проблемы с этими encode-decode

Надо буит Следжа Хаммера пересмотреть. Вспомнить детство.

Источник

Как в Python использовать прокси для подмены IP‑адресов

Прокси‑сервер — это приложение, которое действует как посредник запросов между клиентом, который хочет скрыть свой родной IP‑адрес, и сервером назначения, с которого клиент запрашивает определенную услугу (HTTP, SSL и т. д.).

Читайте также:  Уаз патриот не работают передние габариты

При использовании прокси‑сервера на пути прямого подключения к серверу назначения стоит прокси‑сервер, куда и направляется запрос всего, что хотите получить, где он анализируется, передаётся серверу назначения, далее выполняется, а результат выполнения сервером назначения возвращается клиенту по схеме взятой из Википедии и показанной ниже:

Что-бы избежать блокировки своего IP‑адреса веб‑сервером назначения при парсинге частенько приходится используют несколько прокси. Ещё у прокси‑серверов есть ряд других достоинств, в том числе обход фильтров и цензуры, скрытие своего реального IP‑адреса и т. д., и т. п.

Здесь вы узнаете, как использовать Python для прокси‑подключения с помощью библиотеки request , кроме того, я буду использовать библиотеку stem , которая является библиотекой контроллера Python для Tor. Установим их из своего терминала (в Windows cmd):

Использование бесплатных прокси

Во-первых, есть несколько веб‑сайтов, которые предлагают список бесплатных прокси. Вот вам функция для автоматического получения подобного списка:

Получилось вот это:

Однако, когда вы попытаетесь использовать сервера из списка, большинства из них вылетит по тайм-ауту. На самом деле, подобные списки недолговечны и большинство полученных прокси перестанут работать ещё до того, как вы дочитаете эту статью (поэтому, в реальной жизни приходится применять указанную выше функцию каждый раз, когда понадобятся новые прокси-серверы).

Следующая функция принимает список прокси и создает сеанс запросов, который случайным образом выбирает один из переданных прокси:

Проверим отправив запрос на веб‑сайт, который возвращает наш IP‑адрес:

Вот мой результат:

Как видите, это некоторые IP‑адреса рабочих прокси-серверов, а не наш реальный IP‑адрес (попробуйте посетить этот веб‑сайт в своем браузере, и вы увидите свой реальный IP‑адрес).

Бесплатные прокси, как правило, умирают очень быстро, в основном за дни или даже за часы, и часто умирают до того, как закончится наш проект. Чтобы предотвратить такую ситуацию для крупномасштабных проектов по извлечению данных, нужно использовать прокси премиум-класса. Существует множество провайдеров, которые меняют IP‑адреса за вас. Одно из хорошо известных решений — Crawlera. Мы поговорим об этом подробнее в последнем разделе этой статьи.

Использование Tor в качестве прокси

Для смены IP‑адресов можно использовать сеть Tor:

Примечание. Приведенный выше код должен работать только в том случае, если на вашем компьютере установлен Tor (перейдите по этой ссылке и правильно его установить) и правильно настроен (ControlPort 9051 включен, см. Этот ответ о переполнении стека для получения дополнительных сведений ).

Таким образом, будет создан сеанс с IP‑адресом Tor и сделан HTTP‑запрос. Затем обновим соединение, отправив сигнал NEWNYM (который сообщает Tor установить новое чистое соединение), чтобы изменить IP‑адрес и сделать еще один запрос, вот результат:

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

Использование Crawlera

Crawlera от Scrapinghub позволяет сканировать быстро и надежно, сервис по‑умному управляет подключением прокси‑серверов в одном сеансе и, если вас забанят, то он это автоматически обнаружит и изменит за вас IP‑адрес.

Crawlera — это интеллектуальная прокси‑сеть, специально разработанная для парсинга и сканирования веб‑страниц. Его задача ясна: облегчить жизнь парсера, помогает получать успешные запросы и извлекать данные в любом масштабе с любого веб‑сайта с помощью любого инструмента для парсинга.

Благодаря простому API запрос, который делается при парсинге, будет перенаправляться через пул высококачественных прокси. При необходимости он автоматически создаёт задержки между запросами и удаляет/добавляет IP‑адреса для решения различных проблем сканирования.

Читайте также:  Девушка моего сына не работает

Вот как можно использовать Crawlera с библиотекой requests в Python:

После регистрации вы получите ключ API, котором подставите в качестве значения для proxy_auth .

Итак, вот что происходит с Crawlera:

  • Вы отправляете HTTP‑запрос, используя API единой конечной точки.
  • Он автоматически выбирает, подменяет, ограничивает и заносит в черный список IP‑адреса для получения целевых данных.
  • Он обрабатывает заголовки запросов и поддерживает сеансы. В результате ваш запрос для конечной точки всегда будет успешным.

Заключение

Существует несколько типов прокси, включая бесплатные прокси, анонимные прокси, элитные прокси. Если ваша цель использования прокси — не дать веб‑сайтам блокировать ваши парсеры, то элитные прокси — оптимальный выбор, для веб‑сайта вы станете похожи на обычного пользователя, который вообще не знает, что такое прокси.

Более того, дополнительная анти-мера очистки — это использование ротационных пользовательских агентов, в которых вы каждый раз отправляете изменяющийся поддельный заголовок, говоря, что вы обычный браузер.

Наконец, Crawlera экономит ваше время и энергию, автоматически управляя прокси-серверами, а также предоставляет 14-дневную бесплатную пробную версию, так что вы можете просто попробовать ее без какого-либо риска. Если вам нужно прокси-решение, то настоятельно рекомендую вам попробовать Crawlera .


Как в Python использовать прокси для подмены IP‑адресов , опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.

Источник

HTTP-прокси или SOCKS-прокси с модулем requests в Python.

Запросы к сайтам через HTTP-прокси или SOCKS-прокси.

Содержание:

Запросы через HTTP-прокси.

Если необходимо использовать прокси-сервер для запросов к серверу, то для любого метода запроса можно передавать аргумент proxies , в который необходимо указать список прокси-серверов:

В качестве альтернативы можно настроить список прокси один раз для всего сеанса/сессии:

Когда конфигурация прокси-серверов не переопределяется в Python, как показано выше, то по умолчанию библиотека requests полагаются на конфигурацию прокси-сервера, определенную стандартными переменными среды http_proxy , https_proxy , no_proxy и curl_ca_bundle . Также поддерживаются варианты этих переменных в верхнем регистре. Следовательно можно настроить их для использования в запросах (только те, которые соответствуют вашим потребностям):

Чтобы использовать HTTP Basic Auth с прокси, необходимо использовать синтаксис http://user:password@host/ в любой из приведенных выше записей конфигурации:

Предупреждение. Хранение конфиденциальной информации в открытом виде об имени пользователя и пароле в переменных средах или файле с кодом представляет собой угрозу безопасности и настоятельно не рекомендуется.

Чтобы предоставить прокси-сервер для конкретной схемы и хоста, используйте форму scheme://hostname для ключа. Это будет соответствовать для любого запроса заданной схеме и точному имени хоста.

Обратите внимание, что URL-адреса прокси должны включать схему.

Наконец, обратите внимание, что использование прокси-сервера для HTTPS-соединений обычно требует, чтобы локальный компьютер доверял корневому сертификату прокси. По умолчанию список сертификатов, которым доверяют запросы, можно найти с помощью:

Можно переопределить этот набор сертификатов по умолчанию, установив для стандартной переменной среды curl_ca_bundle другой путь к файлу:

Запросы через SOCKS-прокси.

Новое в версии 2.10.0.

Помимо основных HTTP-прокси, библиотека requests также поддерживает прокси, использующие протокол SOCKS. Это дополнительная функция, для которой перед использованием необходимо установить дополнительные сторонние библиотеки.

Вы можете получить зависимости для этой функции из pip:

После того как установили эти зависимости, использовать SOCKS-прокси так же просто, как и HTTP-прокси:

Использование схемы socks5 приводит к тому, что разрешение DNS происходит на клиенте, а не на прокси-сервере. Это соответствует утилите linux терминала curl , которая использует схему, чтобы решить, следует ли выполнять разрешение DNS на клиенте или прокси-сервере. Если необходимо разрешение DNS на прокси-сервере, то используйте socks5h в качестве схемы.

Источник

Оцените статью