Crawl4AI es el repositorio #1 en tendencia de GitHub, mantenido activamente por una comunidad vibrante. Ofrece un rastreo web ultrarrápido y listo para IA, diseñado para LLMs, agentes de IA y pipelines de datos. De código abierto, flexible y construido para rendimiento en tiempo real, Crawl4AI empodera a los desarrolladores con velocidad, precisión y facilidad de despliegue sin igual.
✨ Consulta la última actualización v0.6.0
🎉 ¡La versión 0.6.0 ya está disponible! Esta versión candidata introduce Rastreo Consciente del Mundo con configuración geográfica y de idioma, extracción de Tablas a DataFrame, agrupación de navegadores con precalentamiento, captura de tráfico de red y consola, integración MCP para herramientas de IA, ¡y un despliegue Docker completamente renovado! Lee las notas de la versión →
Mi viaje con las computadoras comenzó en la infancia cuando mi padre, un científico de la computación, me presentó una computadora Amstrad. Esos primeros días despertaron una fascinación por la tecnología, llevándome a estudiar ciencias de la computación y especializarme en PNL durante mis estudios de posgrado. Fue durante este tiempo que me sumergí por primera vez en el rastreo web, construyendo herramientas para ayudar a los investigadores a organizar artículos y extraer información de publicaciones, una experiencia desafiante pero gratificante que perfeccionó mis habilidades en extracción de datos.
Avanzando rápidamente a 2023, estaba trabajando en una herramienta para un proyecto y necesitaba un rastreador para convertir una página web en markdown. Mientras exploraba soluciones, encontré una que afirmaba ser de código abierto pero requería crear una cuenta y generar un token de API. Peor aún, resultó ser un modelo SaaS que cobraba $16, y su calidad no cumplía con mis estándares. Frustrado, me di cuenta de que este era un problema más profundo. Esa frustración se convirtió en modo turbo de enojo, y decidí construir mi propia solución. En solo unos días, creé Crawl4AI. Para mi sorpresa, se volvió viral, ganando miles de estrellas en GitHub y resonando con una comunidad global.
Hice Crawl4AI de código abierto por dos razones. Primero, es mi manera de devolver a la comunidad de código abierto que me ha apoyado a lo largo de mi carrera. Segundo, creo que los datos deberían ser accesibles para todos, no bloqueados detrás de muros de pago o monopolizados por unos pocos. El acceso abierto a los datos sienta las bases para la democratización de la IA, una visión donde las personas pueden entrenar sus propios modelos y tomar posesión de su información. Esta biblioteca es el primer paso en un viaje más grande para crear la mejor herramienta de extracción y generación de datos de código abierto que el mundo haya visto, construida colaborativamente por una comunidad apasionada.
Gracias a todos los que han apoyado este proyecto, lo han usado y compartido comentarios. Su aliento me motiva a soñar aún más grande. Únanse, reporten problemas, envíen PRs o corran la voz. Juntos, podemos construir una herramienta que realmente empodere a las personas para acceder a sus propios datos y remodelar el futuro de la 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
Si encuentras algún problema relacionado con el navegador, puedes instalarlo 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
y picture
.raw:
) o archivos locales (file://
) directamente.✨ Visita nuestro Sitio de Documentación
Crawl4AI ofrece opciones de instalación flexibles para adaptarse a varios casos de uso. Puedes instalarlo como un paquete de Python o usar Docker.
Elige la opción de instalación que mejor se adapte a tus necesidades:
Para tareas básicas de rastreo web y extracción:
pip install crawl4ai
crawl4ai-setup # Setup the browser
Por defecto, esto instalará la versión asíncrona de Crawl4AI, usando Playwright para rastreo web.
👉 Nota: Cuando instalas Crawl4AI, crawl4ai-setup
debería instalar y configurar automáticamente Playwright. Sin embargo, si encuentras algún error relacionado con Playwright, puedes instalarlo manualmente usando uno de estos métodos:
A través de la línea de comandos:
playwright install
Si lo anterior no funciona, prueba este comando más específico:
python -m playwright install chromium
Este segundo método ha demostrado ser más confiable en algunos casos.
La versión síncrona está obsoleta y se eliminará en versiones futuras. Si necesitas la versión síncrona usando Selenium:
pip install crawl4ai[sync]
Para contribuidores que planean modificar el código fuente:
git clone https://github.com/unclecode/crawl4ai.git
cd crawl4ai
pip install -e . # Basic installation in editable mode
Instala características opcionales:
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
🚀 ¡Ahora Disponible! ¡Nuestra implementación Docker completamente rediseñada está aquí! Esta nueva solución hace que el despliegue sea más eficiente y fluido que nunca.
La nueva implementación Docker incluye:
# 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 documentación completa, consulta nuestra Guía de Despliegue Docker.
Ejecuta una prueba rápida (funciona para ambas opciones 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 más ejemplos, consulta nuestros Ejemplos Docker. Para configuración avanzada, variables de entorno y ejemplos de uso, consulta nuestra Guía de Despliegue Docker.
Puedes revisar la estructura del proyecto en el directorio https://github.com/unclecode/crawl4ai/docs/examples. Allí, puedes encontrar una variedad de ejemplos; aquí, se comparten algunos ejemplos populares.
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)}")
🌎 Rastreo Consciente del Mundo: Configura geolocalización, idioma y zona horaria para contenido auténtico específico de ubicación:
crun_cfg = CrawlerRunConfig(
url="https://browserleaks.com/geo", # página de prueba que muestra tu ubicación
locale="en-US", # Accept-Language y localización de UI
timezone_id="America/Los_Angeles", # Zona horaria de JS Date()/Intl
geolocation=GeolocationConfig( # sobrescribe coordenadas GPS
latitude=34.0522,
longitude=-118.2437,
accuracy=10.0,
)
)
📊 Extracción de Tablas a DataFrame: Extrae tablas HTML directamente a CSV o pandas DataFrames:
crawler = AsyncWebCrawler(config=browser_config)
await crawler.start()
try:
# Configura parámetros de scraping
crawl_config = CrawlerRunConfig(
table_score_threshold=8, # Detección estricta de tablas
)
# Ejecuta extracción de datos de mercado
results: List[CrawlResult] = await crawler.arun(
url="https://coinmarketcap.com/?page=1", config=crawl_config
)
# Procesa 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()
🚀 Agrupación de Navegadores: Las páginas se lanzan calientes con instancias de navegador precalentadas para menor latencia y uso de memoria
🕸️ Captura de Red y Consola: Registros completos de tráfico y instantáneas MHTML para depuración:
crawler_config = CrawlerRunConfig(
capture_network=True,
capture_console=True,
mhtml=True
)
🔌 Integración MCP: Conéctate a herramientas de IA como Claude Code a través del Protocolo de Contexto de Modelo
# Añade Crawl4AI a Claude Code
claude mcp add --transport sse c4ai-sse http://localhost:11235/mcp/sse
🖥️ Playground Interactivo: Prueba configuraciones y genera solicitudes API con la interfaz web integrada en http://localhost:11235//playground
🐳 Despliegue Docker Renovado: Imagen Docker multi-arquitectura optimizada con mejor eficiencia de recursos
📱 Sistema de Construcción Multi-etapa: Dockerfile optimizado con mejoras de rendimiento específicas por plataforma
Lee los detalles completos en nuestras Notas de la Versión 0.6.0 o consulta el CHANGELOG.
crwl
proporciona acceso conveniente desde terminallxml
Consulta todos los detalles en nuestras Notas de Lanzamiento 0.5.0.
Crawl4AI sigue las convenciones estándar de numeración de versiones de Python (PEP 440) para ayudar a los usuarios a entender la estabilidad y características de cada lanzamiento.
Nuestros números de versión siguen este patrón: MAYOR.MENOR.PARCHE
(ej. 0.4.3)
Usamos diferentes sufijos para indicar etapas de desarrollo:
dev
(0.4.3dev1): Versiones de desarrollo, inestablesa
(0.4.3a1): Lanzamientos alpha, características experimentalesb
(0.4.3b1): Lanzamientos beta, características completas pero necesitan pruebasrc
(0.4.3): Candidatos a lanzamiento, versión potencial finalInstalación regular (versión estable):
pip install -U crawl4ai
Instalar versiones preliminares:
pip install crawl4ai --pre
Instalar versión específica:
pip install crawl4ai==0.4.3b1
Usamos versiones preliminares para:
Para entornos de producción, recomendamos usar la versión estable. Para probar nuevas características, puedes optar por versiones preliminares usando la bandera --pre
.
🚨 Alerta de Actualización de Documentación: La próxima semana realizaremos una importante revisión de la documentación para reflejar actualizaciones recientes y mejoras. ¡Mantente atento para una guía más completa y actualizada!
Para la documentación actual, incluyendo instrucciones de instalación, características avanzadas y referencia de API, visita nuestro Sitio de Documentación.
Para consultar nuestros planes de desarrollo y próximas características, visita nuestra Hoja de Ruta.
Agradecemos contribuciones de la comunidad de código abierto. Consulta nuestras guías de contribución para más información.
Ayudaré a modificar la sección de licencia con insignias. Para el efecto de medios tonos, aquí hay una versión con él:
Aquí está la sección de licencia actualizada:
Este proyecto está licenciado bajo la Licencia Apache 2.0 con una cláusula de atribución requerida. Consulta el archivo de Licencia Apache 2.0 para detalles.
Al usar Crawl4AI, debes incluir uno de los siguientes métodos de atribución:
Añade una de estas insignias a tu README, documentación o sitio web:
Tema | Insignia |
---|---|
Tema Disco (Animado) | |
Tema Noche (Oscuro con Neon) | |
Tema Oscuro (Clásico) | |
Tema Claro (Clásico) |
Código HTML para añadir las insignias:
<!-- 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>
Añade esta línea a tu documentación:
This project uses Crawl4AI (https://github.com/unclecode/crawl4ai) for web data extraction.
Si usas Crawl4AI en tu investigación o proyecto, por favor cita:
@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 en texto:
UncleCode. (2024). Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper [Computer software].
GitHub. https://github.com/unclecode/crawl4ai
Para preguntas, sugerencias o feedback, no dudes en contactarnos:
¡Feliz Rastreo! 🕸️🚀
Nuestra misión es desbloquear el valor de los datos personales y empresariales transformando huellas digitales en activos estructurados y comerciables. Crawl4AI empodera a individuos y organizaciones con herramientas de código abierto para extraer y estructurar datos, fomentando una economía compartida de datos.
Visualizamos un futuro donde la IA se alimente de conocimiento humano real, asegurando que los creadores de datos se beneficien directamente de sus contribuciones. Al democratizar los datos y permitir un intercambio ético, estamos sentando las bases para un avance auténtico de la IA.
Para más detalles, consulta nuestra declaración de misión completa.