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
- Probé Crawl4AI durante una semana extrayendo datos de documentación técnica, ecommerce y blogs para pipelines RAG. Velocidad, fallos, costos y cuándo conviene usarlo.
- Lo instalé con pip y Playwright. El setup pesa ~400MB por los navegadores. No es poco, pero una vez instalado arranca sin drama:
- Crawl4AI (unclecode/crawl4ai, 74.000 estrellas a julio de 2026) está diseñado exactamente para eso.
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:
- 47 de 50 productos extraídos correctamente (94%)
- Los 3 fallos: precios con formato "desde 19.99€" que el LLM no supo parsear
- Tiempo medio: 3.2 segundos por página con Gemini Flash
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:
- Crawl4AI (gratis, open source): ideal para prototipos y pipelines RAG. Markdown limpio, JS rendering con Playwright. Punto débil: no escala solo.
- Firecrawl (desde 19$/mes): tasa de éxito más alta en sitios protegidos. Infraestructura gestionada. Si scrapeás a diario, vale la pena.
- Jina AI (gratis con límites): similar a Crawl4AI pero como servicio. Bueno para pruebas rápidas sin instalar nada.
- Scrapy (gratis): el rey del scraping a escala. Pero no tiene JS rendering nativo ni output Markdown limpio.
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:
- 491 de 500 páginas scrapeadas correctamente (98.2%, con reintentos)
- 11 minutos totales de crawling (8 iniciales + 3 de reintentos)
- 60% menos tokens por consulta al LLM comparado con HTML raw. Para 500 páginas, ~2.5M tokens ahorrados por query
- 84% de respuestas correctas en evaluación RAG, contra 67% usando el pipeline viejo con HTML sin limpiar
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.