Как использовать прокси с Python Requests
Библиотека requests и сама по себе нормально отправляет HTTP-трафик. Но как только вам нужно парсить страницы товаров или запускать автоматизацию в большом масштабе, слабым местом становится ваш IP. Один адрес, который отправляет сотни запросов в минуту, быстро получает пометку о блокировке или прямую блокировку.
Прокси для Python Requests встает между вашим скриптом и целевым сайтом, заменяя настоящий адрес другим IP при каждом подключении. Настроить маршрут можно за пять строк кода. А вот сделать это правильно на масштабе – с ротацией, повторами и авторизацией – уже задача, требующая внимания.
Главное
- Прокси в Python Requests скрывает ваш настоящий IP-адрес и распределяет трафик между несколькими адресами, чтобы целевые сайты не помечали скрипт как подозрительный.
- В библиотеке requests уже есть встроенная поддержка прокси через простой аргумент-словарь. Дополнительные пакеты не нужны.
- Авторизация прокси работает через добавление имени пользователя и пароля прямо в URL-строку.
- Сессии позволяют использовать одну настройку для десятков запросов и не повторять один и тот же код снова.
- Переменные окружения вроде HTTP_PROXY и HTTPS_PROXY задают маршрутизацию на уровне системы.
- Ротация прокси обязательна для крупных задач по сбору данных. Один статичный IP блокируют быстро.
- Логика повторных попыток через HTTPAdapter не дает вашему пайплайну падать из-за одного неудачного соединения.
- Правильный тип прокси – residential, datacenter или ISP – важнее, чем просто большой размер пула.
Зачем использовать прокси с Python Requests?
Каждый запрос, который отправляет ваш скрипт, несет с собой IP-адрес. Целевой сервер его записывает. Отправьте достаточно запросов с одного и того же адреса, и сервер начнет воспринимать вас как бота. Потому что технически так и есть.
Прокси меняет ситуацию. Сначала запрос идет на прокси-сервер, а тот уже пересылает его на целевой сайт с другого IP. В итоге сайт видит адрес прокси, а не ваш.
Прокси можно использовать, чтобы отправлять запросы с IP-адреса из нужных стран, включать ротацию и проходить через тысячи адресов, а также поддерживать инфраструктуру парсинга в рабочем состоянии, даже когда отдельные IP уже «сгорели».
Частые сценарии использования Python-прокси
Веб-скрапинг – самый очевидный пример. Мониторинг цен на Amazon, Walmart или любой другой e-commerce-платформе требует тысяч запросов в день. Без прокси вы получите блокировку уже после нескольких сотен.
SEO-инструменты собирают SERP-данные из Google по разным геолокациям. Каждый запрос должен выглядеть так, будто его отправил реальный пользователь из нужной страны.
Управление аккаунтами на платформах вроде Instagram или TikTok требует отдельного IP для каждого профиля. Если вашему скрипту нужно выглядеть как трафик из другого места – используйте прокси.
Что будет, если отправлять запросы без прокси?
Первые запросы пройдут. Возможно, даже первые несколько сотен. Потом начнут появляться ответы 403 Forbidden. Или 429 Too Many Requests. Вместо данных, которые вы просили, сайт покажет CAPTCHA.
Cloudflare и Akamai снимают отпечаток вашего соединения и блокируют тех, кто повторяется слишком часто. IP попадает в черный список, и все будущие запросы с этого адреса перестают приносить что-либо полезное.
Что нужно перед началом работы

