Apidog

Plataforma Colaborativa All-in-one para Desenvolvimento de API

Design de API

Documentação de API

Depuração de API

Mock de API

Testes Automatizados de API

Crawl4AI Tutorial: Guia Para Iniciantes

Mikael Svenson

Mikael Svenson

Updated on abril 30, 2025

Na era da IA, acessar e processar dados da web de forma eficiente é crucial. Crawl4AI surge como um poderoso crawler e scraper web de código aberto, meticulosamente projetado para desenvolvedores que trabalham com Large Language Models (LLMs), agentes de IA e pipelines de dados modernos. Este tutorial oferece um mergulho profundo no Crawl4AI, cobrindo tudo, desde a instalação até técnicas avançadas de crawling.

💡
Quer uma ótima ferramenta de Teste de API que gera Documentação de API linda?

Quer uma plataforma integrada, All-in-One para sua Equipe de Desenvolvedores trabalhar com máxima produtividade?

Apidog atende a todas as suas demandas e substitui o Postman a um preço muito mais acessível!
button

Por que Escolher o Crawl4AI para Seus Projetos?

O Crawl4AI é mais do que apenas um scraper web padrão. Ele foi projetado do zero para ser amigável a LLMs. Isso significa que ele foca em:

  • Geração de Markdown Limpo: Produzindo Markdown bem estruturado e conciso, otimizado para sistemas de Retrieval-Augmented Generation (RAG) e fine-tuning de modelos, removendo boilerplate e ruído.
  • Extração de Dados Estruturados: Permitindo a extração de pontos de dados específicos em formatos como JSON, usando métodos tradicionais (seletores CSS, XPath) ou aproveitando LLMs para tarefas de extração semântica mais complexas.
  • Alto Desempenho: Utilizando a biblioteca asyncio do Python e o poderoso framework de automação de navegador Playwright para crawling rápido e assíncrono.
  • Controle Avançado do Navegador: Oferecendo controle detalhado sobre a instância do navegador, incluindo execução de JavaScript, manipulação de conteúdo dinâmico, gerenciamento de sessões (cookies, local storage), uso de proxies e simulação de diferentes ambientes de usuário (user agents, geolocalizações).
  • Código Aberto e Flexibilidade: Sendo totalmente código aberto (Apache 2.0 com atribuição), sem depender de chaves de API externas ou serviços pagos. Oferece flexibilidade de implantação via Docker ou instalação direta com pip.

O Crawl4AI visa democratizar o acesso a dados, capacitando desenvolvedores a coletar e moldar dados da web com velocidade e eficiência.


Instalando e Configurando o Crawl4AI

Colocar o Crawl4AI para rodar é simples, oferecendo opções tanto via pip quanto via Docker.

Método 1: Instalação com Pip (Recomendado para Uso como Biblioteca)

Instale o Pacote: Abra seu terminal e execute:

# Instalar a versão estável mais recente
pip install -U crawl4ai

# Ou, instalar a última versão pré-lançamento (para recursos de ponta)
# pip install crawl4ai --pre

Execute a Configuração Pós-Instalação: Este passo crucial instala os binários de navegador Playwright necessários (Chromium por padrão):

crawl4ai-setup

Verifique: Verifique sua configuração usando a ferramenta de diagnóstico:

crawl4ai-doctor

Resolução de Problemas: Se crawl4ai-setup encontrar problemas, instale manualmente as dependências do navegador:

python -m playwright install --with-deps chromium

Método 2: Implantação com Docker (Ideal para Serviço de API)

Puxe a Imagem: Obtenha a imagem oficial do Docker (verifique o GitHub para a tag mais recente):

# Tag de exemplo, substitua se necessário
docker pull unclecode/crawl4ai:latest

Execute o Container: Inicie o serviço Crawl4AI, expondo sua API (porta padrão 11235):

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

Isso executa o Crawl4AI com um backend FastAPI, pronto para aceitar requisições de crawling via HTTP. Você pode acessar um playground de API interativo em http://localhost:11235/playground.


Como Executar Seu Primeiro Crawl com o Crawl4AI

O Crawl4AI torna o crawling básico incrivelmente simples usando o AsyncWebCrawler.

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

