Как использовать прокси с Python Requests

Прокси находится между вашим скриптом на Python и целевым сайтом. Сначала код отправляет запрос прокси, а тот уже пересылает его дальше. Эта дополнительная «остановка» может быть важна для тестирования, контроля доступа или обычной сетевой маршрутизации. Если вы когда-нибудь задавались вопросом, как использовать прокси с Python requests, ответ начинается именно с этого промежуточного шага, и в практических сценариях вроде python requests proxy example всё сводится к тому, чтобы правильно задать маршрут.

Это не магия. Это маршрутизация. Скрипт на ноутбуке может вести себя так, будто он выходит из другой сети, и это меняет ответы некоторых сервисов. Один запрос может пройти, другой — быть заблокирован, а третий — выглядеть иначе, потому что IP прокси теперь является публичным лицом соединения. Именно поэтому настройка прокси в python requests часто требует не только адреса, но и понимания того, как ведёт себя целевой сервис.

1. Что делает прокси в Python Requests

В requests прокси не живёт внутри самого вызова к сайту. Он добавляется к запросу как маршрутная информация, а затем библиотека отправляет трафик через этот адрес. Для HTTP-запросов прокси может видеть полный путь запроса; для HTTPS прокси обычно создаёт туннель и пропускает дальше зашифрованный трафик, поэтому конфигурация должна соответствовать протоколу.

Быстро всплывают три типичных сценария. Тестирование из другого региона — один из них. Проверка того, ведёт ли сайт себя иначе за корпоративным шлюзом, — другой. Сетевой маршрут внутри лаборатории или офиса — третий. Небольшая деталь, а разница большая.

Прокси — не панацея. Некоторые сайты блокируют известные диапазоны IP прокси, а некоторые прокси-сервисы ведут журналы трафика так, что это может конфликтовать с вашей политикой. Если важны конфиденциальность или соответствие требованиям, сначала прочитайте про журналы прокси и соблюдение требований к приватности, прежде чем направлять автоматизацию в рабочую систему.

2. Что нужно заранее: установить Requests и собрать данные прокси

Начните с Python и библиотеки requests. Если requests не установлен, сначала поставьте его командой pip install requests. Затем соберите данные прокси в простой список: схема, хост, порт и, при необходимости, имя пользователя и пароль.

Схема важна, потому что http и https не взаимозаменяемы во всех конфигурациях. Хост — это адрес прокси. Порт — номер, на котором он слушает, например 8080 или другое значение, выданное провайдером. Учётные данные могут быть необязательными, но если они есть, записывайте их точно как выданы. Одна неверная буква — и вся цепочка ломается.

Если в команде термины прокси используют нестрого, полезно заглянуть в словарь терминов про VPN и прокси. Он экономит время, когда один говорит «forward proxy», а другой имеет в виду «шлюз с авторизацией». Два человека, один инцидент.

3. Настройка базового прокси в requests

Самая простая схема — передать словарь proxies в requests.get(). Можно также привязать этот словарь к Session, если нужно переиспользовать одни и те же настройки для нескольких вызовов. В словаре оставляйте и http, и https, даже если кажется, что понадобится только один протокол.

Пример:

import requests
proxies = {
"http": "http://proxy.example.com:8080",
"https": "http://proxy.example.com:8080",
}
response = requests.get("https://example.com", proxies=proxies, timeout=10)

Ключ https часто удивляет новичков. Значение всё равно может начинаться с http://, потому что оно указывает requests, как общаться с прокси, а не с конечным сайтом. Одна строка, два маршрута.

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

session = requests.Session()
session.proxies.update(proxies)
response = session.get("https://example.com", timeout=10)

Сессия помогает переиспользовать cookies и не дублировать настройки. Кроме того, код становится легче читать после десятого запроса, а именно тогда неаккуратные скрипты обычно начинают «плыть».

4. Добавление аутентификации в URL прокси

Некоторые прокси требуют учётные данные прямо в URL. Формат простой: http://username:password@host:port. Если в пароле есть символы вроде @, : или #, их нужно безопасно закодировать, чтобы парсер URL не принял их за разделители.

Пример с закодированными учётными данными:

proxies = {
"http": "http://user:pa%[email protected]:8080",
"https": "http://user:pa%[email protected]:8080",
}

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

Кодирование надёжнее, чем угадывание. В Python часто используют urllib.parse.quote для имён пользователей и паролей, содержащих зарезервированные символы. Это сохраняет URL прокси валидным и избавляет от тихих ошибок, которые особенно раздражают тем, что выглядят как сетевые проблемы, хотя на деле виноват всего один символ.

