Crawl4AI ist das #1 Trending-Repository auf GitHub, aktiv gepflegt von einer lebendigen Community. Es bietet blitzschnelles, AI-optimiertes Web-Crawling für LLMs, KI-Agenten und Datenpipelines. Open Source, flexibel und für Echtzeitleistung konzipiert, ermöglicht Crawl4AI Entwicklern unübertroffene Geschwindigkeit, Präzision und einfache Bereitstellung.
✨ Aktuelle Updates v0.6.0 ansehen
🎉 Version 0.6.0 ist jetzt verfügbar! Dieser Release Candidate führt weltbewusstes Crawling mit Geolokalisierung und Locale-Einstellungen ein, Tabellen-zu-DataFrame-Extraktion, Browser-Pooling mit Vorwärmung, Netzwerk- und Konsolenverkehrserfassung, MCP-Integration für KI-Tools und eine komplett überarbeitete Docker-Bereitstellung! Release Notes lesen →
Meine Reise mit Computern begann in der Kindheit, als mein Vater, ein Informatiker, mir einen Amstrad-Computer vorstellte. Diese frühen Tage weckten eine Faszination für Technologie, die mich dazu brachte, Informatik zu studieren und mich während meines Postgraduiertenstudiums auf NLP zu spezialisieren. Damals begann ich erstmals mit Web-Crawling, indem ich Tools für Forscher baute, um Publikationen zu organisieren und Informationen aus Veröffentlichungen zu extrahieren – eine herausfordernde, aber lohnende Erfahrung, die meine Fähigkeiten in der Datenextraktion schärfte.
Schneller Vorlauf ins Jahr 2023: Ich arbeitete an einem Tool für ein Projekt und benötigte einen Crawler, um Webseiten in Markdown zu konvertieren. Bei der Suche nach Lösungen fand ich eine angeblich Open-Source-Lösung, die jedoch die Erstellung eines Kontos und die Generierung eines API-Tokens erforderte. Schlimmer noch, es stellte sich als SaaS-Modell heraus, das $16 kostete, und die Qualität entsprach nicht meinen Standards. Frustriert erkannte ich, dass dies ein tieferliegendes Problem war. Dieser Frust versetzte mich in einen Turbo-Ärger-Modus, und ich beschloss, meine eigene Lösung zu bauen. In nur wenigen Tagen entstand Crawl4AI. Zu meiner Überraschung wurde es viral und erhielt Tausende von GitHub-Sternen, wobei es eine globale Community begeisterte.
Ich habe Crawl4AI aus zwei Gründen als Open Source veröffentlicht. Erstens ist es meine Art, der Open-Source-Community etwas zurückzugeben, die mich während meiner gesamten Karriere unterstützt hat. Zweitens glaube ich, dass Daten für alle zugänglich sein sollten, nicht hinter Paywalls verschlossen oder von einigen wenigen monopolisiert. Offener Zugang zu Daten legt den Grundstein für die Demokratisierung der KI, eine Vision, in der Einzelpersonen ihre eigenen Modelle trainieren und die Kontrolle über ihre Informationen behalten können. Diese Bibliothek ist der erste Schritt auf einer größeren Reise, um das beste Open-Source-Datenextraktions- und -generierungstool zu schaffen, das die Welt je gesehen hat – gemeinsam entwickelt von einer leidenschaftlichen Community.
Danke an alle, die dieses Projekt unterstützt, genutzt und Feedback gegeben haben. Eure Ermutigung motiviert mich, noch größer zu träumen. Macht mit, meldet Probleme, reicht PRs ein oder verbreitet die Nachricht. Gemeinsam können wir ein Tool schaffen, das Menschen wirklich befähigt, auf ihre eigenen Daten zuzugreifen und die Zukunft der KI zu gestalten.
# 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
Falls browserbezogene Probleme auftreten, können sie manuell installiert werden:
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
und picture
.raw:
) oder lokale Dateien (file://
).✨ Besuche unsere Dokumentationswebsite
Crawl4AI bietet flexible Installationsoptionen für verschiedene Anwendungsfälle. Es kann als Python-Paket installiert oder mit Docker verwendet werden.
Wähle die Installationsoption, die am besten zu deinen Anforderungen passt:
Für grundlegende Web-Crawling- und Scraping-Aufgaben:
pip install crawl4ai
crawl4ai-setup # Setup the browser
Standardmäßig wird die asynchrone Version von Crawl4AI installiert, die Playwright für Web-Crawling verwendet.
👉 Hinweis: Bei der Installation von Crawl4AI sollte crawl4ai-setup
Playwright automatisch installieren und einrichten. Falls jedoch Playwright-bezogene Fehler auftreten, kann es manuell mit einer dieser Methoden installiert werden:
Über die Kommandozeile:
playwright install
Falls das nicht funktioniert, versuche diesen spezifischeren Befehl:
python -m playwright install chromium
Diese zweite Methode hat sich in einigen Fällen als zuverlässiger erwiesen.
Die synchrone Version ist veraltet und wird in zukünftigen Versionen entfernt. Falls die synchrone Version mit Selenium benötigt wird:
pip install crawl4ai[sync]
Für Mitwirkende, die den Quellcode modifizieren möchten:
git clone https://github.com/unclecode/crawl4ai.git
cd crawl4ai
pip install -e . # Basic installation in editable mode
Optionale Features installieren:
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
🚀 Jetzt verfügbar! Unsere komplett neu gestaltete Docker-Implementierung ist da! Diese neue Lösung macht die Bereitstellung effizienter und nahtloser denn je.
Die neue Docker-Implementierung beinhaltet:
# 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
Für vollständige Dokumentation siehe unseren Docker-Bereitstellungsleitfaden.
Führe einen Schnelltest durch (funktioniert für beide Docker-Optionen):
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}")
Weitere Beispiele findest du in unseren Docker-Beispielen. Für erweiterte Konfiguration, Umgebungsvariablen und Nutzungsbeispiele siehe unseren Docker-Bereitstellungsleitfaden.
Die Projektstruktur kann im Verzeichnis https://github.com/unclecode/crawl4ai/docs/examples eingesehen werden. Dort finden sich verschiedene Beispiele; hier werden einige beliebte Beispiele geteilt.
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)}")
🌎 Weltbewusstes Crawling: Setze Geolokalisierung, Sprache und Zeitzone für authentische, regionsspezifische Inhalte:
crun_cfg = CrawlerRunConfig(
url="https://browserleaks.com/geo", # Testseite, die deinen Standort anzeigt
locale="en-US", # Accept-Language & UI-Locale
timezone_id="America/Los_Angeles", # JS Date()/Intl-Zeitzone
geolocation=GeolocationConfig( # GPS-Koordinaten überschreiben
latitude=34.0522,
longitude=-118.2437,
accuracy=10.0,
)
)
📊 Tabellen-zu-DataFrame-Extraktion: Extrahiere HTML-Tabellen direkt in CSV oder pandas DataFrames:
crawler = AsyncWebCrawler(config=browser_config)
await crawler.start()
try:
# Scraping-Parameter einrichten
crawl_config = CrawlerRunConfig(
table_score_threshold=8, # Strenge Tabellenerkennung
)
# Marktdatenextraktion ausführen
results: List[CrawlResult] = await crawler.arun(
url="https://coinmarketcap.com/?page=1", config=crawl_config
)
# Ergebnisse verarbeiten
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()
🚀 Browser-Pooling: Seiten starten mit vorgewärmten Browser-Instanzen für geringere Latenz und Speichernutzung
🕸️ Netzwerk- und Konsolenverkehrserfassung: Vollständige Verkehrsprotokolle und MHTML-Snapshots für Debugging:
crawler_config = CrawlerRunConfig(
capture_network=True,
capture_console=True,
mhtml=True
)
🔌 MCP-Integration: Verbindung zu KI-Tools wie Claude Code über das Model Context Protocol
# Crawl4AI zu Claude Code hinzufügen
claude mcp add --transport sse c4ai-sse http://localhost:11235/mcp/sse
🖥️ Interaktiver Playground: Teste Konfigurationen und generiere API-Anfragen mit der eingebauten Weboberfläche unter http://localhost:11235//playground
🐳 Überarbeitete Docker-Bereitstellung: Streamlined Multi-Architektur-Docker-Image mit verbesserter Ressourceneffizienz
📱 Multi-Stage-Build-System: Optimiertes Dockerfile mit plattformspezifischen Leistungsverbesserungen
Lies die vollständigen Details in unseren 0.6.0 Release Notes oder schau in das CHANGELOG.
crwl
CLI für bequemen Terminalzugrifflxml
-BibliothekLesen Sie die vollständigen Details in unseren 0.5.0 Release Notes.
Crawl4AI folgt den standardmäßigen Python-Versionsnummerierungskonventionen (PEP 440), um Nutzern das Verständnis der Stabilität und Features jeder Version zu erleichtern.
Unsere Versionsnummern folgen diesem Muster: MAJOR.MINOR.PATCH
(z.B. 0.4.3)
Wir verwenden verschiedene Suffixe, um Entwicklungsstadien anzuzeigen:
dev
(0.4.3dev1): Entwicklungsversionen, instabila
(0.4.3a1): Alpha-Versionen, experimentelle Featuresb
(0.4.3b1): Beta-Versionen, featurekomplett aber benötigt Testsrc
(0.4.3): Release-Kandidaten, potenzielle finale VersionReguläre Installation (stabile Version):
pip install -U crawl4ai
Pre-release-Versionen installieren:
pip install crawl4ai --pre
Spezifische Version installieren:
pip install crawl4ai==0.4.3b1
Wir nutzen Pre-releases, um:
Für Produktionsumgebungen empfehlen wir die stabile Version. Zum Testen neuer Features können Sie Pre-releases mit dem --pre
-Flag nutzen.
🚨 Dokumentationsupdate-Hinweis: Nächste Woche unterziehen wir unsere Dokumentation einer größeren Überarbeitung, um aktuelle Updates und Verbesserungen widerzuspiegeln. Bleiben Sie dran für eine umfassendere und aktuellere Anleitung!
Für aktuelle Dokumentation, inklusive Installationsanleitungen, erweiterten Features und API-Referenz, besuchen Sie unsere Dokumentationswebsite.
Um unsere Entwicklungspläne und kommende Features einzusehen, besuchen Sie unseren Roadmap.
Wir freuen uns über Beiträge aus der Open-Source-Community. Lesen Sie unsere Beitragsrichtlinien für weitere Informationen.
Ich helfe bei der Anpassung des Lizenzabschnitts mit Badges. Für den Halbton-Effekt hier eine Version damit:
Hier der aktualisierte Lizenzabschnitt:
Dieses Projekt ist lizenziert unter der Apache License 2.0 mit einer erforderlichen Zuschreibungsklausel. Siehe die Apache 2.0 Lizenz für Details.
Bei Nutzung von Crawl4AI müssen Sie eine der folgenden Zuschreibungsmethoden einbeziehen:
Fügen Sie eines dieser Badges zu Ihrer README, Dokumentation oder Website hinzu:
Theme | Badge |
---|---|
Disco Theme (Animiert) | |
Night Theme (Dunkel mit Neon) | |
Dark Theme (Klassisch) | |
Light Theme (Klassisch) |
HTML-Code zum Hinzufügen der 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>
Fügen Sie diese Zeile zu Ihrer Dokumentation hinzu:
This project uses Crawl4AI (https://github.com/unclecode/crawl4ai) for web data extraction.
Wenn Sie Crawl4AI in Ihrer Forschung oder Ihrem Projekt nutzen, zitieren Sie bitte:
@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}
}
Text-Zitierformat:
UncleCode. (2024). Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper [Computer software].
GitHub. https://github.com/unclecode/crawl4ai
Bei Fragen, Anregungen oder Feedback können Sie uns gerne kontaktieren:
Viel Spaß beim Crawlen! 🕸️🚀
Unsere Mission ist es, den Wert persönlicher und unternehmerischer Daten freizusetzen, indem wir digitale Fußabdrücke in strukturierte, handelbare Assets verwandeln. Crawl4AI befähigt Individuen und Organisationen mit Open-Source-Tools zur Extraktion und Strukturierung von Daten, um eine gemeinsame Datenökonomie zu fördern.
Wir stellen uns eine Zukunft vor, in der KI durch echtes menschliches Wissen betrieben wird, wodurch Datenproduzenten direkt von ihren Beiträgen profitieren. Durch die Demokratisierung von Daten und die Ermöglichung ethischen Teilens legen wir den Grundstein für authentischen KI-Fortschritt.
Für mehr Details siehe unsere vollständige Missionserklärung.