async def run_basic_crawl():
    # --- Exemplo Básico ---
    print("--- Executando Crawl Básico ---")
    # Use 'async with' para inicialização e desligamento automático do navegador
    async with AsyncWebCrawler() as crawler:
        # O método arun() executa o crawl para uma única URL
        # Ele retorna um objeto CrawlResult
        result = await crawler.arun(url="https://example.com")

        if result and result.success:
            # Acesse o Markdown gerado (geralmente 'fit_markdown')
            print("Crawl Bem-sucedido!")
            # result.markdown fornece markdown bruto e filtrado
            print(f"Fit Markdown (primeiros 300 caracteres): {result.markdown.fit_markdown[:300]}...")
        else:
            print(f"Crawl Falhou: {result.error_message}")

    # --- Exemplo com Configuração Básica ---
    print("\n--- Executando Crawl com Configuração Básica ---")
    # Configurar o comportamento do navegador (por exemplo, rodar headful para depuração)
    browser_conf = BrowserConfig(headless=True) # Defina como False para ver a janela do navegador

    # Configurar definições específicas da execução (por exemplo, ignorar cache)
    # CacheMode.ENABLED (padrão), 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 do site oficial
            config=run_conf # Aplicar a configuração de execução
        )
        if result and result.success:
            print("Crawl Bem-sucedido!")
            print(f"Contagem de Palavras do Fit Markdown: {result.markdown.word_count}")
            print(f"URL Rastreada: {result.url}")
        else:
            print(f"Crawl Falhou: {result.error_message}")

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

Conceitos Chave do Crawl4AI:

  • AsyncWebCrawler: A classe principal para iniciar crawls. Usar async with garante que o navegador seja gerenciado corretamente.
  • arun(url, config=None): O método assíncrono principal para fazer crawl de uma única URL.
  • BrowserConfig: Controla as configurações de nível do navegador (headless, user agent, proxies). Passado durante a inicialização do AsyncWebCrawler.
  • CrawlerRunConfig: Controla as configurações para um trabalho de crawl específico (cache, estratégias de extração, timeouts, execução de JavaScript). Passado para o método arun.
  • CacheMode: Determina como o Crawl4AI interage com seu cache (ENABLED, DISABLED, BYPASS). BYPASS é útil para garantir dados frescos durante o desenvolvimento.

Como Funciona o Objeto CrawlResult do Crawl4AI?

Cada chamada bem-sucedida de arun ou arun_many retorna um ou mais objetos CrawlResult, que encapsulam todas as informações coletadas durante o crawl.

O objeto CrawlResult contém vários atributos, incluindo:

  • url: A URL final rastreada (após redirecionamentos).
  • success: Booleano indicando se o crawl foi bem-sucedido.
  • error_message: Contém detalhes do erro se success for False.
  • status_code: Código de status HTTP da resposta.
  • markdown: Um objeto contendo versões Markdown (raw_markdown, fit_markdown, word_count).
  • html: O conteúdo HTML bruto da página.
  • text: Conteúdo de texto puro extraído da página.
  • extracted_content: Armazena o resultado de qualquer estratégia de extração configurada (por exemplo, string JSON).
  • links: Uma lista de links encontrados na página (internal, external).
  • media: Informações sobre mídia extraída (imagens, tabelas, etc.).
  • metadata: Metadados da página (título, descrição, etc.).
  • cookies: Cookies do navegador após o crawl.
  • screenshot_path: Caminho para a captura de tela, se feita.
  • network_log_path: Caminho para o arquivo HAR da rede, se capturado.
  • console_log_path: Caminho para o arquivo de log do console, se capturado.

Inspecionar este objeto é fundamental para acessar os dados específicos que você precisa de um crawl do Crawl4AI.


Como Gerar Markdown Pronto para IA com o Crawl4AI

Uma força central do Crawl4AI é sua capacidade de gerar Markdown limpo, adequado para LLMs.

