Crawl4AI est le dépôt GitHub #1 en tendance, activement maintenu par une communauté dynamique. Il offre un crawling web ultra-rapide et prêt pour l'IA, spécialement conçu pour les LLM, agents IA et pipelines de données. Open source, flexible et optimisé pour les performances en temps réel, Crawl4AI donne aux développeurs une vitesse, une précision et une facilité de déploiement inégalées.
✨ Découvrez la dernière mise à jour v0.6.0
🎉 La version 0.6.0 est maintenant disponible ! Ce candidat à la version introduit le crawling géolocalisé, l'extraction de tableaux en DataFrames, le pooling de navigateurs avec préchauffage, la capture du trafic réseau et console, l'intégration MCP pour les outils IA, et un déploiement Docker entièrement repensé ! Lire les notes de version →
Mon parcours avec les ordinateurs a commencé dans l'enfance lorsque mon père, informaticien, m'a initié à un Amstrad. Ces premiers jours ont éveillé une fascination pour la technologie, me conduisant à étudier l'informatique et à me spécialiser en NLP pendant mes études postuniversitaires. C'est à cette époque que j'ai commencé à explorer le web crawling, construisant des outils pour aider les chercheurs à organiser des articles et extraire des informations de publications - une expérience exigeante mais enrichissante qui a affiné mes compétences en extraction de données.
En 2023, alors que je travaillais sur un outil pour un projet, j'avais besoin d'un crawler pour convertir une page web en markdown. En explorant les solutions, j'en ai trouvé une qui se disait open-source mais nécessitait la création d'un compte et la génération d'un token API. Pire, il s'agissait en réalité d'un modèle SaaS facturant 16$, et sa qualité ne répondait pas à mes attentes. Frustré, j'ai réalisé qu'il s'agissait d'un problème plus profond. Cette frustration s'est transformée en mode turbo colère, et j'ai décidé de construire ma propre solution. En quelques jours seulement, j'ai créé Crawl4AI. À ma grande surprise, il est devenu viral, gagnant des milliers d'étoiles GitHub et résonnant avec une communauté mondiale.
J'ai rendu Crawl4AI open-source pour deux raisons. Premièrement, c'est ma façon de redonner à la communauté open-source qui m'a soutenu tout au long de ma carrière. Deuxièmement, je crois que les données devraient être accessibles à tous, pas enfermées derrière des paywalls ou monopolisées par quelques-uns. L'accès ouvert aux données jette les bases de la démocratisation de l'IA, une vision où les individus peuvent entraîner leurs propres modèles et prendre possession de leurs informations. Cette bibliothèque est la première étape d'un voyage plus large pour créer le meilleur outil open-source d'extraction et de génération de données que le monde ait jamais vu, construit collaborativement par une communauté passionnée.
Merci à tous ceux qui ont soutenu ce projet, l'ont utilisé et partagé des retours. Votre encouragement me motive à rêver encore plus grand. Rejoignez-nous, signalez des problèmes, soumettez des PR ou faites passer le mot. Ensemble, nous pouvons construire un outil qui permet véritablement aux gens d'accéder à leurs propres données et de remodeler l'avenir de l'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 vous rencontrez des problèmes liés au navigateur, vous pouvez les installer manuellement :
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
et picture
.raw:
) ou les fichiers locaux (file://
).✨ Visitez notre Site de Documentation
Crawl4AI offre des options d'installation flexibles pour s'adapter à divers cas d'utilisation. Vous pouvez l'installer comme un package Python ou utiliser Docker.
Choisissez l'option d'installation qui correspond le mieux à vos besoins :
Pour les tâches de base de crawling et scraping web :
pip install crawl4ai
crawl4ai-setup # Setup the browser
Par défaut, cela installera la version asynchrone de Crawl4AI, utilisant Playwright pour le crawling web.
👉 Note : Lorsque vous installez Crawl4AI, crawl4ai-setup
devrait automatiquement installer et configurer Playwright. Cependant, si vous rencontrez des erreurs liées à Playwright, vous pouvez l'installer manuellement en utilisant l'une de ces méthodes :
Via la ligne de commande :
playwright install
Si la méthode ci-dessus ne fonctionne pas, essayez cette commande plus spécifique :
python -m playwright install chromium
Cette deuxième méthode s'est avérée plus fiable dans certains cas.
La version synchrone est dépréciée et sera supprimée dans les futures versions. Si vous avez besoin de la version synchrone utilisant Selenium :
pip install crawl4ai[sync]
Pour les contributeurs qui prévoient de modifier le code source :
git clone https://github.com/unclecode/crawl4ai.git
cd crawl4ai
pip install -e . # Basic installation in editable mode
Installez les fonctionnalités optionnelles :
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
🚀 Maintenant Disponible ! Notre implémentation Docker complètement repensée est là ! Cette nouvelle solution rend le déploiement plus efficace et transparent que jamais.
La nouvelle implémentation Docker inclut :
# 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
Pour une documentation complète, consultez notre Guide de Déploiement Docker.
Exécutez un test rapide (fonctionne pour les deux options 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}")
Pour plus d'exemples, voir nos Exemples Docker. Pour une configuration avancée, les variables d'environnement et des exemples d'utilisation, voir notre Guide de Déploiement Docker.
Vous pouvez consulter la structure du projet dans le répertoire https://github.com/unclecode/crawl4ai/docs/examples. Vous y trouverez une variété d'exemples ; voici quelques exemples populaires.
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)}")
🌎 Crawling Géolocalisé : Définissez la géolocalisation, la langue et le fuseau horaire pour un contenu local authentique :
crun_cfg = CrawlerRunConfig(
url="https://browserleaks.com/geo", # page de test montrant votre localisation
locale="en-US", # Accept-Language & locale UI
timezone_id="America/Los_Angeles", # Fuseau horaire JS Date()/Intl
geolocation=GeolocationConfig( # remplace les coordonnées GPS
latitude=34.0522,
longitude=-118.2437,
accuracy=10.0,
)
)
📊 Extraction Tableau-vers-DataFrame : Extrait les tableaux HTML directement en CSV ou pandas DataFrames :
crawler = AsyncWebCrawler(config=browser_config)
await crawler.start()
try:
# Configurez les paramètres de scraping
crawl_config = CrawlerRunConfig(
table_score_threshold=8, # Détection stricte des tableaux
)
# Exécutez l'extraction de données de marché
results: List[CrawlResult] = await crawler.arun(
url="https://coinmarketcap.com/?page=1", config=crawl_config
)
# Traitez les résultats
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()
🚀 Pooling de Navigateurs : Les pages démarrent chaudes avec des instances de navigateurs préchauffées pour une latence et une utilisation mémoire réduites
🕸️ Capture Réseau et Console : Logs complets du trafic et snapshots MHTML pour le débogage :
crawler_config = CrawlerRunConfig(
capture_network=True,
capture_console=True,
mhtml=True
)
🔌 Intégration MCP : Connectez-vous aux outils IA comme Claude Code via le Model Context Protocol
# Ajoutez Crawl4AI à Claude Code
claude mcp add --transport sse c4ai-sse http://localhost:11235/mcp/sse
🖥️ Playground Interactif : Testez des configurations et générez des requêtes API avec l'interface web intégrée à http://localhost:11235//playground
🐳 Déploiement Docker Repensé : Image Docker multi-architecture rationalisée avec une meilleure efficacité des ressources
📱 Système de Build Multi-étapes : Dockerfile optimisé avec des améliorations de performances spécifiques à la plateforme
Lisez les détails complets dans nos Notes de Version 0.6.0 ou consultez le CHANGELOG.
crwl
pour un accès pratique depuis le terminallxml
Consultez les détails complets dans nos Notes de Version 0.5.0.
Crawl4AI suit les conventions standard de numérotation des versions Python (PEP 440) pour aider les utilisateurs à comprendre la stabilité et les fonctionnalités de chaque version.
Nos numéros de version suivent ce modèle : MAJEUR.MINEUR.CORRECTIF
(ex. 0.4.3)
Nous utilisons différents suffixes pour indiquer les étapes de développement :
dev
(0.4.3dev1) : Versions de développement, instablesa
(0.4.3a1) : Versions alpha, fonctionnalités expérimentalesb
(0.4.3b1) : Versions bêta, fonctionnalités complètes mais nécessitant des testsrc
(0.4.3) : Versions candidates, potentielle version finaleInstallation standard (version stable) :
pip install -U crawl4ai
Installation des versions préliminaires :
pip install crawl4ai --pre
Installation d'une version spécifique :
pip install crawl4ai==0.4.3b1
Nous utilisons des versions préliminaires pour :
Pour les environnements de production, nous recommandons d'utiliser la version stable. Pour tester de nouvelles fonctionnalités, vous pouvez opter pour les versions préliminaires avec le flag --pre
.
🚨 Alerte Mise à Jour Documentation : Nous entreprenons une refonte majeure de la documentation la semaine prochaine pour refléter les dernières mises à jour et améliorations. Restez à l'écoute pour un guide plus complet et actualisé !
Pour la documentation actuelle, incluant les instructions d'installation, fonctionnalités avancées et référence API, visitez notre Site de Documentation.
Pour consulter nos plans de développement et les fonctionnalités à venir, visitez notre Feuille de Route.
Nous accueillons les contributions de la communauté open-source. Consultez nos lignes directrices de contribution pour plus d'informations.
Je vais aider à modifier la section licence avec des badges. Pour l'effet demi-teinte, voici une version avec celui-ci :
Voici la section licence mise à jour :
Ce projet est sous licence Apache 2.0 avec une clause d'attribution obligatoire. Voir le fichier Licence Apache 2.0 pour les détails.
Lorsque vous utilisez Crawl4AI, vous devez inclure l'une des méthodes d'attribution suivantes :
Ajoutez l'un de ces badges à votre README, documentation ou site web :
Thème | Badge |
---|---|
Thème Disco (Animé) | |
Thème Nuit (Sombre avec Neon) | |
Thème Sombre (Classique) | |
Thème Clair (Classique) |
Code HTML pour ajouter les 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>
Ajoutez cette ligne à votre documentation :
This project uses Crawl4AI (https://github.com/unclecode/crawl4ai) for web data extraction.
Si vous utilisez Crawl4AI dans votre recherche ou projet, veuillez citer :
@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}
}
Format de citation textuelle :
UncleCode. (2024). Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper [Computer software].
GitHub. https://github.com/unclecode/crawl4ai
Pour des questions, suggestions ou feedback, n'hésitez pas à nous contacter :
Bon Crawling ! 🕸️🚀
Notre mission est de libérer la valeur des données personnelles et d'entreprise en transformant les empreintes digitales en actifs structurés et échangeables. Crawl4AI donne aux individus et organisations des outils open-source pour extraire et structurer les données, favorisant une économie de données partagée.
Nous envisageons un futur où l'IA est alimentée par de vraies connaissances humaines, assurant que les créateurs de données bénéficient directement de leurs contributions. En démocratisant les données et en permettant un partage éthique, nous posons les fondations d'une avancée authentique de l'IA.
Pour plus de détails, voir notre déclaration de mission complète.