Apidog

Plataforma de desarrollo de API colaborativa todo en uno

Diseño de API

Documentación de API

Depuración de API

Simulación de API

Prueba automatizada de API

Tutorial Crawl4AI: Guía para Principiantes

Mikael Svenson

Mikael Svenson

Updated on April 30, 2025

En la era de la IA, acceder y procesar datos web de manera eficiente es crucial. Crawl4AI surge como un potente rastreador y raspador web de código abierto, meticulosamente diseñado para desarrolladores que trabajan con Modelos de Lenguaje Grandes (LLMs), agentes de IA y pipelines de datos modernos. Este tutorial proporciona una inmersión profunda en Crawl4AI, cubriendo todo, desde la instalación hasta técnicas avanzadas de rastreo.

💡
¿Quieres una excelente herramienta de prueba de API que genere hermosa Documentación de API?

¿Quieres una plataforma integrada y todo en uno para que tu equipo de desarrolladores trabaje junto con máxima productividad?

Apidog satisface todas tus demandas y reemplaza a Postman a un precio mucho más asequible!
button

¿Por Qué Elegir Crawl4AI para Tus Proyectos?

Crawl4AI es más que un raspador web estándar. Está diseñado desde cero para ser amigable con LLM. Esto significa que se centra en:

  • Generación de Markdown Limpio: Produciendo Markdown bien estructurado y conciso optimizado para sistemas de Generación Aumentada por Recuperación (RAG) y ajuste fino de modelos, eliminando el contenido repetitivo y el ruido.
  • Extracción de Datos Estructurados: Permitiendo la extracción de puntos de datos específicos en formatos como JSON utilizando métodos tradicionales (selectores CSS, XPath) o aprovechando LLMs para tareas de extracción semántica más complejas.
  • Alto Rendimiento: Utilizando la biblioteca asyncio de Python y el potente framework de automatización de navegador Playwright para un rastreo asíncrono rápido.
  • Control Avanzado del Navegador: Ofreciendo control granular sobre la instancia del navegador, incluyendo la ejecución de JavaScript, manejo de contenido dinámico, gestión de sesiones (cookies, almacenamiento local), uso de proxies y simulación de diferentes entornos de usuario (agentes de usuario, geolocalizaciones).
  • Código Abierto y Flexibilidad: Siendo completamente de código abierto (Apache 2.0 con atribución) sin depender de claves API externas o servicios de pago. Ofrece flexibilidad de despliegue a través de Docker o instalación directa con pip.

Crawl4AI tiene como objetivo democratizar el acceso a los datos, capacitando a los desarrolladores para recopilar y dar forma a los datos web con velocidad y eficiencia.


Instalación y Configuración de Crawl4AI

Poner en marcha Crawl4AI es sencillo, ofreciendo opciones tanto con pip como con Docker.

Método 1: Instalación con Pip (Recomendado para Uso como Biblioteca)

Instalar el Paquete: Abre tu terminal y ejecuta:

# Install the latest stable version
pip install -U crawl4ai

# Or, install the latest pre-release (for cutting-edge features)
# pip install crawl4ai --pre

Ejecutar Configuración Post-Instalación: Este paso crucial instala los binarios necesarios del navegador Playwright (Chromium por defecto):

crawl4ai-setup

Verificar: Comprueba tu configuración usando la herramienta de diagnóstico:

crawl4ai-doctor

Resolución de Problemas: Si crawl4ai-setup encuentra problemas, instala manualmente las dependencias del navegador:

python -m playwright install --with-deps chromium

Método 2: Despliegue con Docker (Ideal para Servicio API)

Descargar la Imagen: Obtén la imagen oficial de Docker (verifica en GitHub la última etiqueta):

# Example tag, replace if necessary
docker pull unclecode/crawl4ai:latest

Ejecutar el Contenedor: Inicia el servicio Crawl4AI, exponiendo su API (puerto por defecto 11235):

docker run -d -p 11235:11235 --name crawl4ai --shm-size=1g unclecode/crawl4ai:latest

Esto ejecuta Crawl4AI con un backend FastAPI, listo para aceptar solicitudes de rastreo a través de HTTP. Puedes acceder a un playground de API interactivo en http://localhost:11235/playground.


Cómo Ejecutar Tu Primer Rastreo con Crawl4AI