O atributo result.markdown contém:

  • result.markdown.raw_markdown: A conversão direta e não filtrada da área de conteúdo primário da página para Markdown.
  • result.markdown.fit_markdown: Uma versão filtrada do Markdown. Esta é frequentemente a mais útil para LLMs, pois o Crawl4AI aplica filtros heurísticos (como PruningContentFilter ou BM25ContentFilter) para remover o lixo comum da web (menus, anúncios, rodapés, barras laterais).
  • result.markdown.word_count: A contagem de palavras do fit_markdown.

Você pode personalizar o processo de filtragem no Crawl4AI:

import asyncio
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode
# Importar estratégias específicas para personalização
from crawl4ai.content_filter_strategy import PruningContentFilter
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator

async def run_custom_markdown_crawl():
    print("\n--- Executando Crawl com Filtragem de Markdown Personalizada ---")

    # Configurar um gerador de Markdown com um filtro de conteúdo específico
    # PruningContentFilter remove elementos com base em limites de contagem de palavras
    markdown_generator_with_filter = DefaultMarkdownGenerator(
        content_filter=PruningContentFilter(
            threshold=0.48, # Ajustar limite (0 a 1) para rigidez
            threshold_type="fixed" # 'fixed' ou 'relative'
            )
    )

    # Aplicar este gerador na configuração de execução
    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", # Um site de notícias geralmente tem lixo
            config=run_conf
        )
        if result and result.success:
            print("Crawl Bem-sucedido!")
            print(f"Comprimento do Raw Markdown: {len(result.markdown.raw_markdown)}")
            print(f"Comprimento do Fit Markdown: {len(result.markdown.fit_markdown)}") # Geralmente mais curto
            # Compare raw_markdown e fit_markdown para ver o efeito do filtro
        else:
            print(f"Crawl Falhou: {result.error_message}")

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

Ajustando o content_filter dentro do markdown_generator, você controla quão agressivamente o Crawl4AI limpa o conteúdo antes de produzir o fit_markdown.


Como Usar o Crawl Profundo do Crawl4AI

O Crawl4AI não se limita a páginas únicas. Ele pode realizar crawls profundos, navegando por um site seguindo links.

Use o método adeep_crawl (ou a flag --deep-crawl da CLI crwl):

import asyncio
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode

async def run_deep_crawl():
    print("\n--- Executando Crawl Profundo ---")
    # A configuração pode ser aplicada globalmente ou por execução, como de costume
    run_conf = CrawlerRunConfig(cache_mode=CacheMode.ENABLED)

    async with AsyncWebCrawler() as crawler:
        # adeep_crawl retorna um gerador assíncrono, produzindo resultados conforme as páginas terminam
        crawl_generator = await crawler.adeep_crawl(
            start_url="https://docs.crawl4ai.com/", # Ponto de partida
            strategy="bfs", # 'bfs' (Busca em Largura), 'dfs' (Busca em Profundidade), 'bestfirst'
            max_depth=2,    # Limitar a profundidade dos links a seguir
            max_pages=10,   # Limitar o número total de páginas a rastrear
            config=run_conf
        )

        # Processar resultados conforme chegam
        pages_crawled = 0
        async for result in crawl_generator:
            if result.success:
                print(f"[OK] Rastreado: {result.url} (Profundidade: {result.depth}, Comprimento do Fit Markdown: {len(result.markdown.fit_markdown)})")
                pages_crawled += 1
            else:
                print(f"[FALHA] URL: {result.url}, Erro: {result.error_message}")

        print(f"\nCrawl profundo finalizado. Total de páginas rastreadas com sucesso: {pages_crawled}")

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

Parâmetros de Crawl Profundo do Crawl4AI:

  • start_url: A URL inicial para começar o crawling.
  • strategy: Como descobrir e priorizar links (bfs, dfs, bestfirst).
  • max_depth: Distância máxima de links a partir da start_url.
  • max_pages: Número máximo total de páginas para rastrear neste trabalho.
  • include_patterns, exclude_patterns: Use padrões regex para filtrar quais URLs são seguidas.

Como Lidar com Conteúdo Dinâmico e Interações com o Crawl4AI

Sites modernos dependem muito de JavaScript para carregar conteúdo. O Crawl4AI lida com isso através das capacidades do Playwright.

Você pode executar JavaScript arbitrário ou esperar por condições específicas usando CrawlerRunConfig:

