Você comprou IPs residenciais limpos, faz a rotação deles perfeitamente e ainda recebe 403 na primeira requisição. O IP não é o problema — é o seu handshake TLS. O TLS fingerprinting permite que um servidor identifique a biblioteca cliente antes de ler um único byte da sua requisição HTTP. Este guia explica JA3/JA4, mostra por que o requests do Python é trivial de detectar e fornece código funcional para imitar navegadores reais com curl_cffi e tls-client.
Quando qualquer cliente abre uma conexão HTTPS, ele envia um ClientHello que anuncia sua versão de TLS, conjuntos de cifras, extensões, curvas elípticas e a ordem de todos eles. Essa ordenação é notavelmente específica da biblioteca que a construiu. Faça o hash dela e você obtém uma impressão digital JA3 (ou a mais nova e robusta JA4).
O Chrome produz uma impressão digital. O Firefox, outra. O requests do Python (construído sobre urllib3 e OpenSSL) produz uma impressão digital que grita "automação" — e ela é idêntica em milhões de bots. Sistemas antibot mantêm uma blocklist dessas. Por mais residencial que seja o seu IP, um JA3 de bot conhecido é marcado.
Antes de corrigir qualquer coisa, meça. Envie uma requisição do seu scraper para o verificador gratuito de impressão digital JA3/JA4 da JIBAO e compare com o que um Chrome real mostra. Se os hashes JA3 forem diferentes, o alvo consegue distinguir você de um humano — e o Cloudflare também.
O requests e o httpx entregam o TLS ao OpenSSL do sistema. Você pode mudar os cabeçalhos e até o User-Agent o dia todo, mas o handshake por baixo continua sendo o do OpenSSL, não o do Chrome. Falsificar cabeçalhos sem falsificar o handshake é a razão mais comum para o "copiei os cabeçalhos do navegador e ainda assim me bloqueia". Você precisa de um cliente que imite a pilha TLS real do navegador.
O curl_cffi faz binding com o curl-impersonate, uma build do curl que reproduz impressões digitais reais de TLS e HTTP/2 de navegadores. Um argumento e o seu handshake fica parecido com o do Chrome:
# pip install curl_cffi
from curl_cffi import requests
# impersonate a real Chrome TLS + HTTP/2 fingerprint
r = requests.get(
"https://tls.browserleaks.com/json",
impersonate="chrome131",
)
print(r.json()["ja3_hash"]) # now matches real Chrome
A API espelha a do requests, então migrar um scraper existente é, na maior parte, uma mudança de import de uma linha. Os alvos suportados incluem builds recentes de Chrome, Edge, Safari e Firefox — escolha um e mantenha-o atualizado, porque as impressões digitais mudam à medida que os navegadores são atualizados.
Combinar a impressão digital e fazer rotação de IP são complementares, não alternativas. Use os dois: um handshake de nível de navegador sobre um IP residencial limpo é o que realmente passa:
from curl_cffi import requests
PROXY = "socks5h://USERNAME:[email protected]:10001"
r = requests.get(
"https://example.com/protected",
impersonate="chrome131",
proxies={"http": PROXY, "https": PROXY},
timeout=30,
)
print(r.status_code)
O tls-client (um wrapper Python sobre uma implementação uTLS em Go) é outra opção sólida, com uma grande biblioteca de perfis nomeados:
# pip install tls-client
import tls_client
session = tls_client.Session(
client_identifier="chrome_120",
random_tls_extension_order=True,
)
session.proxies = {
"http": "socks5h://USERNAME:[email protected]:10001",
"https": "socks5h://USERNAME:[email protected]:10001",
}
r = session.get("https://example.com/protected")
print(r.status_code)
O random_tls_extension_order=True embaralha a ordem das extensões para evitar uma impressão digital estática e reutilizável — útil contra sistemas que rastreiam JA3 por correspondência exata ao longo do tempo.
Alguns alvos verificam sinais de execução de JavaScript (canvas, WebGL, timing de eventos) que nenhum cliente HTTP reproduz. Nesses casos, controle um navegador real — veja usando proxies com Playwright e Puppeteer com stealth. O trade-off é custo e velocidade: clientes HTTP como o curl_cffi são muito mais baratos por requisição, então use-os onde forem suficientes e reserve navegadores completos para os alvos mais difíceis.
curl_cffi (impersonate=) ou tls-client — só cabeçalhos não bastam.O TLS fingerprinting é a camada faltante na maioria das histórias de "IP limpo, mas ainda bloqueado". Corrija o handshake, mantenha o IP residencial e a taxa de sucesso dispara. Para a pilha completa contra o WAF mais duro, leia a receita de bypass do Cloudflare 2026.
Ganhe 500MB de tráfego grátis e IPs residenciais para combinar com impressões digitais TLS de nível de navegador.
Iniciar Teste GrátisNovos usuários recebem 500MB ao se cadastrar, mais um bônus na primeira recarga. Oferta por tempo limitado.