Crawl4AI simplifica increíblemente el rastreo básico utilizando el AsyncWebCrawler.

import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode

async def run_basic_crawl():
    # --- Basic Example ---
    print("--- Running Basic Crawl ---")
    # Use 'async with' for automatic browser startup and shutdown
    async with AsyncWebCrawler() as crawler:
        # The arun() method performs the crawl for a single URL
        # It returns a CrawlResult object
        result = await crawler.arun(url="https://example.com")

        if result and result.success:
            # Access the generated Markdown (usually 'fit_markdown')
            print("Crawl Successful!")
            # result.markdown provides both raw and filtered markdown
            print(f"Fit Markdown (first 300 chars): {result.markdown.fit_markdown[:300]}...")
        else:
            print(f"Crawl Failed: {result.error_message}")

    # --- Example with Basic Configuration ---
    print("\n--- Running Crawl with Basic Configuration ---")
    # Configure browser behavior (e.g., run headful for debugging)
    browser_conf = BrowserConfig(headless=True) # Set to False to see the browser window

    # Configure run-specific settings (e.g., bypass cache)
    # CacheMode.ENABLED (default), CacheMode.DISABLED, CacheMode.BYPASS
    run_conf = CrawlerRunConfig(cache_mode=CacheMode.BYPASS)

    async with AsyncWebCrawler(config=browser_conf) as crawler:
        result = await crawler.arun(
            url="https://crawl4ai.com/", # Crawl the official site
            config=run_conf # Apply the run configuration
        )
        if result and result.success:
            print("Crawl Successful!")
            print(f"Fit Markdown Word Count: {result.markdown.word_count}")
            print(f"URL Crawled: {result.url}")
        else:
            print(f"Crawl Failed: {result.error_message}")

if __name__ == "__main__":
    asyncio.run(run_basic_crawl())

Conceptos Clave de Crawl4AI:

  • AsyncWebCrawler: La clase principal para iniciar rastreos. Usar async with asegura que el navegador se gestione correctamente.
  • arun(url, config=None): El método asíncrono principal para rastrear una sola URL.
  • BrowserConfig: Controla la configuración a nivel del navegador (headless, agente de usuario, proxies). Se pasa durante la inicialización de AsyncWebCrawler.
  • CrawlerRunConfig: Controla la configuración para un trabajo de rastreo específico (caché, estrategias de extracción, tiempos de espera, ejecución de JavaScript). Se pasa al método arun.
  • CacheMode: Determina cómo Crawl4AI interactúa con su caché (ENABLED, DISABLED, BYPASS). BYPASS es útil para asegurar datos frescos durante el desarrollo.

Cómo Funciona el Objeto CrawlResult de Crawl4AI

Cada llamada exitosa a arun o arun_many devuelve uno o más objetos CrawlResult, que encapsulan toda la información recopilada durante el rastreo.

El objeto CrawlResult contiene varios atributos, incluyendo:

  • url: La URL final rastreada (después de redirecciones).
  • success: Booleano que indica si el rastreo fue exitoso.
  • error_message: Contiene detalles del error si success es False.
  • status_code: Código de estado HTTP de la respuesta.
  • markdown: Un objeto que contiene versiones de Markdown (raw_markdown, fit_markdown, word_count).
  • html: El contenido HTML sin procesar de la página.
  • text: Contenido de texto plano extraído de la página.
  • extracted_content: Almacena el resultado de cualquier estrategia de extracción configurada (por ejemplo, cadena JSON).
  • links: Una lista de enlaces encontrados en la página (internal, external).
  • media: Información sobre medios extraídos (imágenes, tablas, etc.).
  • metadata: Metadatos de la página (título, descripción, etc.).
  • cookies: Cookies del navegador después del rastreo.
  • screenshot_path: Ruta a la captura de pantalla si se tomó.
  • network_log_path: Ruta al archivo HAR de red si se capturó.
  • console_log_path: Ruta al archivo de registro de consola si se capturó.

Inspeccionar este objeto es clave para acceder a los datos específicos que necesitas de un rastreo de Crawl4AI.


Cómo Generar Markdown Listo para IA con Crawl4AI

Una fortaleza central de Crawl4AI es su capacidad para generar Markdown limpio adecuado para LLMs.

