Посібник з 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 з обліковими даними свого акаунта.

Цю сторінку знаходять за запитами

Реальні пошукові фрази, на які відповідає ця сторінка — за посиланнями відкриються матеріали, що розкривають тему глибше.