Сравнения

Прикрепленные сеансы против чередующихся сеансов: подходящий стратегия прокси для CAPTCHA

Прикрепленные сеансы сохраняют один и тот же IP-адрес в течение заданного периода времени. Ротационные сеансы назначают новый IP-адрес для каждого запроса. Выбор неправильного варианта приводит к завышению ставок CAPTCHA и потере кредитов API.


Как работает каждый режим

STICKY SESSION:
  Request 1 ──▶ IP: 192.168.1.50 ──▶ site.com/login
  Request 2 ──▶ IP: 192.168.1.50 ──▶ site.com/dashboard
  Request 3 ──▶ IP: 192.168.1.50 ──▶ site.com/account
  (Same IP for all requests in the session window)

ROTATING SESSION:
  Request 1 ──▶ IP: 192.168.1.50 ──▶ site.com/page1
  Request 2 ──▶ IP: 10.0.0.77   ──▶ site.com/page2
  Request 3 ──▶ IP: 172.16.5.22 ──▶ site.com/page3
  (Different IP per request)

Прямое сравнение

Фактор Липкий Вращающийся
IP-адрес на запрос То же для 1–30 мин. Новый каждый запрос
Постоянство сеанса Высокий Никто
Доля CAPTCHA (многоэтапные потоки) Низкий (5-10%) Высокий (30-50%)
Доля CAPTCHA (отдельные страницы) Средний (10-20%) Низкий (5-10%)
Действительность токена Выше — тот же IP Риск несоответствия
Скорость Быстро (повторно использует соединение) Медленнее (новое соединение)
Риск бана Выше, если отмечено Низкий — каждый раз новый IP
Расходы То же или чуть больше Такой же
подходящий вариант Вход, оформление заказа, авторизация Массовый парсинг, поиск

Когда выигрывают закрепленные сеансы

Многоэтапные рабочие процессы

CAPTCHA проверяет токены на соответствие запрашивающему IP. Если ваш IP-адрес изменится между решением и отправкой, токен может быть отклонен.

import requests
import time

CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"

# Sticky session: same IP for the entire login flow
STICKY_PROXY = {
    "http": "http://user-session-abc123:pass@proxy.example.com:5000",
    "https": "http://user-session-abc123:pass@proxy.example.com:5000",
}

session = requests.Session()
session.proxies = STICKY_PROXY
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
    "AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
})


def login_with_captcha(url, sitekey, username, password):
    """Full login flow — MUST use same IP throughout."""
    # Step 1: Load login page (IP: 192.168.1.50)
    session.get(url)

    # Step 2: Solve CAPTCHA (solved against IP: 192.168.1.50)
    token = solve_recaptcha(sitekey, url)

    # Step 3: Submit login (MUST be IP: 192.168.1.50)
    resp = session.post(url, data={
        "username": username,
        "password": password,
        "g-recaptcha-response": token,
    })

    return resp.status_code == 200


def solve_recaptcha(sitekey, pageurl):
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1,
    })
    task_id = resp.json()["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = result.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]

    raise TimeoutError("CAPTCHA solve timeout")

Почему важна согласованность IP-адресов

Sticky session:

  1. Browser loads page    → IP: 5.5.5.5
  2. CAPTCHA solved        → Token bound to session
  3. Form submitted        → IP: 5.5.5.5 ✅ Token accepted

Rotating session:

  1. Browser loads page    → IP: 5.5.5.5
  2. CAPTCHA solved        → Token bound to session
  3. Form submitted        → IP: 9.9.9.9 ❌ Token may be rejected

Когда ротация сессий выигрывает

Массовое парсинг страниц

Каждая страница независима. Ротация IP-адресов распределяет запросы по более крупному пулу, уменьшая обнаружение каждого IP-адреса.

import concurrent.futures

ROTATING_PROXY = {
    "http": "http://user:pass@rotating.proxy.example.com:5000",
    "https": "http://user:pass@rotating.proxy.example.com:5000",
}


def scrape_page(url):
    """Each request gets a fresh IP automatically."""
    resp = requests.get(
        url,
        proxies=ROTATING_PROXY,
        headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"},
        timeout=30,
    )
    if resp.status_code == 200:
        return url, resp.text
    return url, None


urls = [f"https://example.com/products?page={i}" for i in range(1, 501)]

with concurrent.futures.ThreadPoolExecutor(max_workers=10) as pool:
    results = list(pool.map(scrape_page, urls))
    success = sum(1 for _, html in results if html)
    print(f"Scraped: {success}/{len(urls)}")

Парсинг поисковых систем

Поисковые системы отслеживают объем запросов по IP. Вращение позволяет избежать ограничений скорости:

def scrape_search(query, pages=10):
    results = []
    for page in range(pages):
        # Each request → new IP
        resp = requests.get(
            "https://search-engine.example.com/search",
            params={"q": query, "start": page * 10},
            proxies=ROTATING_PROXY,
            timeout=20,
        )
        results.append(resp.text)
        time.sleep(2)
    return results

Гибридная стратегия

Используйте оба режима в одном конвейере:

class HybridProxyManager:
    """Sticky for multi-step flows, rotating for single requests."""

    def __init__(self, provider_host, username, password, port=5000):
        self.host = provider_host
        self.username = username
        self.password = password
        self.port = port

    def get_rotating_proxy(self):
        return {
            "http": f"http://{self.username}:{self.password}@{self.host}:{self.port}",
            "https": f"http://{self.username}:{self.password}@{self.host}:{self.port}",
        }

    def get_sticky_proxy(self, session_id, duration_min=10):
        sticky_user = f"{self.username}-session-{session_id}-ttl-{duration_min}"
        return {
            "http": f"http://{sticky_user}:{self.password}@{self.host}:{self.port}",
            "https": f"http://{sticky_user}:{self.password}@{self.host}:{self.port}",
        }


proxy_mgr = HybridProxyManager("proxy.example.com", "user", "pass")


def scrape_with_auto_strategy(url, needs_login=False):
    if needs_login:
        # Multi-step → sticky
        import uuid
        session_id = uuid.uuid4().hex[:8]
        proxy = proxy_mgr.get_sticky_proxy(session_id)
    else:
        # Single page → rotating
        proxy = proxy_mgr.get_rotating_proxy()

    return requests.get(url, proxies=proxy, timeout=30)

Реализация Node.js

const axios = require("axios");

const CAPTCHAAI_KEY = "YOUR_API_KEY";
const PROXY_HOST = "proxy.example.com";
const PROXY_PORT = 5000;

function getProxy(mode, sessionId = null) {
  const user =
    mode === "sticky" ? `user-session-${sessionId}` : "user";

  return {
    proxy: {
      host: PROXY_HOST,
      port: PROXY_PORT,
      auth: { username: user, password: "pass" },
    },
  };
}

// Rotating: bulk scrape
async function scrapePages(urls) {
  const results = [];
  for (const url of urls) {
    const config = getProxy("rotating");
    const resp = await axios.get(url, { ...config, timeout: 30000 });
    results.push({ url, data: resp.data });
  }
  return results;
}

// Sticky: login flow
async function loginFlow(loginUrl, sitekey, credentials) {
  const sessionId = Date.now().toString(36);
  const config = getProxy("sticky", sessionId);

  // Step 1: Load page
  await axios.get(loginUrl, config);

  // Step 2: Solve CAPTCHA
  const submitResp = await axios.post(
    "https://ocr.captchaai.com/in.php",
    null,
    {
      params: {
        key: CAPTCHAAI_KEY,
        method: "userrecaptcha",
        googlekey: sitekey,
        pageurl: loginUrl,
        json: 1,
      },
    }
  );
  const taskId = submitResp.data.request;

  let token;
  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const res = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: CAPTCHAAI_KEY, action: "get", id: taskId, json: 1 },
    });
    if (res.data.request !== "CAPCHA_NOT_READY") {
      token = res.data.request;
      break;
    }
  }

  // Step 3: Submit with same IP
  return axios.post(
    loginUrl,
    {
      ...credentials,
      "g-recaptcha-response": token,
    },
    config
  );
}