El atributo result.markdown contiene:

  • result.markdown.raw_markdown: La conversión directa y sin filtrar del área de contenido principal de la página a Markdown.
  • result.markdown.fit_markdown: Una versión filtrada del Markdown. Esta es a menudo la más útil para LLMs, ya que Crawl4AI aplica filtros heurísticos (como PruningContentFilter o BM25ContentFilter) para eliminar el desorden web común (menús, anuncios, pies de página, barras laterales).
  • result.markdown.word_count: El recuento de palabras del fit_markdown.

Puedes personalizar el proceso de filtrado en Crawl4AI:

import asyncio
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode
# Import specific strategies for customization
from crawl4ai.content_filter_strategy import PruningContentFilter
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator

async def run_custom_markdown_crawl():
    print("\n--- Running Crawl with Custom Markdown Filtering ---")

    # Configure a Markdown generator with a specific content filter
    # PruningContentFilter removes elements based on word count thresholds
    markdown_generator_with_filter = DefaultMarkdownGenerator(
        content_filter=PruningContentFilter(
            threshold=0.48, # Adjust threshold (0 to 1) for strictness
            threshold_type="fixed" # 'fixed' or 'relative'
            )
    )

    # Apply this generator in the run configuration
    run_conf = CrawlerRunConfig(
        cache_mode=CacheMode.BYPASS,
        markdown_generator=markdown_generator_with_filter
    )

    async with AsyncWebCrawler() as crawler:
        result = await crawler.arun(
            url="https://www.nbcnews.com/business", # A news site often has clutter
            config=run_conf
        )
        if result and result.success:
            print("Crawl Successful!")
            print(f"Raw Markdown Length: {len(result.markdown.raw_markdown)}")
            print(f"Fit Markdown Length: {len(result.markdown.fit_markdown)}") # Usually shorter
            # Compare raw_markdown and fit_markdown to see the filter's effect
        else:
            print(f"Crawl Failed: {result.error_message}")

if __name__ == "__main__":
    asyncio.run(run_custom_markdown_crawl())

Ajustando el content_filter dentro del markdown_generator, controlas cuán agresivamente Crawl4AI limpia el contenido antes de producir fit_markdown.


Cómo Usar el Rastreo Profundo de Crawl4AI

Crawl4AI no se limita a páginas individuales. Puede realizar rastreos profundos, navegando a través de un sitio web siguiendo enlaces.

Usa el método adeep_crawl (o la bandera --deep-crawl de la CLI crwl):

import asyncio
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode

async def run_deep_crawl():
    print("\n--- Running Deep Crawl ---")
    # Configuration can be applied globally or per-run as usual
    run_conf = CrawlerRunConfig(cache_mode=CacheMode.ENABLED)

    async with AsyncWebCrawler() as crawler:
        # adeep_crawl returns an async generator, yielding results as pages finish
        crawl_generator = await crawler.adeep_crawl(
            start_url="https://docs.crawl4ai.com/", # Starting point
            strategy="bfs", # 'bfs' (Breadth-First), 'dfs' (Depth-First), 'bestfirst'
            max_depth=2,    # Limit how many links deep to follow
            max_pages=10,   # Limit the total number of pages to crawl
            config=run_conf
        )

        # Process results as they come in
        pages_crawled = 0
        async for result in crawl_generator:
            if result.success:
                print(f"[OK] Crawled: {result.url} (Depth: {result.depth}, Fit Markdown Length: {len(result.markdown.fit_markdown)})")
                pages_crawled += 1
            else:
                print(f"[FAIL] URL: {result.url}, Error: {result.error_message}")

        print(f"\nDeep crawl finished. Total pages successfully crawled: {pages_crawled}")

if __name__ == "__main__":
    asyncio.run(run_deep_crawl())

Parámetros de Rastreo Profundo de Crawl4AI:

  • start_url: La URL inicial desde la que comenzar el rastreo.
  • strategy: Cómo descubrir y priorizar enlaces (bfs, dfs, bestfirst).
  • max_depth: Distancia máxima de enlaces desde la start_url.
  • max_pages: Número total máximo de páginas a rastrear en este trabajo.
  • include_patterns, exclude_patterns: Usa patrones regex para filtrar qué URLs se siguen.

Cómo Manejar Contenido Dinámico e Interacciones con Crawl4AI

