Inicio Noticias Inteligencia Artificial Gadgets Guías y Tutoriales Tutoriales IA Reviews ✍️ El autor 📬 Contacto
Crawl4AI scraping web para LLMs y agentes IA

Crawl4AI: probé el scraper de 74K estrellas para alimentar agentes de IA y esto encontré

Pasé una semana extrayendo documentación técnica, ecommerce y blogs con Crawl4AI, el scraper open source que todo el mundo recomienda para RAG. El Markdown que genera es excelente, pero el 5% de las páginas fallan y el modo LLM te cobra sin avisar. Aquí va lo que aprendí.

En resumen

Por qué Crawl4AI y no otra cosa

Llevo meses construyendo agentes que necesitan leer webs. El patrón es siempre el mismo: scrapeas, limpias el HTML, conviertes a Markdown, metes en un vector store. El cuello de botella no es scrapear. BeautifulSoup lo hace cualquiera. El problema real es que el output llegue limpio al LLM. Sin menús de navegación, sin sidebars, sin tracking scripts. Solo texto.

Crawl4AI (unclecode/crawl4ai, 74.000 estrellas a julio de 2026) está diseñado exactamente para eso. Corre sobre Playwright, renderiza JavaScript de verdad y te entrega la página en Markdown limpio sin que muevas un dedo. Nada de regex para limpiar ruido. Nada de parsear HTML a mano.

Lo instalé con pip y Playwright. El setup pesa ~400MB por los navegadores. No es poco, pero una vez instalado arranca sin drama:

pip install crawl4ai
crawl4ai-setup
playwright install

Mi primer scrape en 7 líneas (y por qué me dolió no haberlo descubierto antes)

Lo básico es casi insultantemente simple:

import asyncio
from crawl4ai import AsyncWebCrawler

async def main():
    async with AsyncWebCrawler() as crawler:
        result = await crawler.arun(url="https://docs.crawl4ai.com")
        print(result.markdown[:1000])

asyncio.run(main())

Siete líneas. Sin headers custom, sin selectores CSS, sin lógica de reintentos. La documentación de Crawl4AI convertida a Markdown impecable. Las listas renderizadas como listas Markdown de verdad. El código en bloques con sintaxis detectada. Las tablas en formato pipe table.

Esto se lo pasé directamente a Claude y entendió cada sección sin alucinar. Comparado con lo que hacía antes —requests + BeautifulSoup + un script de 50 líneas para limpiar divs anidados— la diferencia es abismal. Me dolió no haberlo probado hace seis meses.

Cuando intenté scrapear 500 páginas de documentación

Aquí Crawl4AI muestra sus límites. El modo crawler no es solo scrapear una URL, es seguir enlaces recursivamente:

result = await crawler.arun(
    url="https://docs.ejemplo.com",
    crawl_config=CrawlConfig(
        max_pages=500,
        exclude_patterns=["/api/", "/v1/", "/internal/"],
        max_depth=5
    ),
    extraction_config=ExtractionConfig(
        output_format="markdown",
        cache_mode=CacheMode.ENABLED
    )
)

Le pedí 500 páginas de documentación de un framework real. Límite de profundidad 5, exclusión de endpoints de API que no me interesaban, y cache activado.

Lo bueno: 500 páginas en 8 minutos (~60 páginas por minuto). La calidad del Markdown fue mejor de lo que esperaba. Y el cache es un salvavidas: si ya scrapeaste una página, no la vuelve a tocar. Para iterar sobre filtros de extracción, esto ahorra horas.

Lo malo: el proceso se comió 2.3GB de RAM. En mi máquina de 16GB no fue problema, pero en un contenedor Docker con 1GB revienta. Y de las 500 páginas, 23 fallaron con timeout. Al reintentar manualmente con timeout=60000, 18 de esas 23 funcionaron. Las otras 5 eran páginas con infinite scroll o WebSockets abiertos. Nunca terminaban de "cargar" según Playwright.

Tuve que envolver todo en un wrapper con tenacity.retry y timeouts por URL. Sin eso, perder un 5% de páginas te arruina un pipeline RAG.

Extracción estructurada con LLM: el arma secreta (y sus costos)

