Seu scraper funciona na primeira execução. Na terceira, aparecem 403, respostas vazias ou loops de CAPTCHA. O código não mudou. O site também não. O sistema anti-bot montou um perfil da sessão e começou a bloquear.
TL;DR: a maioria dos bloqueios vem de quatro camadas: rede, identidade do navegador, comportamento e estado da sessão. Comece com um anti-detect browser que gerencia fingerprints e proxy routing no engine; deixe seu código cuidar de reconhecimento, extração, paginação e escala.
Para o modelo completo das quatro camadas, leia Automação de navegador sem bloqueios: as 4 camadas de defesa.
Reconhecimento antes do código
Começar programando direto costuma virar retrabalho. Dez minutos de reconhecimento ajudam a escolher o stack certo.
Identifique o sistema anti-bot
Abra o DevTools no site alvo e confira os response headers.
| Header | Sistema anti-bot |
|---|---|
cf-ray, server: cloudflare |
Cloudflare Bot Management |
x-akamai-transformed |
Akamai Bot Manager |
x-datadome |
DataDome |
x-px-* headers |
PerimeterX (now HUMAN) |
| Nenhum desses | Provavelmente sem anti-bot comercial, ou solução própria |
Um site simples pode ser raspado com curl_cffi; um site com Cloudflare pede navegador real com fingerprints gerenciados.
Veja se existe uma API
Antes de abrir um navegador, olhe a aba Network e filtre por XHR/Fetch. Muitos sites carregam dados de endpoints JSON.
# If the site loads product data from an API endpoint
from curl_cffi import requests
response = requests.get(
"https://target-site.com/api/v2/products?category=electronics&page=1",Endpoints são rápidos, mas alguns servidores esperam uma sessão real de navegador antes da chamada API. Em sites protegidos, carregue a página no navegador e intercepte a resposta.
Avalie o modelo de renderização
Desative JavaScript. Se o conteúdo continua visível, HTTP basta. Se some, você precisa de um engine de navegador.
| Conteúdo visível sem JS? | Ferramenta |
|---|---|
| Sim, tudo renderiza | curl_cffi or requests with TLS impersonation |
| Parcial | curl_cffi for static parts, browser for dynamic |
| Não, página em branco | Full browser (Clawbrowser + Playwright/Puppeteer) |
Escolha seu stack de scraping
A ferramenta certa depende da proteção e da renderização. Navegador completo desperdiça recurso quando HTTP basta; HTTP falha em SPA protegida.
Árvore de decisão
Sem anti-bot + HTML no servidor: use curl_cffi com TLS impersonation.
from curl_cffi import requests
response = requests.get(
"https://unprotected-site.com/products",
impersonate="chrome136"Sem anti-bot + JavaScript-rendered: use um headless browser comum.
Anti-bot + HTML no servidor: use curl_cffi com residential proxy.
Anti-bot + JavaScript-rendered: use Clawbrowser com fingerprints gerenciados e residential proxy.
from playwright.async_api import async_playwright
async def scrape_protected_site():
async with async_playwright() as p:
# Clawbrowser handles fingerprints, TLS and proxy at the engine levelClawbrowser é um anti-detect browser local, gratuito e baseado em Chromium, com fingerprints gerenciados, proxy routing, CDP nativo e servidor MCP integrado.
Padrões de extração de dados
Depois da camada anti-bot, o trabalho é extrair dados estruturados com estabilidade.
Paginação
A paginação geralmente aparece em três formatos.
Paginação por URL
async def scrape_paginated(page, base_url, max_pages=50):
all_items = []
for page_num in range(1, max_pages + 1):
await page.goto(f"{base_url}?page={page_num}")
await human_delay(2000, 4000)Infinite scroll (conteúdo carregado no scroll):
async def scrape_infinite_scroll(page, max_scrolls=30):
all_items = []
previous_count = 0
for _ in range(max_scrolls):"Load more" button:
async def scrape_load_more(page):
while True:
load_more = await page.query_selector('[data-testid="load-more"]')
if not load_more:
breakConteúdo dinâmico
Alguns dados só aparecem depois de clique, accordion ou hover.
async def extract_product_details(page, product_url):
await page.goto(product_url)
await human_delay(1000, 2000)
# Click "Specifications" tab to reveal hidden dataExtração no shadow DOM
Componentes em shadow DOM exigem acesso pela shadow root.
# Pierce through shadow DOM to extract data
data = await page.evaluate("""
() => {
const host = document.querySelector('product-card');
const shadow = host.shadowRoot;Gerenciamento de sessões para scraping
Um scraper visita páginas demais para parecer humano se a sessão não for tratada com cuidado.
Session warming
Não comece pela página alvo: abra a home, uma categoria, aceite cookies e só então scrapeie. Os blocos comportamentais estão em Automação de navegador sem bloqueios: as 4 camadas de defesa.
async def warm_session(page, site_url):
await page.goto(site_url)
await human_delay(2000, 4000)
# Accept cookies if banner appearsRotacione perfis em escala
Distribua volume entre perfis Clawbrowser, cada um com fingerprint, cookies, storage e proxy próprios.
import asyncio
from playwright.async_api import async_playwright
async def scrape_batch(profile_name, urls):
async with async_playwright() as p:| Escala | Abordagem |
|---|---|
| < 100 pages/day | Single profile, residential proxy, 3-5s delays |
| 100-1,000 pages/day | 3-5 rotating profiles, sticky residential sessions |
| 1,000-10,000 pages/day | 10+ profiles, proxy pool, session warming |
| 10,000+ pages/day | Distributed setup, multiple Clawbrowser instances, backoff logic |
Diagnóstico de bloqueios
O sintoma quase sempre aponta para a camada com problema.
| Sintoma | Causa provável | Correção |
|---|---|---|
| Bloqueio na primeira request | Reputação IP ou browser fingerprint | Troque para residential proxy e anti-detect browser |
| Bloqueia depois de 5-10 páginas | Comportamento ou limite de sessão | Reduza ritmo, adicione delays e aqueça sessões |
| CAPTCHA on every page | Fingerprint leak | Browser is leaking automation signals, switch to managed fingerprints |
| 403 after proxy rotation | Browser fingerprint unchanged | New IP but same broken fingerprint, fix the browser layer |
| Funciona localmente, falha em produção | Datacenter IP | Adicione residential proxy em produção |
| Página vazia / spinner infinito | JavaScript challenge failed | Browser can't pass Cloudflare/Akamai JS check, needs real engine |
| Dados diferentes da visita manual | Geo or locale mismatch | Proxy location doesn't match fingerprint timezone/language |
Script rápido de diagnóstico
import asyncio
from playwright.async_api import async_playwright
async def diagnose_blocking(target_url):
async with async_playwright() as p:Scraping em sites protegidos pela Cloudflare
Cloudflare combina TLS, JavaScript, comportamento e reputação IP.
O que a Cloudflare verifica
- TLS fingerprint (JA3/JA4): um ClientHello incoerente recebe challenge antes do HTML.
- JavaScript execution: Turnstile precisa de um ambiente real de renderização.
- IP reputation: a reputação do IP é avaliada em milhões de sites.
- Request patterns: requests repetidas na mesma sessão são marcadas.
O workflow
Mantenha todas as camadas limpas: anti-detect browser para TLS/JS, residential proxy para IP e timing no seu código.
async def scrape_cloudflare_site(target_url, profile="cf-scraper"):
async with async_playwright() as p:
browser = await p.chromium.connect_over_cdp(
f"http://127.0.0.1:9222?profile={profile}"
)Para o detalhe da Cloudflare, leia por que seus scripts Playwright são bloqueados pela Cloudflare.
Scraping com agentes de IA
O servidor MCP da Clawbrowser permite que agentes de IA controlem sessões reais via CDP, com os mesmos fingerprints e proxies do seu código.
A integração completa está em Browser CDP para agentes de IA: guia para developers.
FAQ
Por que meu scraper funciona localmente e falha em produção?
Localmente você costuma ter IP residencial; em produção, IP de datacenter. Use residential proxy e confira fingerprints gerenciados.
Devo usar cliente HTTP ou navegador?
HTTP basta para HTML no servidor sem anti-bot. Para JavaScript rendering ou challenges, use navegador completo.
Como saber se um site usa Cloudflare?
Procure cf-ray ou server: cloudflare nos response headers do DevTools.
Dá para fazer scraping sem proxies?
Em sites sem proteção, sim. Atrás de Cloudflare ou Akamai, em escala, residential proxies quase sempre são necessários.
Comece web scraping sem ser detectado
Scraping confiável começa com reconhecimento, ferramenta certa e infraestrutura de navegador limpa.
Install Clawbrowser para cuidar da identidade do navegador e da rede: copie o prompt em clawbrowser.ai e cole no seu agente de IA. O setup leva menos de dois minutos.
Para o modelo de detecção, veja Automação de navegador sem bloqueios: as 4 camadas de defesa. Para detalhes de fingerprinting, veja Browser fingerprinting: os 20+ sinais usados por sistemas anti-bot.
Continue exploring
Ask AI how Clawbrowser helps
Continue lendo
Artigos relacionados

Automação de Navegador Sem Ser Bloqueado: A Defesa em 4 Camadas
Por que automação de navegador é bloqueada e como resolver em cada camada: identidade do browser, rede, comportamento e gerenciamento de sessão. Guia estrutural para devs.
Ler artigo →
Puppeteer-Extra-Stealth está obsoleto: o que a automação moderna usa
puppeteer-extra-plugin-stealth não é atualizado desde 2023. Descubra por que ele falha nos sistemas anti-bot modernos e o que usar no lugar.
Ler artigo →