Comparações

Sessões fixas versus sessões rotativas: mais adequado estratégia de proxy para CAPTCHAs

As sessões fixas mantêm o mesmo IP por um período definido. Sessões rotativas atribuem um novo IP por solicitação. Escolher o errado aumenta as taxas de CAPTCHA e desperdiça créditos de API.


Como funciona cada modo

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)

Comparação cara a cara

Fator Pegajoso Girando
IP por solicitação O mesmo por 1-30 minutos Novo a cada solicitação
Consistência da sessão Alto Nenhum
Taxa CAPTCHA (fluxos de várias etapas) Baixo (5-10%) Alto (30-50%)
Taxa CAPTCHA (páginas únicas) Médio (10-20%) Baixo (5-10%)
Validade do token Superior – mesmo IP Risco de incompatibilidade
Velocidade Rápido (reutiliza conexão) Mais lento (nova conexão)
Risco de banimento Maior se sinalizado Baixo – novo IP a cada vez
Custo Igual ou um pouco mais Igual
mais adequado para Login, checkout, autenticação Raspagem em massa, pesquisa

Quando as Sticky Sessions vencem

Fluxos de trabalho de várias etapas

CAPTCHAs validam tokens em relação ao IP solicitante. Se o seu IP mudar entre a resolução e o envio, o token poderá ser rejeitado.

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")

Por que a consistência de IP é importante

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

Quando as sessões rotativas vencem

Raspagem de páginas em massa

Cada página é independente. A rotação de IPs espalha as solicitações por um pool maior, reduzindo a detecção por 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)}")

Raspagem de mecanismo de pesquisa

Os mecanismos de pesquisa rastreiam o volume de consultas por IP. A rotação evita limites de taxa:

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

Estratégia Híbrida

Use os dois modos no mesmo pipeline:

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)

Implementação 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
  );
}

Matriz de Decisão

Fluxo de trabalho Recomendado Por que
Login / inscrição Pegajoso Token vinculado ao IP
Finalização / pagamento Pegajoso Cookies de sessão precisam do mesmo IP
Raspagem de páginas em massa Girando Distribui carga
Raspagem de mecanismo de pesquisa Girando Evita limites de taxa por IP
Pesquisa de API (mesmo endpoint) Girando Reduz a sinal de navegador por IP
Navegação em várias páginas Pegajoso Cookies rastreados por IP
Monitoramento de preços Girando Muitos pedidos independentes
Gerenciamento de contas Pegajoso Integridade da sessão
Envio de formulário com CAPTCHA Pegajoso Ligação token-IP
Verificação de anúncios Girando Simule diversos usuários

Duração da sessão fixa

Duração mais adequado para Risco
1 minuto Envio rápido de formulário Pode expirar no meio do fluxo
5 minutos Login padrão + ações Bom equilíbrio
10 minutos Fluxos complexos de várias páginas Risco moderado de banimento
30 minutos Sessões de navegação estendidas Maior risco de banimento
60 minutos Operações de conta longa Maior risco de banimento

Regra geral: Defina a duração fixa para 2x o tempo de fluxo esperado.


Solução de problemas

Problema Causa Correção
Token CAPTCHA rejeitado após resolução IP alterado entre resolver e enviar Mudar para sessão fixa
Alta taxa de CAPTCHA em páginas únicas O mesmo IP fixo atingindo muitas páginas Mudar para rotação
Cookies de sessão perdidos A sessão fixa expirou Aumentar a duração do TTL
Desempenho de rotação lenta Sobrecarga de conexão por novo IP Usar pool de conexões
IP banido em sessão fixa Todas as solicitações compartilham o IP sinalizado Reduza o TTL da sessão ou adicione atrasos

Perguntas frequentes

Posso misturar pegajoso e rotativo em um projeto?

Sim. Use a abordagem híbrida – fixa para fluxos de autenticação, rotativa para coleta de dados. A maioria dos provedores de proxy oferece suporte a ambos os modos no mesmo plano.

A sessão fixa garante o mesmo IP?

A maioria dos provedores garante isso dentro da janela TTL. Se o IP ficar indisponível (reatribuição de operadora, rotação de pool), um novo IP será atribuído.

Qual modalidade é mais barata?

Mesmo preço: você paga por GB ou por solicitação, independentemente do modo. A diferença de custo vem das taxas de CAPTCHA: modo errado → mais CAPTCHAs → maior gasto de CaptchaAI.

Como configuro sessões fixas com meu provedor de proxy?

A maioria usa um ID de sessão no nome de usuário: user-session-abc123. Verifique os documentos do seu provedor para obter o formato exato. Nós cobrimosDados brilhantes,Proxy inteligente, eOxylabsem guias dedicados.


Guias Relacionados


Combine sua estratégia de proxy com seu fluxo de trabalho —obtenha sua chave CaptchaAIpara lidar com CAPTCHAs em qualquer modo de sessão.

Os comentários estão desativados para este artigo.