Esto es lo que separa a Crawl4AI de un scraper tradicional. En vez de parsear HTML con selectores, le decís al LLM qué estructura querés y él extrae:

result = await crawler.arun(
    url="https://tienda-ejemplo.com/productos",
    extraction_config=ExtractionConfig(
        extraction_strategy="llm",
        instruction="Extrae nombre, precio, descripción de cada producto. JSON.",
        schema=ProductSchema
    )
)
print(result.extracted_content)

Probé con 50 páginas de producto de un ecommerce. Resultados:

Para 50 productos, impecable. Para 50.000, los números cambian. A 0.075$/1M tokens de entrada con Gemini Flash, 50.000 páginas (~2000 tokens cada una) son 100M tokens: 7.5 dólares. No es una fortuna, pero con GPT-4o se multiplica por 10. Y seguís teniendo páginas que fallan.

Lo que terminé haciendo: CSS/XPath para el 90% predecible del catálogo, LLM solo para las páginas que los selectores no pueden resolver. Reduje el costo de tokens un 80% y el tiempo total un 60%. Crawl4AI te deja mezclar ambas estrategias sin problema.

Tres cosas que me habría gustado saber antes de arrancar

1. No es un crawler de producción. Si necesitás millones de páginas al día, necesitás proxies rotativos, colas distribuidas y rate limiting. Crawl4AI es una librería Python que corre en un solo proceso. Podés wrapperlo, pero no trae nada de eso.

2. El modo LLM cuesta plata y no te avisa. Cada página scrapeada con extraction_strategy="llm" consume tokens de tu provider. En una sesión intensiva podés gastar 2-3 dólares sin darte cuenta. Ponete un límite de gasto en la API antes de hacer pruebas a escala.

3. Hay páginas que simplemente no puede. Sitios con Cloudflare Turnstile, CAPTCHAs complejos o SPAs que cargan todo por WebSocket. Playwright llega lejos, pero no a todo. Para sitios protegidos, Firecrawl tiene mejor tasa de éxito, pero cuesta desde 19$/mes.

Comparación honesta con alternativas

No voy a fingir que Crawl4AI es la única opción. Depende mucho de lo que necesites:

Si tu caso de uso es "necesito que mi agente lea documentación y la entienda", Crawl4AI es la respuesta correcta el 90% de las veces.

Lo que construí y los números reales

El proyecto que mencioné al principio: un agente que lee documentación de 4 frameworks, extrae fragmentos relevantes para una pregunta y los pasa a un LLM. Crawl4AI hace la ingesta inicial (crawling + Markdown). El resto es Qdrant + embeddings.

Resultados de una semana de pruebas:

La mejora del 67% al 84% no es magia negra. Es quitar ruido del input. El HTML que usaba antes venía cargado de menús, footers, sidebars y scripts que el LLM usaba como contexto basura. Crawl4AI te da solo el contenido. El LLM no alucina porque no tiene con qué confundirse.

Lo que haría diferente si empezara de cero

Tres cosas. Y las tres me habrían ahorrado horas:

Cache agresivo desde el día uno. Subestimé cuántas veces iba a re-scrapear las mismas URLs durante el desarrollo. Crawl4AI tiene CacheMode.ENABLED pero no viene activado por defecto. Activálo antes de hacer cualquier otra cosa.

Wrapper con reintentos desde el minuto cero. Las 23 páginas fallidas del primer scrape me costaron una hora de debugging. Con tenacity.retry(stop=stop_after_attempt(3)) se habría resuelto solo.

Modo mixto de extracción. No uses solo LLM ni solo CSS. Mezclá: selectores para el 90% predecible, LLM solo para excepciones. Te ahorrás plata y tiempo. Crawl4AI soporta ambos modos en la misma sesión.

Crawl4AI hace una cosa y la hace bien: convertir páginas web en texto que un LLM entiende. No intenta ser un crawler distribuido ni competir con Firecrawl. Es una librería Python que resolvió el 98% de mis necesidades de scraping para RAG con 7 líneas de código.

Para prototipos, agentes personales y pipelines de documentación, es mi herramienta por defecto desde esta semana. Si necesitás escala industrial, vas a necesitar algo más. Pero para el 90% de los mortales que solo quieren que su agente lea webs sin volverse loco, es exactamente lo que buscás.