Руководство по Python · 1 мин чтения

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

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

Словарь proxies и почему важна схема

Библиотека requests в Python общается с прокси через единственный словарь. Ключи — это не протокол прокси, а схема целевого URL-адреса. Так что {"http": ..., "https": ...} сообщает requests, какой прокси использовать, когда назначением является HTTP- или HTTPS-сайт, и на практике оба ключа указывают на одну и ту же конечную точку.

Схема внутри URL прокси определяет его использование. socks5:// разрешает имена целей локально; socks5h:// поручает это прокси. Удалённый DNS не шифрует SOCKS-соединение: прокси получает имя хоста, а аутентификация по логину и паролю может передаваться открытым текстом. HTTPS с проверкой сертификата защищает содержимое приложения, а не согласование SOCKS. Если путь от клиента до прокси тоже нуждается в защите, используйте зашифрованный туннель. Для аутентифицированного прокси s4m.online используйте выданный адрес и проверяйте выходной IP маршрутизируемых запросов.

Схема проксиDNS разрешаетПортУстановка
socks5h://Прокси (удалённо)1080requests[socks]
socks5://Ваша машина (локально)1080requests[socks]
http://Прокси3128Стандартный requests

Поддержка SOCKS требует PySocks (pip install "requests[socks]"); HTTP-конечная точка работает со стандартной установкой. Прокси s4m — это датацентровые SOCKS5 и HTTP с оплатой за гигабайт — см. цены. Если вам нужны лишь одноразовые конечные точки для быстрых тестов, бесплатный публичный список прокси — это отдельный, сторонний пул (используйте на свой риск). Выбираете между полным туннелем и прокси? Прочитайте сравнение, обзор VPN или другие руководства.

Requests · RFC 1929

Полный рабочий пример

Используйте хост и учётные данные, выданные вашему аккаунту. Пример запрашивает секреты, проверяет TLS и последовательно пробует настроенные транспорты. Смена SOCKS5 на HTTP на том же хосте не гарантирует другого выходного IP.

python
import getpass
from urllib.parse import quote

import requests
from requests.exceptions import ConnectionError, ProxyError, SSLError, Timeout


def endpoints(host, username, password):
    auth = f"{quote(username, safe='')}:{quote(password, safe='')}"
    return [
        f"socks5h://{auth}@{host}:1080",  # requires requests[socks]
        f"http://{auth}@{host}:3128",    # HTTP proxy; HTTPS uses CONNECT
    ]


def proxies_for(proxy_url):
    return {"http": proxy_url, "https": proxy_url}

def fetch_with_fallback(session, url, proxy_urls, ca_bundle=True):
    # Ignore environment proxy/bypass overrides. Configure custom CA bundles
    # with ca_bundle="/path/to/ca.pem" if needed; verification stays enabled.
    if ca_bundle is not True and (not isinstance(ca_bundle, str) or not ca_bundle):
        raise ValueError("Use True or an explicit CA bundle path")
    session.trust_env = False
    for proxy_url in proxy_urls:
        try:
            response = session.get(
                url,
                proxies=proxies_for(proxy_url),
                timeout=(5, 15),
                verify=ca_bundle,
            )
            response.raise_for_status()
            return response
        except SSLError:
            raise RuntimeError("TLS verification failed; not retried") from None
        except (ProxyError, ConnectionError, Timeout):
            # Never print the authenticated URL or the transport exception.
            continue
    raise RuntimeError("All configured proxy transports failed") from None


if __name__ == "__main__":
    host = input("Proxy host from your account (without scheme or port): ").strip()
    username = input("Proxy username: ")
    password = getpass.getpass("Proxy password: ")
    SOCKS5, HTTP = endpoints(host, username, password)
    with requests.Session() as session:
        try:
            response = fetch_with_fallback(
                session,
                "https://api.ipify.org?format=json",
                [SOCKS5, HTTP],
            )
            print("Exit IP:", response.json()["ip"])
        except (requests.RequestException, RuntimeError):
            raise SystemExit("Request failed; check the endpoint, credentials and TLS settings") from None

Для каждого запроса, для каждой сессии или глобально

Для каждого запроса

Передавайте proxies= в каждый вызов: requests.get(url, proxies=proxies_for(SOCKS5), timeout=10). Самая явная форма, которую легче всего заменять или ротировать для каждого отдельного вызова.

Для каждой сессии

Session повторно использует соединения и cookie, но прокси из окружения могут переопределять session.proxies. Для явного выбора передавайте proxies= в каждый запрос. trust_env=False также игнорирует настройки CA и аутентификации из окружения; необходимые наборы CA задавайте явно.

Глобально через окружение

Requests читает HTTP_PROXY, HTTPS_PROXY и ALL_PROXY, когда доверяет настройкам окружения. Прокси для конкретных схем и NO_PROXY влияют на маршрут. Проверяйте существующие настройки и фактический запрос: одно значение ALL_PROXY не гарантирует его использования для всех запросов.

То, на чём люди спотыкаются

Аутентификация указывается в URL

Кодируйте логин и пароль для URL отдельно через urllib.parse.quote(value, safe=""). Не записывайте учётные данные в журналы и общие исходные файлы. Пример запрашивает пароль без отображения ввода.

Держите DNS удалённым

socks5 разрешает имя цели локально; socks5h поручает это прокси. Это определяет место DNS, а не шифрование или маршруты всего остального трафика приложения. Проверяйте конкретный запрос и оставляйте проверку TLS включённой.

Повторно используйте Session

requests.Session объединяет соединения в пул и сохраняет cookie, поэтому серия запросов через один прокси заметно быстрее, чем вызов requests.get() «с нуля» каждый раз.

Оставьте проверку TLS включённой

Прокси лишь пересылает ваш трафик — это не повод устанавливать verify=False. Держите проверку сертификатов включённой, чтобы посредник не мог незаметно подменить HTTPS-ответы.

FAQ

Ответы на вопросы

Нужен ли прокси SOCKS5 дополнительный пакет?

Да. requests требует PySocks для поддержки SOCKS: установите его с помощью pip install "requests[socks]". HTTP-конечная точка на порту 3128 работает со стандартной установкой requests без дополнительных зависимостей.

В чём разница между socks5 и socks5h?

socks5:// разрешает имя цели локально; socks5h:// передаёт имя хоста прокси для разрешения. Ни одна схема сама по себе не шифрует аутентификацию SOCKS. HTTPS с проверкой сертификата защищает содержимое приложения.

Почему мой исходящий IP не меняется при ротации?

Другой URL прокси или новая Session не обязательно означают другой выход. SOCKS5 и HTTP на одном хосте могут иметь общий адрес. Используйте адрес, выданный для нужного выхода, и проверяйте его запросом к сервису отображения IP; cookie и другие идентификаторы остаются отдельным вопросом.

Это резидентные IP?

Нет. Прокси s4m — это датацентровые SOCKS5 и HTTP эндпоинты с аутентификацией по логину и паролю и тарификацией за гигабайт. Отдельный бесплатный публичный список прокси предоставляется третьими сторонами и не проверен для использования в продакшене.

Как пропустить нерабочий прокси в списке?

Пробуйте только настроенные адреса с ограниченными тайм-аутами подключения и чтения. Пример переходит дальше при ошибках соединения или тайм-аутах, не выводя URL с учётными данными. Ошибки TLS и статуса HTTP не являются основанием обходить проверку или повторять доступ через другой адрес.

Прокси, созданные, чтобы скрыть ваш реальный IP

Настройте доступ SOCKS5 или HTTP в s4m с учётными данными своего аккаунта.

Эту страницу нашли по запросу

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