import asyncio
import json
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai.extraction_strategy import JsonCssExtractionStrategy # Por exemplo

async def crawl_dynamic_page():
    print("\n--- Rastreado Página Dinâmica com Interação JS ---")

    # Exemplo de esquema para extração CSS (adaptar ao site alvo)
    schema = { "items": { "selector": "div.product-item", "type": "list", "fields": { "title": "h2", "price": ".price" } } }
    css_extractor = JsonCssExtractionStrategy(schema)

    # JavaScript a ser executado na página (por exemplo, clicar em um botão 'Carregar Mais')
    # Nota: O seletor precisa corresponder ao site alvo
    js_to_run = """
    (async () => {
        const loadMoreButton = document.querySelector('button#load-more');
        if (loadMoreButton) {
            console.log('Clicando no botão carregar mais...');
            loadMoreButton.click();
            // Esperar um pouco para o conteúdo carregar potencialmente após o clique
            await new Promise(resolve => setTimeout(resolve, 2000));
            console.log('Esperou após o clique.');
        } else {
            console.log('Botão carregar mais não encontrado.');
        }
    })();
    """

    run_conf = CrawlerRunConfig(
        cache_mode=CacheMode.BYPASS,
        js_code=[js_to_run], # Lista de trechos de JS para executar
        wait_for_timeout=3000, # Esperar 3 segundos após o carregamento inicial E após a execução do JS
        # wait_for_selector="div.newly-loaded-content", # Ou esperar por um elemento específico
        extraction_strategy=css_extractor, # Extrair dados após a execução do JS
        output_formats=['markdown', 'extracted_content']
    )

    # Garantir que o JS esteja habilitado em BrowserConfig (É por padrão)
    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", # Substituir pela URL real
            config=run_conf
        )

        if result and result.success:
            print("Crawl de página dinâmica bem-sucedido!")
            print(f"Comprimento do Fit Markdown: {len(result.markdown.fit_markdown)}")
            if result.extracted_content:
                try:
                    extracted_data = json.loads(result.extracted_content)
                    print(f"Prévia do Conteúdo Extraído: {json.dumps(extracted_data, indent=2)[:500]}...")
                except json.JSONDecodeError:
                    print(f"Conteúdo Extraído (não JSON): {result.extracted_content[:500]}...")
        else:
            print(f"Crawl Falhou: {result.error_message}")


if __name__ == "__main__":
    # Por favor, substitua 'URL_OF_DYNAMIC_PAGE_HERE' e descomente a linha acima para executar o exemplo dinâmico.
    # asyncio.run(crawl_dynamic_page())
    print("Por favor, substitua 'URL_OF_DYNAMIC_PAGE_HERE' e descomente a linha acima para executar o exemplo dinâmico.")

Parâmetros Chave de Interação do Crawl4AI em CrawlerRunConfig:

  • js_code: Uma lista de strings JavaScript para executar no contexto da página.
  • wait_for_timeout: Milissegundos para esperar após o carregamento da página e após a execução do JS.
  • wait_for_selector: Um seletor CSS para esperar antes de considerar a página carregada/interação completa.
  • page_interaction_hooks: Hooks mais avançados para interações complexas.

Conclusão do Crawl4AI

O Crawl4AI oferece uma solução abrangente, Pythonica e centrada em IA para web crawling e scraping. Seu foco na geração de Markdown limpo, extração flexível de dados estruturados (baseada em CSS e LLM), manipulação robusta de conteúdo dinâmico e operação assíncrona eficiente o torna uma excelente escolha para projetos envolvendo RAG, fine-tuning de LLM, ou qualquer tarefa que exija informações estruturadas da web. Ao alavancar sua API clara, opções de configuração (BrowserConfig, CrawlerRunConfig) e objeto CrawlResult detalhado, desenvolvedores podem construir fluxos de trabalho de coleta de dados sofisticados e eficientes.

💡
Quer uma ótima ferramenta de Teste de API que gera Documentação de API linda?

Quer uma plataforma integrada, All-in-One para sua Equipe de Desenvolvedores trabalhar com máxima produtividade?

Apidog atende a todas as suas demandas e substitui o Postman a um preço muito mais acessível!
button