# Как подключить азиатский резидентный прокси в Python Requests?

> Чтобы использовать прокси в Python Requests, передайте в каждый запрос словарь proxies, например {"https": "http://USERNAME-country-jp:PASSWORD@gw.jadeproxies.com:7777"}. В Jade Proxies имя пользователя также задаёт город и sticky-сессию, а SOCKS5 работает так же: схема socks5h:// и порт 7778.

Источник: https://jadeproxies.com/ru/how-to-use-a-proxy-with-python-requests/ · Jade Proxies · Обновлено 29 октября 2026

**Ключевой показатель: $50** — Согласно нашей сетке цен, миллион страниц, загруженных через Python Requests, стоит $50 резидентного трафика на тарифе 100 ГБ при условии 100 КБ трафика на страницу. (Сетка цен Jade Proxies, 29 октября 2026; вес страницы 100 КБ — допущение, а не результат измерения)


## Что нужно для начала?

Вам понадобятся Python 3, библиотека Requests и данные для доступа к прокси. Jade Proxies поддерживает логин и пароль или белый список IP (до 10 IP); субпользователи с собственными учётными данными и лимитом трафика; API-ключи, которые можно отозвать в любой момент. Все примеры отправляют трафик через шлюз `gw.jadeproxies.com`: порт 7777 для HTTP и HTTPS, порт 7778 для SOCKS5.

1. **Установите Requests с поддержкой SOCKS.** Выполните `pip install "requests[socks]"` — команда установит Requests и PySocks.
2. **Сохраните учётные данные.** Поместите логин и пароль прокси из вашего аккаунта Jade Proxies в переменные окружения `PROXY_USER` и `PROXY_PASS`, а не в код.
3. **Соберите словарь HTTP-прокси.** Укажите для ключей `http` и `https` значение `http://USER:PASS@gw.jadeproxies.com:7777`; HTTPS-сайты открываются через туннель CONNECT, поэтому TLS остаётся сквозным.
4. **При необходимости переключитесь на SOCKS5.** Используйте `socks5h://USER:PASS@gw.jadeproxies.com:7778`, чтобы DNS разрешался на выходном узле, в целевой стране.
5. **Задайте страну и город.** Дополните имя пользователя параметром `-country-jp`, затем `-city-osaka` по формату `USERNAME-country-{cc}-city-{city}-session-{id}-ttl-{minutes}`.
6. **Сохраняйте один IP с помощью sticky-сессии.** Добавьте `-session-ID-ttl-MINUTES` и используйте один `requests.Session`; IP сохраняется до 30 минут (IP может смениться раньше).
7. **Проверьте выходной IP.** Запросите `https://ipinfo.io/json` через прокси и проверьте поле `country` перед основной задачей.
8. **Настройте таймауты и повторы.** Передайте `timeout=(10, 30)` и подключите `HTTPAdapter` с политикой `Retry` для ответов 429 и 5xx.
9. **Запускайте запросы параллельно.** Используйте `ThreadPoolExecutor`; один запрос на соединение даёт новый IP на каждый запрос.

## Как задать HTTP-прокси в Python Requests?

HTTP-прокси задаётся словарём `proxies`, в котором ключи `http` и `https` указывают на HTTP-порт шлюза.

```python
import os
import requests
from urllib.parse import quote

USER = os.environ["PROXY_USER"]
PASS = quote(os.environ["PROXY_PASS"], safe="")  # encodes @ : / in passwords

proxy = f"http://{USER}-country-jp:{PASS}@gw.jadeproxies.com:7777"
proxies = {"http": proxy, "https": proxy}

r = requests.get("https://example.com/", proxies=proxies, timeout=(10, 30))
print(r.status_code)
```

URL прокси начинается с `http://` даже под ключом `https`: Requests открывает туннель CONNECT через шлюз, а TLS-сессия устанавливается между вашим скриптом и сайтом. Статус `407` означает, что шлюз отклонил логин или пароль.

## Как использовать SOCKS5-прокси с Requests?

Для SOCKS5 замените схему на `socks5h`, а порт — на 7778; остальной код не меняется.

```python
proxy = f"socks5h://{USER}-country-kr:{PASS}@gw.jadeproxies.com:7778"
proxies = {"http": proxy, "https": proxy}
r = requests.get("https://example.com/", proxies=proxies, timeout=(10, 30))
```

Со схемой `socks5h` шлюз разрешает имя хоста в Корее. С обычной `socks5` имя разрешает ваш компьютер: запрос виден вашему локальному DNS, и он может вернуть сервер за пределами целевой страны.

## Как выбрать страну и город?

Выходной узел выбирается параметрами в имени пользователя. Jade Proxies предлагает таргетинг по стране и городу на всех тарифах; таргетинг по ASN без доплаты; доступность городов различается.

| Цель | Имя пользователя |
|---|---|
| Любой IP в Японии | `USER-country-jp` |
| Осака | `USER-country-jp-city-osaka` |
| Мумбаи | `USER-country-in-city-mumbai` |
| Бангкок, один IP на 10 минут | `USER-country-th-city-bangkok-session-a1b2c3-ttl-10` |

