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.