Crawl4AI é o repositório #1 em tendência no GitHub, mantido ativamente por uma comunidade vibrante. Oferece rastreamento web ultrarrápido e pronto para IA, projetado para LLMs, agentes de IA e pipelines de dados. Código aberto, flexível e construído para desempenho em tempo real, o Crawl4AI capacita desenvolvedores com velocidade, precisão e facilidade de implantação sem igual.
✨ Confira a atualização mais recente v0.6.0
🎉 A versão 0.6.0 já está disponível! Esta versão candidata introduz Rastreamento Consciente do Mundo com configurações de geolocalização e localidade, Extração de Tabelas para DataFrame, Pool de Navegadores com pré-aquecimento, Captura de Tráfego de Rede e Console, integração MCP para ferramentas de IA e uma implantação Docker completamente reformulada! Leia as notas de lançamento →
Minha jornada com computadores começou na infância, quando meu pai, cientista da computação, me apresentou um computador Amstrad. Aqueles primeiros dias despertaram uma fascinação pela tecnologia, levando-me a estudar ciência da computação e me especializar em PLN durante meus estudos de pós-graduação. Foi nessa época que mergulhei no rastreamento web, construindo ferramentas para ajudar pesquisadores a organizar artigos e extrair informações de publicações - uma experiência desafiadora, mas gratificante, que aprimorou minhas habilidades em extração de dados.
Avançando para 2023, eu estava trabalhando em uma ferramenta para um projeto e precisava de um rastreador para converter uma página web em markdown. Ao explorar soluções, encontrei uma que alegava ser de código aberto, mas exigia criar uma conta e gerar um token de API. Pior, acabou sendo um modelo SaaS cobrando $16, e sua qualidade não atendia aos meus padrões. Frustrado, percebi que isso era um problema mais profundo. Essa frustração se transformou em modo turbo de raiva, e decidi construir minha própria solução. Em apenas alguns dias, criei o Crawl4AI. Para minha surpresa, ele se tornou viral, ganhando milhares de estrelas no GitHub e ressoando com uma comunidade global.
Tornei o Crawl4AI de código aberto por dois motivos. Primeiro, é minha forma de retribuir à comunidade de código aberto que me apoiou ao longo da minha carreira. Segundo, acredito que os dados devem ser acessíveis a todos, não trancados atrás de paywalls ou monopolizados por poucos. O acesso aberto aos dados estabelece a base para a democratização da IA, uma visão onde indivíduos podem treinar seus próprios modelos e assumir a propriedade de suas informações. Esta biblioteca é o primeiro passo em uma jornada maior para criar a melhor ferramenta de extração e geração de dados de código aberto que o mundo já viu, construída colaborativamente por uma comunidade apaixonada.
Agradeço a todos que apoiaram este projeto, usaram-no e compartilharam feedback. Seu incentivo me motiva a sonhar ainda maior. Junte-se a nós, registre problemas, envie PRs ou espalhe a palavra. Juntos, podemos construir uma ferramenta que realmente capacite as pessoas a acessar seus próprios dados e remodelar o futuro da IA.
# Install the package
pip install -U crawl4ai
# For pre release versions
pip install crawl4ai --pre
# Run post-installation setup
crawl4ai-setup
# Verify your installation
crawl4ai-doctor
Se encontrar problemas relacionados ao navegador, você pode instalá-los manualmente:
python -m playwright install --with-deps chromium
import asyncio
from crawl4ai import *
async def main():
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(
url="https://www.nbcnews.com/business",
)
print(result.markdown)
if __name__ == "__main__":
asyncio.run(main())
# Basic crawl with markdown output
crwl https://www.nbcnews.com/business -o markdown
# Deep crawl with BFS strategy, max 10 pages
crwl https://docs.crawl4ai.com --deep-crawl bfs --max-pages 10
# Use LLM extraction with a specific question
crwl https://www.example.com/products -q "Extract all product prices"
srcset
e picture
.raw:
) ou arquivos locais (file://
).✨ Visite nosso Site de Documentação
O Crawl4AI oferece opções flexíveis de instalação para atender a diversos casos de uso. Você pode instalá-lo como um pacote Python ou usar Docker.
Escolha a opção de instalação que melhor atenda às suas necessidades:
Para tarefas básicas de rastreamento e extração web:
pip install crawl4ai
crawl4ai-setup # Setup the browser
Por padrão, isso instalará a versão assíncrona do Crawl4AI, usando Playwright para rastreamento web.
👉 Nota: Ao instalar o Crawl4AI, o crawl4ai-setup
deve instalar e configurar automaticamente o Playwright. No entanto, se encontrar erros relacionados ao Playwright, você pode instalá-lo manualmente usando um destes métodos:
Pela linha de comando:
playwright install
Se o acima não funcionar, tente este comando mais específico:
python -m playwright install chromium
Este segundo método provou ser mais confiável em alguns casos.
A versão síncrona está obsoleta e será removida em versões futuras. Se precisar da versão síncrona usando Selenium:
pip install crawl4ai[sync]
Para contribuidores que planejam modificar o código-fonte:
git clone https://github.com/unclecode/crawl4ai.git
cd crawl4ai
pip install -e . # Basic installation in editable mode
Instale recursos opcionais:
pip install -e ".[torch]" # With PyTorch features
pip install -e ".[transformer]" # With Transformer features
pip install -e ".[cosine]" # With cosine similarity features
pip install -e ".[sync]" # With synchronous crawling (Selenium)
pip install -e ".[all]" # Install all optional features
🚀 Agora Disponível! Nossa implementação Docker completamente redesenhada está aqui! Esta nova solução torna a implantação mais eficiente e contínua do que nunca.
A nova implementação Docker inclui:
# Pull and run the latest release candidate
docker pull unclecode/crawl4ai:0.6.0-rN # Use your favorite revision number
docker run -d -p 11235:11235 --name crawl4ai --shm-size=1g unclecode/crawl4ai:0.6.0-rN # Use your favorite revision number
# Visit the playground at http://localhost:11235/playground
Para documentação completa, consulte nosso Guia de Implantação Docker.
Execute um teste rápido (funciona para ambas as opções Docker):
import requests
# Submit a crawl job
response = requests.post(
"http://localhost:11235/crawl",
json={"urls": "https://example.com", "priority": 10}
)
task_id = response.json()["task_id"]
# Continue polling until the task is complete (status="completed")
result = requests.get(f"http://localhost:11235/task/{task_id}")
Para mais exemplos, veja nossos Exemplos Docker. Para configuração avançada, variáveis de ambiente e exemplos de uso, consulte nosso Guia de Implantação Docker.
Você pode verificar a estrutura do projeto no diretório https://github.com/unclecode/crawl4ai/docs/examples. Lá, você encontrará uma variedade de exemplos; aqui, alguns exemplos populares são compartilhados.
import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai.content_filter_strategy import PruningContentFilter, BM25ContentFilter
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator
async def main():
browser_config = BrowserConfig(
headless=True,
verbose=True,
)
run_config = CrawlerRunConfig(
cache_mode=CacheMode.ENABLED,
markdown_generator=DefaultMarkdownGenerator(
content_filter=PruningContentFilter(threshold=0.48, threshold_type="fixed", min_word_threshold=0)
),
# markdown_generator=DefaultMarkdownGenerator(
# content_filter=BM25ContentFilter(user_query="WHEN_WE_FOCUS_BASED_ON_A_USER_QUERY", bm25_threshold=1.0)
# ),
)
async with AsyncWebCrawler(config=browser_config) as crawler:
result = await crawler.arun(
url="https://docs.micronaut.io/4.7.6/guide/",
config=run_config
)
print(len(result.markdown.raw_markdown))
print(len(result.markdown.fit_markdown))
if __name__ == "__main__":
asyncio.run(main())
import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai.extraction_strategy import JsonCssExtractionStrategy
import json
async def main():
schema = {
"name": "KidoCode Courses",
"baseSelector": "section.charge-methodology .w-tab-content > div",
"fields": [
{
"name": "section_title",
"selector": "h3.heading-50",
"type": "text",
},
{
"name": "section_description",
"selector": ".charge-content",
"type": "text",
},
{
"name": "course_name",
"selector": ".text-block-93",
"type": "text",
},
{
"name": "course_description",
"selector": ".course-content-text",
"type": "text",
},
{
"name": "course_icon",
"selector": ".image-92",
"type": "attribute",
"attribute": "src"
}
}
}
extraction_strategy = JsonCssExtractionStrategy(schema, verbose=True)
browser_config = BrowserConfig(
headless=False,
verbose=True
)
run_config = CrawlerRunConfig(
extraction_strategy=extraction_strategy,
js_code=["""(async () => {const tabs = document.querySelectorAll("section.charge-methodology .tabs-menu-3 > div");for(let tab of tabs) {tab.scrollIntoView();tab.click();await new Promise(r => setTimeout(r, 500));}})();"""],
cache_mode=CacheMode.BYPASS
)
async with AsyncWebCrawler(config=browser_config) as crawler:
result = await crawler.arun(
url="https://www.kidocode.com/degrees/technology",
config=run_config
)
companies = json.loads(result.extracted_content)
print(f"Successfully extracted {len(companies)} companies")
print(json.dumps(companies[0], indent=2))
if __name__ == "__main__":
asyncio.run(main())
import os
import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode, LLMConfig
from crawl4ai.extraction_strategy import LLMExtractionStrategy
from pydantic import BaseModel, Field
class OpenAIModelFee(BaseModel):
model_name: str = Field(..., description="Name of the OpenAI model.")
input_fee: str = Field(..., description="Fee for input token for the OpenAI model.")
output_fee: str = Field(..., description="Fee for output token for the OpenAI model.")
async def main():
browser_config = BrowserConfig(verbose=True)
run_config = CrawlerRunConfig(
word_count_threshold=1,
extraction_strategy=LLMExtractionStrategy(
# Here you can use any provider that Litellm library supports, for instance: ollama/qwen2
# provider="ollama/qwen2", api_token="no-token",
llm_config = LLMConfig(provider="openai/gpt-4o", api_token=os.getenv('OPENAI_API_KEY')),
schema=OpenAIModelFee.schema(),
extraction_type="schema",
instruction="""From the crawled content, extract all mentioned model names along with their fees for input and output tokens.
Do not miss any models in the entire content. One extracted model JSON format should look like this:
{"model_name": "GPT-4", "input_fee": "US$10.00 / 1M tokens", "output_fee": "US$30.00 / 1M tokens"}."""
),
cache_mode=CacheMode.BYPASS,
)
async with AsyncWebCrawler(config=browser_config) as crawler:
result = await crawler.arun(
url='https://openai.com/api/pricing/',
config=run_config
)
print(result.extracted_content)
if __name__ == "__main__":
asyncio.run(main())
import os, sys
from pathlib import Path
import asyncio, time
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
async def test_news_crawl():
# Create a persistent user data directory
user_data_dir = os.path.join(Path.home(), ".crawl4ai", "browser_profile")
os.makedirs(user_data_dir, exist_ok=True)
browser_config = BrowserConfig(
verbose=True,
headless=True,
user_data_dir=user_data_dir,
use_persistent_context=True,
)
run_config = CrawlerRunConfig(
cache_mode=CacheMode.BYPASS
)
async with AsyncWebCrawler(config=browser_config) as crawler:
url = "ADDRESS_OF_A_CHALLENGING_WEBSITE"
result = await crawler.arun(
url,
config=run_config,
magic=True,
)
print(f"Successfully crawled {url}")
print(f"Content length: {len(result.markdown)}")
🌎 Rastreamento Consciente do Mundo: Defina geolocalização, idioma e fuso horário para conteúdo autêntico específico da localidade:
crun_cfg = CrawlerRunConfig(
url="https://browserleaks.com/geo", # página de teste que mostra sua localização
locale="en-US", # Accept-Language & localidade da UI
timezone_id="America/Los_Angeles", # Fuso horário JS Date()/Intl
geolocation=GeolocationConfig( # substitui coordenadas GPS
latitude=34.0522,
longitude=-118.2437,
accuracy=10.0,
)
)
📊 Extração de Tabela para DataFrame: Extrai tabelas HTML diretamente para CSV ou DataFrames pandas:
crawler = AsyncWebCrawler(config=browser_config)
await crawler.start()
try:
# Configura parâmetros de scraping
crawl_config = CrawlerRunConfig(
table_score_threshold=8, # Detecção estrita de tabelas
)
# Executa extração de dados de mercado
results: List[CrawlResult] = await crawler.arun(
url="https://coinmarketcap.com/?page=1", config=crawl_config
)
# Processa resultados
raw_df = pd.DataFrame()
for result in results:
if result.success and result.media["tables"]:
raw_df = pd.DataFrame(
result.media["tables"][0]["rows"],
columns=result.media["tables"][0]["headers"],
)
break
print(raw_df.head())
finally:
await crawler.stop()
🚀 Pool de Navegadores: Páginas iniciam quentes com instâncias de navegador pré-aquecidas para menor latência e uso de memória
🕸️ Captura de Rede e Console: Logs completos de tráfego e snapshots MHTML para depuração:
crawler_config = CrawlerRunConfig(
capture_network=True,
capture_console=True,
mhtml=True
)
🔌 Integração MCP: Conecte-se a ferramentas de IA como Claude Code através do Model Context Protocol
# Adicione Crawl4AI ao Claude Code
claude mcp add --transport sse c4ai-sse http://localhost:11235/mcp/sse
🖥️ Playground Interativo: Teste configurações e gere requisições de API com a interface web integrada em http://localhost:11235//playground
🐳 Implantação Docker Reformulada: Imagem Docker multi-arquitetura simplificada com eficiência de recursos aprimorada
📱 Sistema de Build Multi-estágio: Dockerfile otimizado com melhorias de desempenho específicas por plataforma
Leia os detalhes completos em nossas Notas de Lançamento 0.6.0 ou verifique o CHANGELOG.
crwl
fornece acesso conveniente pelo terminallxml
Leia os detalhes completos em nossas Notas de Lançamento 0.5.0.
O Crawl4AI segue as convenções padrão de numeração de versão do Python (PEP 440) para ajudar os usuários a entender a estabilidade e os recursos de cada lançamento.
Nossos números de versão seguem este padrão: MAJOR.MINOR.PATCH
(ex.: 0.4.3)
Usamos diferentes sufixos para indicar estágios de desenvolvimento:
dev
(0.4.3dev1): Versões de desenvolvimento, instáveisa
(0.4.3a1): Lançamentos Alpha, recursos experimentaisb
(0.4.3b1): Lançamentos Beta, recursos completos mas necessitando testesrc
(0.4.3): Candidatos a lançamento, versão potencial finalInstalação regular (versão estável):
pip install -U crawl4ai
Instalar versões pré-lançamento:
pip install crawl4ai --pre
Instalar versão específica:
pip install crawl4ai==0.4.3b1
Usamos pré-lançamentos para:
Para ambientes de produção, recomendamos usar a versão estável. Para testar novos recursos, você pode optar por pré-lançamentos usando a flag --pre
.
🚨 Alerta de Atualização de Documentação: Estamos realizando uma grande reformulação da documentação na próxima semana para refletir atualizações e melhorias recentes. Fique atento para um guia mais abrangente e atualizado!
Para a documentação atual, incluindo instruções de instalação, recursos avançados e referência de API, visite nosso Site de Documentação.
Para ver nossos planos de desenvolvimento e recursos futuros, visite nosso Roadmap.
Aceitamos contribuições da comunidade de código aberto. Confira nossas diretrizes de contribuição para mais informações.
Vou ajudar a modificar a seção de licença com badges. Para o efeito halftone, aqui está uma versão com ele:
Aqui está a seção de licença atualizada:
Este projeto está licenciado sob a Licença Apache 2.0 com uma cláusula de atribuição obrigatória. Veja o arquivo Licença Apache 2.0 para detalhes.
Ao usar o Crawl4AI, você deve incluir um dos seguintes métodos de atribuição:
Adicione um desses badges ao seu README, documentação ou website:
Tema | Badge |
---|---|
Tema Disco (Animado) | |
Tema Noturno (Escuro com Neon) | |
Tema Escuro (Clássico) | |
Tema Claro (Clássico) |
Código HTML para adicionar os badges:
<!-- Disco Theme (Animated) -->
<a href="https://github.com/unclecode/crawl4ai">
<img src="https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-disco.svg" alt="Powered by Crawl4AI" width="200"/>
</a>
<!-- Night Theme (Dark with Neon) -->
<a href="https://github.com/unclecode/crawl4ai">
<img src="https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-night.svg" alt="Powered by Crawl4AI" width="200"/>
</a>
<!-- Dark Theme (Classic) -->
<a href="https://github.com/unclecode/crawl4ai">
<img src="https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-dark.svg" alt="Powered by Crawl4AI" width="200"/>
</a>
<!-- Light Theme (Classic) -->
<a href="https://github.com/unclecode/crawl4ai">
<img src="https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-light.svg" alt="Powered by Crawl4AI" width="200"/>
</a>
<!-- Simple Shield Badge -->
<a href="https://github.com/unclecode/crawl4ai">
<img src="https://img.shields.io/badge/Powered%20by-Crawl4AI-blue?style=flat-square" alt="Powered by Crawl4AI"/>
</a>
Adicione esta linha à sua documentação:
This project uses Crawl4AI (https://github.com/unclecode/crawl4ai) for web data extraction.
Se você usar o Crawl4AI em sua pesquisa ou projeto, por favor cite:
@software{crawl4ai2024,
author = {UncleCode},
title = {Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper},
year = {2024},
publisher = {GitHub},
journal = {GitHub Repository},
howpublished = {\url{https://github.com/unclecode/crawl4ai}},
commit = {Please use the commit hash you're working with}
}
Formato de citação em texto:
UncleCode. (2024). Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper [Computer software].
GitHub. https://github.com/unclecode/crawl4ai
Para dúvidas, sugestões ou feedback, sinta-se à vontade para entrar em contato:
Feliz Rastreamento! 🕸️🚀
Nossa missão é desbloquear o valor de dados pessoais e empresariais transformando pegadas digitais em ativos estruturados e comercializáveis. O Crawl4AI capacita indivíduos e organizações com ferramentas de código aberto para extrair e estruturar dados, promovendo uma economia de dados compartilhada.
Visualizamos um futuro onde a IA é alimentada por conhecimento humano real, garantindo que criadores de dados se beneficiem diretamente de suas contribuições. Ao democratizar dados e permitir compartilhamento ético, estamos lançando as bases para um avanço autêntico da IA.
Para mais detalhes, veja nossa declaração de missão completa.