Установите библиотеку Requests
Установите ее через pip:
pip install requests
Для изоляции проекта используйте виртуальное окружение: python -m venv myenv && source myenv/bin/activate && pip install requests. Проверьте установку, запустив import requests внутри .py-файла. Ошибок нет – можно работать.
Разберитесь, из чего состоит адрес прокси
Адрес выглядит так:
protocol://username:password@ip:port
В качестве схемы используйте http, https или socks5. Пример: http://user123:pass456@185.199.42.11:8080. Порт обязателен. Пропустите его – запрос не выполнится.
Выберите подходящего прокси-провайдера
Бесплатные списки манят. Но они ненадежны, медленны и часто уже скомпрометированы. Для всего, что выходит за пределы быстрого теста, лучше брать платного провайдера.
На что смотреть: размер пула, географическое покрытие и поддержка протоколов HTTP и SOCKS5. Residential-трафик стоит от $1.00 до $15.00 за ГБ. Датацентровые IP обычно обходятся от $0.50 до $2.00 в месяц.
Лучшее прокси-решение для Python Requests
Почему ProxyWing хорошо подходит для Python Requests
Proxywing работает с пулом из более чем 70 миллионов IP в 190+ странах. Residential-трафик начинается от $1.00 за ГБ. Датацентровые варианты стоят $0.90 в месяц за IP. Оба типа поддерживают HTTP и SOCKS5, а статические-сессии могут удерживаться до 7 дней.
Если вашему скрипту нужна прокси-сессия на целевом сайте – например, чтобы оставаться авторизованным при сборе данных с пагинацией, – 7-дневная статические-сессия сохранит один и тот же IP без ручной логики ротации. ProxyWing интегрируется с Afina, AdsPower и GoLogin. Это полезно, если настройка прокси в Python Requests связана с мультиаккаунтной работой. Аптайм – 99%.
Какой тип прокси выбрать под свою задачу
Residential-прокси идут от реальных домашних устройств. Используйте их для целей с агрессивными антибот-системами: Google, Amazon, социальные платформы.
Датацентровые прокси быстрее и дешевле. Они подходят для небольших интернет-магазинов и публичных API.
ISP-прокси находятся где-то посередине. Их стоит брать для длительных сессий на сайтах со средним уровнем защиты.
Как использовать прокси с Python Requests
Шаг 1: импортируйте Python Requests
Создайте новый файл с расширением .py и начните с импорта:
import requests
Так вы получите доступ к requests.get(), requests.post() и классу Session. Для базовой работы с прокси больше ничего устанавливать не нужно.
Шаг 2: задайте прокси прямо в Requests
Python Requests принимает аргумент proxies – словарь, который связывает каждый протокол с адресом прокси:
proxies = {
"http": "http://185.199.42.11:8080",
"https": "http://185.199.42.11:8080"
}
response = requests.get("https://httpbin.org/ip", proxies=proxies)
print(response.json())
Ключи http и https должны указывать на ваш сервер. Если задать только один, запросы по другому протоколу пойдут в обход прокси. Поэтому всегда указывайте оба.
Шаг 3: добавьте авторизацию прокси
Большинство прокси-провайдеров требует имя пользователя и пароль. Вставьте их в URL:
proxies = {
"http": "http://user123:pass456@gate.proxywing.com:7000",
"https": "http://user123:pass456@gate.proxywing.com:7000"
}
response = requests.get("https://httpbin.org/ip", proxies=proxies)
print(response.status_code)
Учетные данные идут перед символом @. Библиотека requests сама разбирает их и отправляет заголовок авторизации. Если в пароле есть специальные символы, используйте urllib.parse.quote().
Шаг 4: отправьте тестовый запрос через прокси
Перед запуском полного скрипта проверьте, что соединение работает:
import requests
proxies = {
"http": "http://user123:pass456@gate.proxywing.com:7000",
"https": "http://user123:pass456@gate.proxywing.com:7000"
}
try:
response = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
print(f"Proxy IP: {response.json()['origin']}")
except requests.exceptions.ProxyError:
print("Connection failed")
except requests.exceptions.Timeout:
print("Request timed out")
Эндпоинт httpbin.org/ip возвращает IP, который видит сервер. Если в ответе показан адрес прокси, а не ваш, всё работает. Всегда используйте timeout, чтобы запрос не зависал.
Шаг 5: используйте сессию для повторяющихся запросов
Создавать новое соединение для каждого запроса – лишняя трата ресурсов. В Python Requests лучше использовать объект Session: он переиспользует TCP-соединение и держит конфигурацию в одном месте.
import requests
session = requests.Session()
session.proxies = {
"http": "http://user123:pass456@gate.proxywing.com:7000",
"https": "http://user123:pass456@gate.proxywing.com:7000"
}
for url in ["https://httpbin.org/ip", "https://httpbin.org/headers"]:
response = session.get(url, timeout=10)
print(f"{url}: {response.status_code}")
Задайте прокси на уровне сессии один раз. После этого каждый запрос через эту сессию будет автоматически идти через него. Сессии также работают с cookies. Это важно, когда целевой сайт отслеживает состояние между запросами.
Как задать прокси через переменные окружения
Когда переменные окружения действительно удобны
Жестко прописывать адреса внутри .py-файла можно для теста. Для продакшена лучше использовать переменные окружения. Они помогают не хранить учетные данные в исходном коде. Python Requests подхватывает их автоматически.
Пример использования HTTP_PROXY и HTTPS_PROXY
Задайте их в терминале перед запуском скрипта:
export HTTP_PROXY="http://user123:pass456@gate.proxywing.com:7000"
export HTTPS_PROXY="http://user123:pass456@gate.proxywing.com:7000"
После этого в коде не нужна отдельная настройка прокси:
import requests
response = requests.get("https://httpbin.org/ip")
print(response.json())
Библиотека requests проверяет эти переменные при каждом запросе. Чтобы обойти прокси для одного вызова, передайте proxies={}.
Как ротировать прокси в Python Requests
Соберите список прокси
Ротация начинается с нескольких адресов. Сохраните их в список:
proxy_list = [
"http://user:pass@proxy1.example.com:8000",
"http://user:pass@proxy2.example.com:8000",
"http://user:pass@proxy3.example.com:8000",
]
Для больших пулов загружайте адреса из файла – по одному на строку.
Проверяйте прокси перед использованием
Мертвые записи тормозят весь процесс. Проверяйте каждый адрес заранее:
import requests
def check(proxy_url):
try:
r = requests.get("https://httpbin.org/ip",
proxies={"http": proxy_url, "https": proxy_url}, timeout=5)
return r.status_code == 200
except Exception:
return False
active = [p for p in proxy_list if check(p)]
Запускайте такую проверку перед каждой сессией скрапинга. То, что работало вчера, сегодня уже может быть недоступно.
Ротируйте прокси простым собственным методом
Самый простой вариант – выбирать случайный адрес для каждого запроса:
import random
import requests
def get_rotated(url, pool):
pick = random.choice(pool)
return requests.get(url,
proxies={"http": pick, "https": pick}, timeout=10)
Случайный выбор подходит для небольших задач. Если запросов больше нескольких тысяч, round-robin дает более ровное распределение.
Используйте сессии или логику повторов с новым прокси
Если один адрес падает в середине работы, скрипт должен брать следующий:
import random
import requests
def fetch_with_retry(url, pool, max_retries=3):
for attempt in range(max_retries):
pick = random.choice(pool)
try:
resp = requests.get(url,
proxies={"http": pick, "https": pick}, timeout=10)
if resp.status_code == 200:
return resp
except requests.exceptions.RequestException:
continue
return None
Каждая попытка выбирает другой адрес. После трех неудач функция возвращает None, чтобы ваш цикл мог записать неуспешный запрос в лог.
Продвинутая ротация прокси для крупных задач
На масштабе случайного выбора уже мало. Отслеживайте, какие IP работают лучше, и назначайте им оценки. Для проектов выше 100 000 запросов в день удобнее брать провайдера со встроенными ротационными шлюзами. Residential-эндпоинт ProxyWing обрабатывает ротацию на стороне сервера.
Частые ошибки при использовании прокси с Python Requests
Ошибки авторизации прокси
Ответ 407 означает, что учетные данные прокси неверны. Проверьте имя пользователя и пароль в URL прокси. Частые причины: опечатка, неправильный порт или забытое URL-кодирование специальных символов.
Тайм-ауты соединения и сетевые сбои
ConnectTimeout обычно говорит о том, что прокси-сервер недоступен. Возьмите другой адрес из списка. Если тайм-ауты идут по всем адресам, проблема может быть на вашей стороне: например, файрвол блокирует исходящие соединения. Всегда задавайте явные тайм-ауты: timeout=(5, 15) дает 5 секунд на подключение и 15 секунд на ответ.
Ошибки HTTP 403, 407 и 429
403 Forbidden – целевой сайт заблокировал ваш запрос. Используйте residential-прокси или добавьте к запросу заголовки, похожие на заголовки реального браузера.
429 Too Many Requests – вы отправляете запросы слишком быстро. Добавьте задержки между ними и используйте больше прокси-IP, чтобы распределить нагрузку.
Проблемы SSL и HTTPS
SSLError возникает, когда прокси перехватывает HTTPS-трафик своим сертификатом. Можно использовать verify=False, но это отключает проверки безопасности. Лучше получить CA-сертификат прокси-провайдера и передать его так: verify=”/path/to/ca.crt”.
Как повторять неудачные запросы
Частые причины неудачных запросов
Запросы падают по трем основным причинам: прокси умер, целевой сайт заблокировал IP прокси или сеть оборвала запрос. Мертвые адреса убирайте из ротации. Для заблокированных берите свежий IP. Оборванные запросы повторяйте.
Добавьте логику повторов через Requests и HTTPAdapter
Библиотека Python Requests поддерживает автоматические повторные попытки через urllib3.util.retry.Retry и HTTPAdapter:
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
session = requests.Session()
retry_strategy = Retry(total=3, backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)
backoff_factor=1 добавляет растущие задержки: сначала 1 секунда, потом 2, потом 4. status_forcelist сообщает адаптеру, какие коды должны запускать повтор.
Соберите простой собственный wrapper для повторов
Если нужен больший контроль, используйте собственную обертку, которая выбирает новый прокси при каждой попытке:
import time, random, requests
def resilient_request(url, pool, retries=3, delay=2):
for i in range(retries):
pick = random.choice(pool)
try:
resp = requests.get(url,
proxies={"http": pick, "https": pick}, timeout=10)
if resp.status_code in [200, 301, 302]:
return resp
if resp.status_code == 429:
time.sleep(delay * (i + 1))
except requests.exceptions.RequestException:
time.sleep(delay)
return None
Как снизить вероятность ошибки 429
Rate limiting – самая частая проблема. Сначала используйте больше прокси-IP, чтобы распределить запросы между адресами. Затем добавьте случайные задержки: time.sleep(random.uniform(1.0, 3.5)). Третье – используйте реалистичные заголовки запроса, включая User-Agent, похожий на настоящий браузер. Четвертое – учитывайте директиву crawl-delay в robots.txt.
Лучшие практики использования прокси с Python Requests
Используйте качественные прокси
Бесплатные прокси-списки делят свои IP между сотнями пользователей. Эти адреса уже помечены. Бесплатный прокси ничего не экономит, если каждый запрос возвращает 403. Берите провайдера с большим и чистым пулом.
Подбирайте тип прокси под целевой сайт
Google, Amazon и Facebook серьезно вкладываются в защиту от ботов. Датацентровые IP там быстро попадаются. Для сложных целей используйте residential-прокси. Небольшие сайты нормально работают с датацентровыми адресами – нет смысла платить $1.00 за ГБ residential-трафика, если прокси за $0.90 в месяц справляются с задачей.
Не перегружайте один IP
100 запросов в секунду с одного прокси-адреса выглядят как автоматизация. Распределяйте запросы по пулу. Если у вас 20 прокси-IP, отправляйте не больше 5 запросов в минуту с каждого.
Следите за кодами ответов и состоянием прокси
Логируйте каждый код ответа. Резкий рост 403 или 429 означает, что целевой сайт обновил детектирование либо ваши прокси-IP устаревают. Удаляйте любой прокси, у которого успешность падает ниже 90%.
Заключение
Настроить прокси в Python Requests несложно. Библиотека requests берет на себя маршрутизацию, авторизацию и управление сессиями с минимальным количеством кода. Сложнее другое: выбрать правильный тип прокси, ротировать IP и спокойно обрабатывать неудачные запросы.
Начинайте с базы. Добейтесь, чтобы один запрос прошел через прокси. Потом добавляйте сессии, ротацию и логику повторов – по одному слою за раз. Фундамент важен. Когда настройка прокси для Python Requests становится устойчивой, масштабирование со 100 запросов до 100 000 в основном сводится к добавлению новых прокси-IP.
Статью написал:

