Проблема
LLM любят markdown. HTML — нет. Когда вы пытаетесь скормить модели реальную веб-страницу, получается:
- 80% токенов уходит на навигацию, рекламу, футеры
- Структура документа теряется в div-ах и span-ах
- JavaScript-рендеринг требует headless-браузера
- Антибот-защиты блокируют простые curl-запросы
Решение
Firecrawl — это API и self-hosted сервис, который:
- Обходит сайт целиком (crawling)
- Рендерит JavaScript через headless Chrome
- Превращает каждую страницу в чистый markdown (или structured JSON)
- Извлекает основной контент, игнорируя шум
- Работает с любой CMS — Confluence, Notion, GitBook, обычные сайты
Установка
Self-hosted через Docker:
git clone https://github.com/mendableai/firecrawl
cd firecrawl
docker compose up -d
После старта API доступен на http://localhost:3002.
Использование
Scrape одной страницы
import FirecrawlApp from "@mendable/firecrawl-js";
const app = new FirecrawlApp({ apiKey: "fc-..." });
const result = await app.scrapeUrl("https://example.com/article", {
formats: ["markdown"],
onlyMainContent: true,
});
console.log(result.markdown);
Crawl всего сайта
const crawlResult = await app.crawlUrl("https://docs.example.com", {
limit: 100,
includes: ["docs/*"],
excludes: ["docs/api/internal/*"],
scrapeOptions: { formats: ["markdown"] },
});
Extract структурированных данных
const result = await app.extract({
urls: ["https://shop.example.com/products/123"],
schema: {
type: "object",
properties: {
name: { type: "string" },
price: { type: "number" },
inStock: { type: "boolean" },
},
},
});
Архитектура
Firecrawl/
├── apps/api/ # Fastify API сервер
├── apps/worker/ # BullMQ воркеры для скрапинга
├── apps/playwright-service/ # Headless Chrome
├── apps/rust-sdk/ # Rust SDK для встраивания
└── packages/ # Общие пакеты
Под капотом:
- Playwright для рендеринга JS
- BullMQ + Redis для очередей задач
- PostgreSQL для хранения результатов
- Puppeteer stealth для обхода антиботов
- LLM-экстракция через OpenAI или локальные модели
Главные сценарии
1. RAG для документации
// Скрейпим всю документацию проекта
await app.crawlUrl("https://docs.myproject.com", { limit: 500 });
// Дальше чанкинг + эмбеддинги + ChromaDB
// → готовый RAG-ассистент
2. Парсинг вакансий, цен, новостей
Структурированные схемы (JSON Schema) превращают хаотичный HTML в чистые данные.
3. Мониторинг изменений на сайте
Crawl по расписанию + diff между версиями = уведомления о важных изменениях.
4. Построение датасетов
Если вы готовите датасет для fine-tuning, вам нужно много качественного текстового контента. Firecrawl даёт его одной командой.
Сравнение с альтернативами
| Инструмент | JS-рендеринг | Markdown | Структурный extract | Self-hosted |
|---|---|---|---|---|
| BeautifulSoup | ❌ | ❌ | ❌ | ✅ |
| Scrapy + Splash | ✅ | ❌ | ❌ | ✅ |
| Puppeteer | ✅ | ❌ | ❌ | ✅ |
| Reader API | ❌ | ✅ | ❌ | ❌ |
| Firecrawl | ✅ | ✅ | ✅ | ✅ |
Ограничения
- Self-hosted версия требует хорошего железа (Playwright прожорлив)
- Headless-браузеры иногда блокируются сайтами с серьёзной антибот-защитой
- Для очень больших сайтов (>100k страниц) нужна серьёзная инфраструктура
Итог
Лучший open-source инструмент для превращения веба в данные, пригодные для LLM. Поставил — и через 10 минут у тебя есть API, который по URL возвращает чистый markdown. Используется в продакшене у Cursor, Replit и десятков других AI-стартапов.