5. Использование переменных окружения для повторно применяемых настроек прокси

Для локальной разработки переменные окружения часто удобнее, чем жёстко прописанные значения. Задайте HTTP_PROXY и HTTPS_PROXY в shell, и requests сможет подхватить их автоматически. Это удобно для скриптов, ноутбуков и CI-задач, где одни и те же настройки прокси повторяются из запуска в запуск. Если вы ищете настройки прокси для Python requests, этот подход часто проще всего сопровождать. Если вам нужно понять, как задать HTTP_PROXY и HTTPS_PROXY, ниже в примерах shell показан базовый шаблон.

Пример в Unix-подобной оболочке:

export HTTP_PROXY="http://user:[email protected]:8080"
export HTTPS_PROXY="http://user:[email protected]:8080"

В Windows имена переменных те же, хотя синтаксис команд отличается. Смысл один: вынести прокси за пределы исходного файла. На один файл меньше для правок.

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

6. Проверка, что прокси работает

Не стоит слепо доверять конфигурации. Проверьте исходящий IP простым запросом к сервису, который возвращает ваш публичный адрес. Если в ответе отображается адрес прокси вместо вашего локального, трафик действительно идёт через прокси. Это первое подтверждение.

Можно также посмотреть на поведение ответа. Некоторые сайты возвращают страницу на другом языке, другой региональный баннер или другую страницу согласия, когда трафик приходит из другого диапазона IP. Сами по себе такие изменения не доказывают ничего, но дают дополнительную зацепку. Две зацепки лучше одной.

Для быстрой проверки подойдёт тестовый endpoint:

import requests
proxies = {
"http": "http://proxy.example.com:8080",
"https": "http://proxy.example.com:8080",
}
r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=10)

Если endpoint возвращает IP прокси, значит настройка работает. Если возникает таймаут, прокси может быть недоступен или целевой сайт может отклонять туннель. Рабочая проверка важнее аккуратного конфигурационного файла.

7. Обработка типичных ошибок прокси

Сбои соединения обычно означают, что неверны хост, порт или схема. Сначала проверьте адрес. Если прокси ожидает https://, а вы отправляете http://, соединение может упасть ещё до того, как запрос дойдёт до сайта. Такое несовпадение встречается часто.

Ошибки аутентификации указывают на имя пользователя, пароль или кодирование. Если в учётных данных есть специальные символы, закодируйте их и попробуйте снова. Ответ 407 обычно означает, что аутентификацию требует прокси. Не сайт. Прокси.

Таймауты могут быть вызваны медленным прокси, заблокированной целью или слишком коротким значением timeout в скрипте. Увеличьте таймаут немного и проверьте ещё раз. Одна секунда часто слишком мало для перехода через сеть, особенно если прокси нагружен или в тот день медленный сам целевой сервис.

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

Вот практические исправления в одном списке:

  • Проверьте, что схема прокси совпадает с сервисом прокси.
  • Сверьте хост и порт с данными провайдера.
  • Закодируйте имена пользователей и пароли, если в них есть зарезервированные символы.
  • Увеличьте таймаут с короткого значения по умолчанию до реалистичного.
  • Проверьте, не требуется ли прокси доверенный набор сертификатов.
  • Сначала протестируйте прокси на простом URL, а уже потом используйте его в более крупном процессе.

8. Лучшие практики для надёжной работы с прокси

Используйте таймауты в каждом запросе. Без них «мертвый» прокси может подвесить скрипт дольше, чем вы ожидаете. Значение вроде timeout=10 — распространённая отправная точка, а потом его можно подстроить по результатам нескольких реальных тестов.

Повторы помогают при временных сбоях, но их нужно ограничивать. Цикл, который продолжает долбить проблемный прокси, может сделать плохую минуту ещё хуже. Держите число повторов небольшим и останавливайтесь, когда ошибка явно постоянная. Обычно трёх попыток достаточно, чтобы показать мёртвый маршрут.

Переиспользуйте сессии, где это возможно. Сессия сокращает повторную настройку и помогает упорядочить соединения между несколькими вызовами. Это важно в процессе, который делает 20, 50 или 100 запросов. И это делает код чище, что помогает при отладке в 2 часа ночи.

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

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

И последний момент. Делайте настройку прокси скучной. Скучно — это хорошо. Прокси, который задокументирован, протестирован, корректно закодирован и мониторится, создаёт меньше сюрпризов, чем «умный» скрипт, который работает только на одной машине с одним сохранённым креденшалом и одним удачным маршрутом.