Tu scraper funciona en la primera ejecución. En la tercera ya aparecen 403, respuestas vacías o bucles de CAPTCHA. El código no cambió y el sitio tampoco. Lo que cambió es que el sistema anti-bot construyó un perfil de tu scraper y empezó a bloquearlo. En 2026, Cloudflare, Akamai y DataDome miran más señales que nunca; rotar User-Agent, instalar un stealth plugin o añadir delays aleatorios ya no basta.
TL;DR: La mayoría de bloqueos de scraping vienen de cuatro capas: red, identidad del navegador, comportamiento y estado de sesión. En vez de parchear cada capa dentro de tu scraper, empieza con un navegador que gestione fingerprints y proxies a nivel de engine. Después deja tu código para lo propio del scraping: reconocimiento, extracción, paginación y escala.
Para la teoría completa de esas cuatro capas, lee Automatización de navegador sin bloqueos: las 4 capas de defensa. Esta guía se centra en el flujo práctico de scraping: qué revisar antes de escribir código, cómo extraer datos y cómo escalar.
Reconocimiento antes de escribir código
Muchos developers empiezan el scraper directamente. Así es como acabas reescribiéndolo tres veces. Dedica 10 minutos a reconocer el sitio y normalmente eliges el stack correcto a la primera.
Identifica el sistema anti-bot
Abre DevTools en el sitio objetivo y revisa los 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 (ahora HUMAN) |
| Ninguno de los anteriores | Probablemente sin anti-bot comercial, o solución propia |
Esto te dice la dificultad real. Un sitio sin protección puede bastar con curl_cffi o requests. Un sitio con Cloudflare necesita un navegador real con fingerprints gestionados.
Comprueba si existe una API
Antes de montar un scraper con navegador, mira si el sitio carga datos desde un endpoint. Abre Network en DevTools, navega por la página y filtra por XHR/Fetch. Muchos sitios sirven JSON que es más cómodo que parsear HTML renderizado.
# 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",Los endpoints de API son más rápidos y devuelven datos estructurados. El matiz: algunos sistemas anti-bot comprueban que la llamada venga de una sesión real de navegador. Si el servidor espera que /api/v2/products se llame solo después de renderizar la página y ejecutar JavaScript, una petición directa sin carga previa puede disparar detección. En sitios protegidos, suele ser más fiable abrir la página en un navegador real, dejar que el cliente haga la llamada y capturar la respuesta.
Evalúa el modelo de renderizado
Carga la página con JavaScript desactivado (DevTools -> Settings -> Disable JavaScript). Si el contenido sigue visible, no necesitas navegador. Si queda en blanco, es una SPA renderizada con JavaScript y necesitas un engine real.
| Contenido visible sin JS? | Herramienta |
|---|---|
| Si, todo se renderiza | curl_cffi o requests con impersonation TLS |
| Parcial, faltan datos | curl_cffi para partes estáticas, navegador para dinámicas |
| No, página en blanco | Navegador completo (Clawbrowser + Playwright/Puppeteer) |
Elegir tu stack de scraping
La herramienta depende del nivel de protección y del modelo de renderizado. Usar navegador completo cuando curl_cffi alcanza consume recursos. Usar una librería HTTP en una SPA con Cloudflare consume tu tiempo.
Árbol de decisión
Sin anti-bot + HTML renderizado en servidor: usa curl_cffi con impersonation TLS. Es lo más rápido y barato en recursos. No necesitas navegador.
from curl_cffi import requests
response = requests.get(
"https://unprotected-site.com/products",
impersonate="chrome136"Sin anti-bot + JavaScript-rendered: usa un navegador headless estándar. No hace falta gestión de fingerprint porque no hay anti-bot comprobándolo.
Anti-bot + HTML renderizado en servidor: usa curl_cffi con proxy residencial. El anti-bot revisa fingerprint TLS e IP, pero no ejecuta challenges JavaScript.
Anti-bot + JavaScript-rendered (Cloudflare, Akamai, DataDome): usa un navegador como Clawbrowser con fingerprints gestionados y proxy residencial. Es el stack que cubre las cuatro capas de detección.
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 es un anti-detect browser local, gratis y basado en Chromium, con fingerprints gestionados, proxy routing, CDP nativo y servidor MCP integrado. Tu código de Playwright o Puppeteer se conecta por CDP como a cualquier instancia Chrome.
Patrones de extracción de datos
Cuando ya pasaste la capa anti-bot, empieza el trabajo propio del scraping: extraer datos estructurados de forma repetible.
Paginación
La mayoría de sitios pagina resultados. Hay tres patrones comunes y cada uno pide un enfoque distinto.
Paginación por URL (número de página en la 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 (contenido que carga al hacer scroll):
async def scrape_infinite_scroll(page, max_scrolls=30):
all_items = []
previous_count = 0
for _ in range(max_scrolls):Botón "Load more":
async def scrape_load_more(page):
while True:
load_more = await page.query_selector('[data-testid="load-more"]')
if not load_more:
breakManejo de contenido dinámico
Algunos datos aparecen solo tras una interacción: abrir tabs, expandir acordeones o hacer 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 dataExtraer desde shadow DOM
Algunos sitios modernos usan shadow DOM para encapsular componentes. Los selectores normales no entran en esas raíces.
# Pierce through shadow DOM to extract data
data = await page.evaluate("""
() => {
const host = document.querySelector('product-card');
const shadow = host.shadowRoot;Gestión de sesiones para scraping
La sesión es donde el scraping se separa más de la automatización general. Un scraper visita cientos o miles de páginas con patrones que una persona no produciría. Gestionar sesiones bien marca la diferencia entre terminar el trabajo y quedar bloqueado en la página 50.
Calentamiento de sesión
No vayas directo a la URL objetivo. Entra primero por la home, mira una categoría y acepta el banner de cookies. Eso construye historial antes de pedir las páginas que realmente necesitas.
Para los bloques de comportamiento (delays aleatorios, movimiento de ratón y scroll realista), revisa la capa 3 de Automatización de navegador sin bloqueos: las 4 capas de defensa. El ejemplo usa esos helpers para calentar la sesión:
async def warm_session(page, site_url):
await page.goto(site_url)
await human_delay(2000, 4000)
# Accept cookies if banner appearsRotación de perfiles a escala
Si vas a scrapear miles de páginas de un dominio, reparte el trabajo entre varios perfiles. Cada perfil de Clawbrowser mantiene su propio fingerprint, cookies, storage y proxy. Así ninguna sesión acumula un volumen sospechoso.
import asyncio
from playwright.async_api import async_playwright
async def scrape_batch(profile_name, urls):
async with async_playwright() as p:| Escala de scraping | Enfoque recomendado |
|---|---|
| < 100 páginas/día | Un perfil, proxy residencial, delays de 3-5s |
| 100-1.000 páginas/día | 3-5 perfiles rotando, sesiones residenciales sticky |
| 1.000-10.000 páginas/día | 10+ perfiles, pool de proxies, calentamiento de sesión |
| 10.000+ páginas/día | Setup distribuido, varias instancias de Clawbrowser, backoff |
Diagnosticar bloqueos
Cuando el scraper se bloquea, primero identifica qué capa falló. Los síntomas suelen apuntar a causas distintas.
| Síntoma | Causa probable | Arreglo |
|---|---|---|
| Bloqueo en la primera request | Reputación IP o fingerprint del navegador | Cambia a proxy residencial y usa anti-detect browser |
| Funciona 5-10 páginas y luego bloquea | Detección de comportamiento o límites de sesión | Baja ritmo, añade delays y calienta sesiones |
| CAPTCHA en cada página | Fuga de fingerprint | El navegador expone señales de automatización; cambia a fingerprints gestionados |
| 403 tras rotar proxy | Fingerprint del navegador sin cambiar | IP nueva con fingerprint roto; corrige la capa navegador |
| Funciona local y falla en producción | IP de datacenter | Tu IP local es residencial; añade proxy residencial en producción |
| Página vacía / spinner infinito | Falló el challenge JavaScript | El navegador no pasa Cloudflare/Akamai; necesita engine real |
| Los datos difieren de la visita manual | Desajuste geo o locale | La ubicación del proxy no coincide con timezone/idioma del fingerprint |
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 de sitios protegidos por Cloudflare
Cloudflare es el sistema anti-bot más común. Bot Management revisa fingerprints TLS, ejecuta challenges JavaScript (Turnstile), puntúa patrones de comportamiento y evalúa reputación IP a la vez.
Qué comprueba Cloudflare
- Fingerprint TLS (JA3/JA4): si el ClientHello no parece de un navegador conocido, llega el challenge antes del HTML.
- Ejecución JavaScript: Turnstile hace checks del entorno y necesita un engine real.
- Reputación IP: Cloudflare mantiene su propia base en millones de sitios.
- Patrones de requests: peticiones idénticas repetidas desde la misma sesión se marcan rápido.
El workflow
Necesitas todas las capas limpias al mismo tiempo. Un anti-detect browser cubre TLS y JavaScript. Un proxy residencial cubre IP. Tu código controla el ritmo.
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 el detalle específico de Cloudflare, lee por qué tus scripts de Playwright se bloquean con Cloudflare.
Scraping con agentes de IA
Si estás creando agentes de IA que scrapean la web, el servidor MCP de Clawbrowser permite que el agente controle sesiones reales de navegador. El agente decide qué extraer, navega y lee datos por la misma interfaz CDP. Los fingerprints gestionados y el proxy routing funcionan igual si los comandos vienen de tu código o de un agente.
Consulta CDP Browser para agentes de IA: guía para developers para la integración completa.
FAQ
Por qué mi scraper funciona localmente pero falla en producción?
Tu máquina usa una IP residencial de tu ISP. Producción suele usar una IP de datacenter de un cloud provider. Los sistemas anti-bot marcan esas IPs. Añade un proxy residencial en producción y normalmente se resuelve. Si no, revisa que el navegador de producción corra en modo headed con fingerprints gestionados.
Debería usar un cliente HTTP o un navegador?
Si el sitio renderiza en servidor y no tiene anti-bot, usa curl_cffi con impersonation TLS. Si usa JavaScript rendering o challenges anti-bot, usa navegador completo. Compruébalo desactivando JavaScript en DevTools: si desaparece el contenido, necesitas navegador.
Cómo sé si un sitio usa Cloudflare?
Mira los response headers: cf-ray o server: cloudflare. En DevTools, abre Network, carga la página y busca esos headers. La página de Turnstile suele mostrar un spinner reconocible antes del contenido.
Puedo scrapear sin proxies?
En sitios sin protección, sí. En sitios detrás de Cloudflare, Akamai o similares, probablemente necesitas proxies residenciales para evitar bloqueos por IP. Tu IP de casa sirve para pruebas, pero a escala se marca rápido.
Empieza a hacer web scraping sin ser detectado
El scraping fiable en 2026 empieza antes del primer selector. Reconoce el sitio, elige la herramienta según su protección y prepara la infraestructura de navegador.
Instala Clawbrowser para cubrir identidad del navegador y red: copia el prompt de instalación desde clawbrowser.ai y pégalo en tu agente de IA. El setup tarda menos de dos minutos. Después centra tu código en reconocimiento, extracción, paginación y sesiones.
Para el modelo de detección de base, lee Automatización de navegador sin bloqueos: las 4 capas de defensa. Para los detalles de fingerprinting, consulta Browser Fingerprinting Explained: las 20+ señales que usan los sistemas anti-bot.
Continue exploring
Ask AI how Clawbrowser helps
Sigue leyendo
Artículos relacionados

Automatización de navegador sin bloqueos: las 4 capas de defensa que necesitas
Por qué los sistemas anti-bot bloquean tu automatización y cómo resolverlo capa por capa: identidad del navegador, red, comportamiento y gestión de sesiones. Guía estructural para developers.
Leer artículo →
Puppeteer-Extra-Stealth está obsoleto: qué usa la automatización moderna
puppeteer-extra-plugin-stealth no se actualiza desde 2023. Descubre por qué falla con los sistemas anti-bot modernos y qué alternativas usar.
Leer artículo →