Crawl4AI — это репозиторий №1 по популярности на GitHub, активно поддерживаемый активным сообществом. Он предоставляет сверхбыстрый веб-краулинг, готовый для использования с LLM, AI-агентами и конвейерами данных. Открытый исходный код, гибкость и ориентация на реальное время работы делают Crawl4AI мощным инструментом для разработчиков, предлагая непревзойденную скорость, точность и простоту развертывания.
✨ Посмотрите последние обновления v0.6.0
🎉 Доступна версия 0.6.0! Этот релиз-кандидат включает World-aware Crawling с геолокацией и настройками локали, извлечение таблиц в DataFrame, пул браузеров с предварительным прогревом, захват сетевого и консольного трафика, интеграцию с MCP для AI-инструментов и полностью переработанное развертывание в Docker! Читайте заметки о выпуске →
Мое знакомство с компьютерами началось в детстве, когда мой отец, специалист по компьютерным наукам, показал мне компьютер Amstrad. Эти ранние дни пробудили во мне интерес к технологиям, что привело меня к изучению компьютерных наук и специализации в NLP во время аспирантуры. Именно тогда я впервые погрузился в веб-краулинг, создавая инструменты для помощи исследователям в организации статей и извлечении информации из публикаций — сложный, но полезный опыт, который отточил мои навыки в извлечении данных.
В 2023 году я работал над инструментом для проекта и мне понадобился краулер для преобразования веб-страницы в Markdown. Изучая решения, я нашел один, который позиционировался как open-source, но требовал создания аккаунта и генерации API-токена. Хуже того, оказалось, что это SaaS-модель с оплатой $16, и качество не соответствовало моим стандартам. Разочарованный, я осознал, что это более глубокая проблема. Это разочарование перешло в режим турбо-гнева, и я решил создать собственное решение. Всего за несколько дней я разработал Crawl4AI. К моему удивлению, проект стал вирусным, получив тысячи звезд на GitHub и откликнувшись глобальному сообществу.
Я сделал Crawl4AI открытым по двум причинам. Во-первых, это мой способ отдать долг open-source сообществу, которое поддерживало меня на протяжении всей карьеры. Во-вторых, я верю, что данные должны быть доступны всем, а не скрыты за платными стенами или монополизированы немногими. Открытый доступ к данным закладывает основу для демократизации AI, где каждый может обучать свои модели и владеть своей информацией. Эта библиотека — первый шаг в большом путешествии по созданию лучшего open-source инструмента для извлечения и генерации данных, который когда-либо видел мир, создаваемого совместными усилиями страстного сообщества.
Спасибо всем, кто поддерживал этот проект, использовал его и делился отзывами. Ваша поддержка вдохновляет меня мечтать еще больше. Присоединяйтесь, создавайте issues, отправляйте PR или распространяйте информацию. Вместе мы можем создать инструмент, который действительно даст людям доступ к их данным и изменит будущее AI.
# 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
Если возникнут проблемы с браузером, их можно установить вручную:
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
и picture
.raw:
) или локальные файлы (file://
) напрямую.✨ Посетите наш Сайт документации
Crawl4AI предлагает гибкие варианты установки для различных сценариев использования. Вы можете установить его как Python-пакет или использовать Docker.
Выберите вариант установки, который лучше всего соответствует вашим потребностям:
Для базовых задач веб-краулинга и скрейпинга:
pip install crawl4ai
crawl4ai-setup # Setup the browser
По умолчанию это установит асинхронную версию Crawl4AI, использующую Playwright для веб-краулинга.
👉 Примечание: При установке Crawl4AI скрипт crawl4ai-setup
должен автоматически установить и настроить Playwright. Однако, если возникнут ошибки, связанные с Playwright, вы можете установить его вручную одним из следующих способов:
Через командную строку:
playwright install
Если предыдущий способ не сработал, попробуйте более конкретную команду:
python -m playwright install chromium
Этот второй метод в некоторых случаях оказывается более надежным.
Синхронная версия устарела и будет удалена в будущих версиях. Если вам нужна синхронная версия с использованием Selenium:
pip install crawl4ai[sync]
Для участников, которые планируют изменять исходный код:
git clone https://github.com/unclecode/crawl4ai.git
cd crawl4ai
pip install -e . # Basic installation in editable mode
Установка дополнительных возможностей:
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
🚀 Теперь доступно! Наша полностью переработанная реализация Docker готова! Это новое решение делает развертывание более эффективным и удобным, чем когда-либо.
Новая реализация Docker включает:
# 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
Полную документацию см. в нашем Руководстве по развертыванию Docker.
Запустите быстрый тест (работает для обоих вариантов 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}")
Больше примеров см. в нашем Docker Examples. Для расширенной конфигурации, переменных окружения и примеров использования см. Руководство по развертыванию Docker.
Структуру проекта можно посмотреть в директории https://github.com/unclecode/crawl4ai/docs/examples. Там вы найдете множество примеров; здесь приведены некоторые популярные.
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)}")
🌎 World-aware Crawling: Установка геолокации, языка и часового пояса для аутентичного локализованного контента:
crun_cfg = CrawlerRunConfig(
url="https://browserleaks.com/geo", # тестовая страница, показывающая ваше местоположение
locale="en-US", # Accept-Language & UI локаль
timezone_id="America/Los_Angeles", # JS Date()/Intl часовой пояс
geolocation=GeolocationConfig( # переопределение GPS-координат
latitude=34.0522,
longitude=-118.2437,
accuracy=10.0,
)
)
📊 Извлечение таблиц в DataFrame: Прямое преобразование HTML-таблиц в CSV или pandas DataFrames:
crawler = AsyncWebCrawler(config=browser_config)
await crawler.start()
try:
# Настройка параметров скрейпинга
crawl_config = CrawlerRunConfig(
table_score_threshold=8, # Строгое обнаружение таблиц
)
# Извлечение рыночных данных
results: List[CrawlResult] = await crawler.arun(
url="https://coinmarketcap.com/?page=1", config=crawl_config
)
# Обработка результатов
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()
🚀 Пул браузеров: Страницы запускаются "горячими" с предварительно прогретыми экземплярами браузеров для снижения задержки и использования памяти
🕸️ Захват сети и консоли: Полные логи трафика и MHTML-снимки для отладки:
crawler_config = CrawlerRunConfig(
capture_network=True,
capture_console=True,
mhtml=True
)
🔌 Интеграция с MCP: Подключение к AI-инструментам, таким как Claude Code, через Model Context Protocol
# Добавление Crawl4AI в Claude Code
claude mcp add --transport sse c4ai-sse http://localhost:11235/mcp/sse
🖥️ Интерактивная площадка: Тестирование конфигураций и генерация API-запросов через встроенный веб-интерфейс по адресу http://localhost:11235//playground
🐳 Переработанное развертывание Docker: Упрощенный мультиархитектурный Docker-образ с улучшенной эффективностью ресурсов
📱 Многоэтапная система сборки: Оптимизированный Dockerfile с улучшениями производительности для конкретных платформ
Подробности читайте в Заметках о выпуске 0.6.0 или проверьте CHANGELOG.
crwl
для удобной работы в терминалеlxml
Подробности в заметках о выпуске 0.5.0.
Crawl4AI следует стандартным соглашениям Python (PEP 440) для обозначения стабильности и функциональности выпусков.
Номера версий имеют формат: ОСНОВНАЯ.МИНОРНАЯ.ПАТЧ
(например, 0.4.3)
Используются суффиксы для обозначения стадий разработки:
dev
(0.4.3dev1): Нестабильные версии в разработкеa
(0.4.3a1): Альфа-релизы с экспериментальными функциямиb
(0.4.3b1): Бета-релизы с полным функционалом, требующие тестированияrc
(0.4.3): Релиз-кандидаты, потенциальные финальные версииСтабильная версия:
pip install -U crawl4ai
Предварительные версии:
pip install crawl4ai --pre
Конкретная версия:
pip install crawl4ai==0.4.3b1
Мы используем их для:
Для production рекомендуется использовать стабильные версии. Для тестирования новых функций можно использовать флаг --pre
.
🚨 Обновление документации: На следующей неделе ожидается масштабное обновление документации с учетом последних изменений. Следите за обновлениями!
Текущая документация, включая инструкции по установке, расширенные функции и API, доступна на сайте документации.
План развития и предстоящие функции можно посмотреть в Roadmap.
Мы приветствуем вклад от сообщества. Подробности в руководстве для участников.
Обновленная информация о лицензии:
Проект лицензирован под Apache License 2.0 с требованием атрибуции. Подробности в файле лицензии.
При использовании Crawl4AI необходимо указать один из вариантов:
Добавьте один из бейджей в ваш README, документацию или сайт:
Тема | Бейдж |
---|---|
Disco Theme (Анимированный) | |
Night Theme (Темный с неоном) | |
Dark Theme (Классический темный) | |
Light Theme (Классический светлый) |
HTML-код для добавления бейджей:
<!-- 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>
Добавьте строку в вашу документацию:
This project uses Crawl4AI (https://github.com/unclecode/crawl4ai) for web data extraction.
Если вы используете Crawl4AI в исследованиях или проектах, процитируйте:
@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}
}
Текстовый формат цитирования:
UncleCode. (2024). Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper [Computer software].
GitHub. https://github.com/unclecode/crawl4ai
По вопросам и предложениям:
Удачного сканирования! 🕸️🚀
Наша цель - раскрыть ценность персональных и корпоративных данных, преобразуя цифровые следы в структурированные активы. Crawl4AI предоставляет инструменты с открытым исходным кодом для извлечения и структурирования данных, способствуя созданию экономики общих данных.
Мы стремимся к будущему, где ИИ работает на основе реальных человеческих знаний, а создатели данных получают прямую выгоду. Демократизируя данные и обеспечивая этичный обмен, мы закладываем основу для подлинного развития ИИ.
Подробности в полном описании миссии.