Матрица решений

Рабочий процесс Рекомендуется Почему
Войти/зарегистрироваться Липкий Токен привязан к IP
Оформление заказа / оплата Липкий Сеансовые файлы cookie требуют одного и того же IP-адреса.
Массовый парсинг страниц Вращающийся Распределяет нагрузку
Парсинг поисковых систем Вращающийся Избегает ограничений скорости для каждого IP
Опрос API (та же конечная точка) Вращающийся Уменьшает Сигналы IP-адреса
Многостраничная навигация Липкий Файлы cookie, отслеживаемые по IP
Мониторинг цен Вращающийся Множество независимых запросов
Управление аккаунтом Липкий Целостность сеанса
Отправка формы с CAPTCHA Липкий Привязка токена к IP
Проверка объявления Вращающийся Имитируйте разных пользователей

Продолжительность закрепленной сессии

Продолжительность подходящий для Риск
1 мин. Быстрая отправка формы Может истечь в середине потока
5 минут Стандартный вход + действия Хороший баланс
10 минут Сложные многостраничные потоки Умеренный риск бана
30 мин. Расширенные сеансы просмотра Более высокий риск бана
60 мин. Длинные операции по счету Самый высокий риск бана

Правило: установите продолжительность закрепления в 2 раза больше ожидаемого времени потока.


Поиск неисправностей

Проблема Причина Исправить
Токен CAPTCHA отклонен после решения IP изменился между решением и отправкой Переключиться на прикрепленный сеанс
Высокий уровень CAPTCHA на отдельных страницах Один и тот же липкий IP-адрес затрагивает слишком много страниц. Переключиться на вращение
Файлы cookie сеанса потеряны Срок действия прикрепленного сеанса истек Увеличение продолжительности TTL
Медленное вращение Накладные расходы на соединение на новый IP Использовать пул соединений
Забаненный IP в липкой сессии Все запросы используют помеченный IP-адрес. Уменьшите TTL сеанса или добавьте задержки.

Часто задаваемые вопросы

Могу ли я совместить липкое и вращающееся в одном проекте?

Да. Используйте гибридный подход — фиксированный для потоков аутентификации и ротационный для сбора данных. Большинство прокси-провайдеров поддерживают оба режима в одном и том же плане.

не является универсальным обещанием ли липкий сеанс тот же IP-адрес?

Большинство провайдеров не является универсальным обещанием это в пределах окна TTL. Если IP становится недоступным (переназначение оператора связи, ротация пула), назначается новый IP.

Какой режим дешевле?

Та же цена — вы платите за ГБ или за запрос независимо от режима. Разница в стоимости обусловлена ​​ставками CAPTCHA: неправильный режим → больше CAPTCHA → больше затрат CaptchaAI.

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

Большинство используют идентификатор сеанса в имени пользователя: user-session-abc123. Проверьте документацию вашего провайдера, чтобы узнать точный формат. Мы покрываемЯркие данные,Смартпрокси, иОксилабсв специальных руководствах.


Связанные руководства


Сопоставьте свою стратегию прокси с вашим рабочим процессом —получите ключ CaptchaAIдля обработки CAPTCHA в любом режиме сеанса.

Комментарии для этой статьи отключены.