ProxyWing LogoProxyWing

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

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

Опубликовано:6 июня 2026 г.
Время чтения:10 мин
Обновлено:9 июня 2026 г.

Прокси для 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.

Статью написал:

Alexandre Parfonov

Фулстек 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-прокси, а на датацентровые переходить там, где это возможно.