Web scraping sin ser detectado: portada ilustrada del artículo de Clawbrowser

Web scraping sin ser detectado: técnicas que sí aguantan

Clawbrowser Teamweb-scrapinganti-botfingerprintingproxyguia

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 level

Clawbrowser 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:
            break

Manejo 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 data

Extraer 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 appears

Rotació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

  1. Fingerprint TLS (JA3/JA4): si el ClientHello no parece de un navegador conocido, llega el challenge antes del HTML.
  2. Ejecución JavaScript: Turnstile hace checks del entorno y necesita un engine real.
  3. Reputación IP: Cloudflare mantiene su propia base en millones de sitios.
  4. 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

Ver todos →