Los sitios web modernos dependen en gran medida de JavaScript para cargar contenido. Crawl4AI maneja esto a través de las capacidades de Playwright.

Puedes ejecutar JavaScript arbitrario o esperar condiciones específicas usando CrawlerRunConfig:

import asyncio
import json
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai.extraction_strategy import JsonCssExtractionStrategy # For example

async def crawl_dynamic_page():
    print("\n--- Crawling Dynamic Page with JS Interaction ---")

    # Example schema for CSS extraction (adapt to the target site)
    schema = { "items": { "selector": "div.product-item", "type": "list", "fields": { "title": "h2", "price": ".price" } } }
    css_extractor = JsonCssExtractionStrategy(schema)

    # JavaScript to execute on the page (e.g., click a 'Load More' button)
    # Note: Selector needs to match the target website
    js_to_run = """
    (async () => {
        const loadMoreButton = document.querySelector('button#load-more');
        if (loadMoreButton) {
            console.log('Clicking load more button...');
            loadMoreButton.click();
            // Wait a bit for content to potentially load after click
            await new Promise(resolve => setTimeout(resolve, 2000));
            console.log('Waited after click.');
        } else {
            console.log('Load more button not found.');
        }
    })();
    """

    run_conf = CrawlerRunConfig(
        cache_mode=CacheMode.BYPASS,
        js_code=[js_to_run], # List of JS snippets to execute
        wait_for_timeout=3000, # Wait 3 seconds after initial load AND after JS execution
        # wait_for_selector="div.newly-loaded-content", # Or wait for a specific element
        extraction_strategy=css_extractor, # Extract data after JS runs
        output_formats=['markdown', 'extracted_content']
    )

    # Ensure JS is enabled in BrowserConfig (it is by default)
    browser_conf = BrowserConfig(headless=True, java_script_enabled=True)

    async with AsyncWebCrawler(config=browser_conf) as crawler:
        result = await crawler.arun(
            url="URL_OF_DYNAMIC_PAGE_HERE", # Replace with actual URL
            config=run_conf
        )

        if result and result.success:
            print("Dynamic page crawl successful!")
            print(f"Fit Markdown Length: {len(result.markdown.fit_markdown)}")
            if result.extracted_content:
                try:
                    extracted_data = json.loads(result.extracted_content)
                    print(f"Extracted Content Preview: {json.dumps(extracted_data, indent=2)[:500]}...")
                except json.JSONDecodeError:
                    print(f"Extracted Content (non-JSON): {result.extracted_content[:500]}...")
        else:
            print(f"Crawl Failed: {result.error_message}")


if __name__ == "__main__":
    # Replace with an actual URL that loads content dynamically for testing
    # asyncio.run(crawl_dynamic_page())
    print("Please replace 'URL_OF_DYNAMIC_PAGE_HERE' and uncomment the line above to run the dynamic example.")

Parámetros Clave de Interacción de Crawl4AI en CrawlerRunConfig:

  • js_code: Una lista de cadenas de JavaScript para ejecutar en el contexto de la página.
  • wait_for_timeout: Milisegundos a esperar después de la carga de la página y después de la ejecución de JS.
  • wait_for_selector: Un selector CSS para esperar antes de considerar la página cargada/interacción completa.
  • page_interaction_hooks: Ganchos más avanzados para interacciones complejas.

Conclusión de Crawl4AI

Crawl4AI proporciona una solución completa, Pythónica y centrada en IA para el rastreo y raspado web. Su enfoque en la generación de Markdown limpio, la extracción flexible de datos estructurados (basada tanto en CSS como en LLM), el manejo robusto de contenido dinámico y la operación asíncrona eficiente lo convierten en una excelente opción para proyectos que involucran RAG, ajuste fino de LLM o cualquier tarea que requiera información estructurada de la web. Al aprovechar su API clara, opciones de configuración (BrowserConfig, CrawlerRunConfig) y el detallado objeto CrawlResult, los desarrolladores pueden construir flujos de trabajo de recopilación de datos sofisticados y eficientes.

💡
¿Quieres una excelente herramienta de prueba de API que genere hermosa Documentación de API?

¿Quieres una plataforma integrada y todo en uno para que tu equipo de desarrolladores trabaje junto con máxima productividad?

Apidog satisface todas tus demandas y reemplaza a Postman a un precio mucho más asequible!
button