Use Cases

Rotação de proxy para reduzir CAPTCHA no web scraping

A rotação de proxy não elimina o CAPTCHA — ela reduz a frequência com que ele aparece. Distribuir requisições entre vários IPs evita que um único endereço acumule o padrão de tráfego que os sistemas anti-bot associam a scripts. Combinada com a API da CaptchaAI para resolver o que ainda aparece, o resultado é um pipeline mais estável.

Este guia cobre: quais proxies fazem sentido em cada cenário, por que distribuir requisições reduz o CAPTCHA, código em Python e Selenium, e o caso do Cloudflare Turnstile, que exige atenção redobrada com o proxy.

Tipos de proxy para o web scraping

Tipo Indicado para Frequência de CAPTCHA Custo
Residencial Alvos protegidos (Google, Amazon) Baixa $$$
Móvel Sites com bloqueio agressivo por IP Baixa $$$$
ISP/Estático Sessões longas e sustentadas Média $$
Datacenter Sites tolerantes, alto volume Alta $

Não existe proxy universal: depende da proteção do site e do orçamento. Residenciais e móveis custam mais, mas reduzem bloqueio; em sites tolerantes, datacenter já resolve.

Por que distribuir requisições reduz o CAPTCHA

Os sites acionam CAPTCHA com base em padrões de requisição por IP:

Fator IP único Proxies em rotação
Requisições por minuto Mais de 10 já aciona o CAPTCHA Distribuídas entre vários IPs
Reputação do IP Cai com o tempo de uso IPs frescos entram no pool continuamente
Padrão de sessão Fica visível como automação Espalhado, sem repetição óbvia
Consistência geográfica Local único, fácil de sinalizar Diversidade geográfica natural

Workers concentrados em uma única região (sa-east-1, São Paulo) batendo no mesmo site geram esse padrão rápido. Rotacionar IPs de faixas diferentes resolve isso.

Rotação básica de proxy em Python

O padrão mais simples: proxy aleatório a cada requisição e, se um CAPTCHA aparecer, resolver com a CaptchaAI antes de continuar.

import requests
import random
import time

PROXIES = [
    "http://user:pass@proxy1.example.com:8080",
    "http://user:pass@proxy2.example.com:8080",
    "http://user:pass@proxy3.example.com:8080",
]

API_KEY = "YOUR_API_KEY"

def get_random_proxy():
    proxy = random.choice(PROXIES)
    return {"http": proxy, "https": proxy}

def scrape_with_rotation(url):
    proxy = get_random_proxy()
    session = requests.Session()
    session.proxies = proxy
    session.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    })

    resp = session.get(url)

    # If CAPTCHA appears, solve it
    if "g-recaptcha" in resp.text or "captcha" in resp.text.lower():
        from bs4 import BeautifulSoup
        soup = BeautifulSoup(resp.text, "html.parser")
        rc = soup.find("div", class_="g-recaptcha")
        if rc:
            site_key = rc["data-sitekey"]
            token = solve_captcha(site_key, url)
            resp = session.post(url, data={"g-recaptcha-response": token})

    return resp.text

def solve_captcha(site_key, page_url):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY, "method": "userrecaptcha",
        "googlekey": site_key, "pageurl": page_url
    })
    task_id = resp.text.split("|")[1]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        if result.text.startswith("OK|"): return result.text.split("|")[1]
        raise Exception(result.text)
    raise TimeoutError()

Rotação inteligente: priorize os IPs com menor taxa de CAPTCHA

Nem todo proxy se comporta igual. O padrão abaixo registra, por proxy, as ocorrências de CAPTCHA e prioriza os que têm melhor desempenho:

from collections import defaultdict
import random