Фулстек AI-инженер
Александр привносит в инженерную команду Proxywing глубокую фулстек-экспертизу — от архитектуры бэкенда и оптимизации производительности до AI-ориентированных процессов разработки. Его практический опыт охватывает Node.js, React, облачную инфраструктуру и RAG-пайплайны, что позволяет одинаково уверенно работать как с внутренней логикой прокси-платформы, так и с пользовательской частью продукта. В Proxywing Александр сосредоточен на проектировании отказоустойчивых систем, устранении узких мест производительности и внедрении современных AI-инструментов в процесс разработки. Вне кода он увлечён исследованием передовых подходов в AI-инженерии и созданием сайд-проектов, расширяющих технические горизонты.
Все статьи автора (43)Ответы на часто задаваемые вопросы
Да. Словарь proxies принимает ключи http и https. Можно использовать один и тот же прокси для обоих протоколов или разные адреса для каждого. SOCKS5 тоже работает, если установить пакет requests[socks].
Вставьте учетные данные в URL прокси: http://username:password@proxy-host:port. Библиотека requests извлечет их и отправит заголовок авторизации. Для специальных символов используйте urllib.parse.quote().
Зависит от цели. Residential-прокси лучше работают на сайтах с сильной антибот-защитой: Amazon, Google, социальные платформы. Датацентровые прокси подходят для менее защищенных целей и стоят дешевле. В большинстве проектов по скрапингу через Python Requests лучше начинать с residential-прокси, а на датацентровые переходить там, где это возможно.