Коды стран — двухбуквенные коды ISO для 13 стран со страницы [азиатских резидентных прокси](https://jadeproxies.com/ru/asian-residential-proxies/). Небольшая вспомогательная функция держит формат в одном месте:

```python
def proxy_url(country, city=None, session=None, ttl=10, socks=False):
    user = f"{USER}-country-{country}"
    if city:
        user += f"-city-{city}"
    if session:
        user += f"-session-{session}-ttl-{ttl}"
    if socks:
        return f"socks5h://{user}:{PASS}@gw.jadeproxies.com:7778"
    return f"http://{user}:{PASS}@gw.jadeproxies.com:7777"
```

## Как сохранить один IP для нескольких запросов?

Чтобы сохранить IP, добавьте в имя пользователя ID сессии и TTL и отправляйте запросы через один `requests.Session`.

```python
import uuid

p = proxy_url("jp", "tokyo", session=uuid.uuid4().hex[:8], ttl=30)
s = requests.Session()
s.proxies = {"http": p, "https": p}
for page in range(1, 4):
    s.get(f"https://example.jp/list?page={page}", timeout=(10, 30))
```

Без ID сессии каждое новое соединение получает IP из пула, как правило другой; чтобы получать новый IP при каждом запросе, отправляйте один запрос на соединение (отключите keep-alive). `requests.Session` держит соединения открытыми, поэтому, если вам нужен новый IP на каждый запрос, используйте обычные вызовы `requests.get()`. В [руководстве по ротируемым и sticky-прокси](https://jadeproxies.com/ru/rotating-vs-sticky-proxies/) объясняется, какой режим подходит для какой задачи.

## Как проверить, что выходной IP находится в нужной стране?

Запросите через прокси сервис информации об IP и сравните код страны с запрошенным.

```python
info = requests.get("https://ipinfo.io/json", proxies=proxies, timeout=15).json()
assert info["country"] == "JP", info
print(info["ip"], info.get("city"), info.get("org"))
```

Поле `org` указывает сеть, которой принадлежит IP; у резидентного выходного узла это потребительский интернет-провайдер, а не хостинговая компания. Выполняйте эту проверку один раз для каждой страны перед долгой задачей.

## Как обрабатывать таймауты и повторы?

Задавайте таймаут подключения и чтения в каждом вызове и повторяйте временные ошибки с нарастающей задержкой: резидентный выходной узел — это домашнее подключение, которое может оборваться в любой момент.

```python
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

retry = Retry(total=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504], allowed_methods=["GET"])
s = requests.Session()
s.mount("http://", HTTPAdapter(max_retries=retry))
s.mount("https://", HTTPAdapter(max_retries=retry))
r = s.get("https://example.com/", proxies=proxies, timeout=(10, 30))
```

Повторы расходуют трафик, только если доходят до сайта: учитываются все данные, отправленные и полученные через прокси (исходящий и входящий трафик, включая заголовки); 1 ГБ = 1 000 000 000 байт; попытки соединения, завершившиеся неудачей до обращения к целевому ресурсу, не учитываются.

## Как отправлять запросы параллельно?

Используйте пул потоков: Requests синхронна, и каждый поток ждёт своё соединение.

```python
from concurrent.futures import ThreadPoolExecutor

def fetch(url):
    r = requests.get(url, proxies=proxies, timeout=(10, 30))
    return url, r.status_code, len(r.content)

with ThreadPoolExecutor(max_workers=10) as pool:
    for url, status, size in pool.map(fetch, urls):
        print(status, size, url)
```

Каждый вызов `requests.get()` открывает своё соединение, поэтому каждый запрос получает свой IP. Начните с 10 потоков, увеличивайте их число, пока доля ошибок и ответов 429 не растёт, и соблюдайте лимиты запросов и правила каждого сайта.

## Сколько трафика расходует парсинг на Python Requests?

Расход примерно равен числу страниц, умноженному на средний объём трафика на страницу. В таблице принято 100 КБ на страницу: сжатый HTML плюс заголовки запроса и ответа, без изображений. Этот вес — допущение для расчёта, а не результат измерения.

| Парсинг | Трафик | Тариф | Стоимость |
|---|---|---|---|
| 10 000 страниц | 1 ГБ | Тест | $1.50 |
| 100 000 страниц | 10 ГБ | Рост | $6.60 |
| 500 000 страниц | 50 ГБ | Про | $26 |
| 1 000 000 страниц | 100 ГБ | Бизнес | $50 |

Согласно нашей сетке цен, при таком весе миллион страниц стоит $50 резидентного трафика на тарифе 100 ГБ. Вес страниц зависит от сайта, поэтому сначала измерьте своё среднее значение на выборке из 1 000 страниц; о маркетплейсах рассказывает [руководство по Shopee и Lazada](https://jadeproxies.com/ru/best-proxy-for-shopee-lazada-scraping/). Все тарифы — на [странице цен](https://jadeproxies.com/ru/pricing/), а трафик не сгорает.

## Частые вопросы

### Почему Requests игнорирует мой прокси?

Requests применяет прокси только к схемам URL, которые есть в словаре `proxies`, поэтому при словаре только с ключом `http` HTTPS-запросы уходят напрямую. Задайте оба ключа и проверьте, что переменная окружения `NO_PROXY` не совпадает с целевым хостом.

### Чем socks5 отличается от socks5h в Requests?

Со схемой `socks5h` имя хоста разрешает прокси на выходном узле; с `socks5` — ваш компьютер локально. Для азиатских сайтов используйте `socks5h`, чтобы ответы DNS соответствовали стране выхода.

### Как получать новый IP при каждом запросе?

Не указывайте ID сессии в имени пользователя и отправляйте один запрос на соединение, например обычными вызовами `requests.get()` вместо общего `Session`. Каждое новое соединение получает IP из пула, как правило другой.

### Что означает ошибка 407?

Статус `407 Proxy Authentication Required` означает, что шлюз не принял учётные данные. Проверьте кодирование пароля через `urllib.parse.quote` и синтаксис имени пользователя, например `USER-country-jp-city-osaka`.

### Сколько стоит первый тест?

Тариф 1 ГБ стоит $1.50 — около 10 000 страниц при допущении в 100 КБ, указанном выше. Оплата идёт с криптовалютного баланса, минимальное пополнение баланса — $1, а неиспользованный трафик никогда не сгорает.