class SmartProxyRotator:
    def __init__(self, proxies):
        self.proxies = proxies
        self.captcha_count = defaultdict(int)
        self.success_count = defaultdict(int)

    def get_proxy(self):
        # Prefer proxies with lower CAPTCHA rates
        scored = []
        for proxy in self.proxies:
            total = self.captcha_count[proxy] + self.success_count[proxy]
            if total == 0:
                score = 0.5  # Unknown proxy, neutral score
            else:
                score = self.success_count[proxy] / total
            scored.append((proxy, score))

        # Weight selection by score
        scored.sort(key=lambda x: x[1], reverse=True)
        top_proxies = scored[:max(len(scored) // 2, 1)]
        proxy = random.choice(top_proxies)[0]
        return proxy

    def report_success(self, proxy):
        self.success_count[proxy] += 1

    def report_captcha(self, proxy):
        self.captcha_count[proxy] += 1

# Usage
rotator = SmartProxyRotator(PROXIES)

def scrape(url):
    proxy = rotator.get_proxy()
    resp = requests.get(url, proxies={"http": proxy, "https": proxy})

    if "captcha" in resp.text.lower():
        rotator.report_captcha(proxy)
        # Solve CAPTCHA...
    else:
        rotator.report_success(proxy)

    return resp.text

Rotação de proxy com Selenium

Para automação com navegador completo, o proxy é definido na criação do driver — a rotação, aqui, normalmente acontece por sessão, não por requisição:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def create_driver_with_proxy(proxy_url):
    options = Options()
    options.add_argument(f"--proxy-server={proxy_url}")
    options.add_argument("--disable-blink-features=AutomationControlled")
    return webdriver.Chrome(options=options)

# Rotate proxy per session
proxy = random.choice(PROXIES)
driver = create_driver_with_proxy(proxy)
driver.get("https://example.com")

Proxy e CAPTCHA juntos: o caso do Cloudflare Turnstile em staging

A maioria dos tokens de CAPTCHA vale para qualquer IP. O Cloudflare Turnstile em staging é a exceção: o cookie de validação fica vinculado ao IP que resolveu o desafio.

proxy = "http://user:pass@proxy.example.com:8080"

resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "turnstile_staging",
    "pageurl": "https://example.com",
    "proxy": proxy,
    "proxytype": "HTTP"
})
task_id = resp.text.split("|")[1]

# Poll for cookie_qa_validacao cookie
# Use the same proxy for subsequent requests

Trocar de proxy no meio da sessão invalida o cookie de validação — trate esse fluxo como sessão fixa, nunca como rotação por requisição.

Boas práticas de rotação de proxy

Combine a geografia do proxy com o destino

Escolha proxies com IP na mesma região do site-alvo. Um IP dos EUA acessando um site dos EUA passa como tráfego local; o mesmo IP em um site brasileiro já é um sinal de anomalia que aumenta a chance de desafio.

Uma sessão por proxy

Não reaproveite cookies de sessão entre proxies diferentes. Trocar de IP no meio de uma sessão autenticada é um dos padrões mais fáceis de sinalizar, mesmo com proxies de boa reputação.

Limite a taxa por proxy

Mantenha entre 5 e 10 requisições por minuto por IP. Ultrapassar esse teto reproduz, com proxies, o mesmo padrão que dispara CAPTCHA em um IP único — só que multiplicado pelo tamanho do pool.

Monitore a taxa de CAPTCHA por proxy

Registre quantos desafios cada proxy provoca e descarte os que ficam abaixo da média do pool. Um proxy "queimado" continua gerando CAPTCHA mesmo depois de abrir uma sessão nova.

Use sessão fixa quando o site exigir

Alguns fluxos — como o Cloudflare Turnstile em staging — vinculam o cookie de validação ao IP que resolveu o desafio. Nesses casos, force uma sessão fixa por proxy em vez de rotacionar a cada requisição.

Trate logs de IP conforme a LGPD/RGPD

Guarde o mínimo necessário de logs de IP e defina uma finalidade clara para a retenção. A regra vale tanto para o pool de proxies quanto para os IPs de origem que passam pela API da CaptchaAI.

Erros comuns e como corrigir

Problema Correção
Todos os proxies acionam CAPTCHA Amplie o pool; reduza a taxa de requisições
Timeout no proxy Remova os proxies lentos; aumente o tempo limite
Conteúdo diferente por proxy Normalize por região ou fixe a geografia
Token do CAPTCHA não funciona Use o mesmo proxy/sessão do início ao fim

Perguntas frequentes

Preciso de proxies se já uso a API da CaptchaAI?

Não necessariamente. A CaptchaAI resolve o CAPTCHA independentemente do IP; proxies só reduzem a frequência do desafio.

Quantos proxies são necessários para uma coleta de volume moderado?

Para cerca de 1.000 páginas/dia, 10 a 20 proxies residenciais em rotação costumam bastar; acima disso, use um provedor com rotação automática.

Proxies residenciais valem o custo extra?

Em alvos com proteção agressiva, sim — o custo se paga em menos CAPTCHA. Em sites tolerantes, um pool de datacenter mais barato já resolve.

O plano BASIC da CaptchaAI aguenta um pool de proxies em rotação?

Sim. O limite é por threads, não por proxy — o BASIC (US$ 15/mês, 5 threads) resolve até 5 CAPTCHAs em paralelo, não importa o tamanho do pool.

Posso misturar proxies residenciais e de datacenter no mesmo pool?

Sim, é uma estratégia comum: use datacenter para a maior parte do volume e reserve os residenciais para os alvos que acionam CAPTCHA com mais frequência. O SmartProxyRotator do exemplo acima já prioriza automaticamente os proxies com melhor taxa de sucesso, então o mix se ajusta sozinho.

Guias relacionados

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