Scrape, crawl, map и extract: превращает любые сайты в markdown и JSON для RAG и агентов
Firecrawl — это API, который превращает любой сайт в чистый Markdown или структурированный JSON. Создан специально для AI-агентов, LLM-приложений и пайплайнов обработки данных. 161 000+ звёзд на GitHub, 10 SDK, self-hosted опенсорс-версия.
Firecrawl построен как многослойная платформа извлечения веб-данных, спроектированная для AI-приложений. Верхний слой Core API предоставляет конечные точки Scrape, Crawl, Map, Search и Agent. Слой Primitives управляет headless-браузерами (Playwright), ротацией прокси и рендерингом JavaScript-страниц. Слой Implementations включает SDK для 10 языков, MCP-сервер и CLI. Внешний слой охватывает облачный сервис, self-hosted Docker-развёртывание и интеграции с LangChain, LlamaIndex, CrewAI.
Firecrawl — это специализированный API для веб-скрейпинга, построенный с нуля для эпохи больших языковых моделей и AI-агентов. Он решает фундаментальную проблему: как превратить неструктурированный веб-контент (HTML с JavaScript, CSS, рекламой, попапами) в чистые, LLM-совместимые форматы — Markdown и структурированный JSON. Проект был создан в апреле 2024 года и за два года стал доминирующим open-source решением в своей нише с более чем 161 000 звёзд на GitHub и 9 000 форков.
Ключевое преимущество Firecrawl — он обрабатывает JavaScript-тяжёлые страницы (SPA на React/Vue/Angular) через headless-браузер Playwright, автоматически ротирует прокси, обходит rate limits и блокировки, а на выходе даёт чистый Markdown или структурированный JSON, готовый для подачи в LLM. В отличие от традиционных скрейперов вроде BeautifulSoup или Scrapy, Firecrawl проектировался не для парсинга конкретных сайтов, а как web context provider — инфраструктурный слой между интернетом и AI-приложениями.
История проекта началась в апреле 2024 года, когда команда основателей — Эрик Чиарла, Николас Камара и Калеб Пеффер — запустила open-source репозиторий под крылом компании Mendable (позже выделился в отдельную организацию firecrawl). За два года Firecrawl превратился из нишевого инструмента для конвертации HTML в Markdown в полноценную платформу веб-данных с собственным AI-агентом, интеграциями с десятками фреймворков и поддержкой десяти языков программирования. По сути, Firecrawl стал тем, чем мечтал быть любой веб-скрейпер с 2010 года — но только сейчас, с ростом LLM, эта потребность стала критически важной для всей индустрии искусственного интеллекта.
Современные LLM-приложения — от RAG-систем до автономных агентов — требуют доступа к актуальной веб-информации. Традиционные поисковые API (Google, Bing) возвращают сниппеты, а не полный контент страниц. Firecrawl заполняет этот пробел: он не просто ищет, а извлекает и структурирует полный контент веб-страниц. В сочетании с собственным Agent-слоем (Spark-модели) он может автономно исследовать веб, находить нужные данные и возвращать их в заданной JSON-схеме — без необходимости писать XPath-селекторы или CSS-правила.
Firecrawl предлагает многоуровневую модель: Free — 500 кредитов в месяц, базовые эндпоинты (Scrape, Crawl, Map, Search); Hobby ($19/мес) — 3 000 кредитов, Batch Scrape, приоритетная очередь; Standard ($99/мес) — 25 000 кредитов, Agent, Interact, Webhooks; Growth ($299/мес) — 100 000 кредитов, ускоренная обработка; Enterprise — кастомные объёмы, on-premise, SSO, SLA. Self-hosted версия с открытым исходным кодом (AGPL-3.0) бесплатна при самостоятельном развёртывании — вы платите только за инфраструктуру (сервер + прокси). Ознакомиться с тарифами можно на странице стоимости Qantcore и оформить доступ через оплату.
Самый популярный способ интеграции — Python SDK, устанавливаемый через pip:
pip install firecrawl-py
npm install firecrawl
npm install -g firecrawl-cli # или через npx без установки npx -y firecrawl-cli@latest init --all --browser
Зарегистрируйтесь на firecrawl.dev, чтобы получить ключ формата fc-YOUR_API_KEY. Для self-hosted версии ключ не требуется — вы управляете авторизацией самостоятельно.
Базовый эндпоинт Scrape конвертирует любой URL в Markdown, структурированный JSON, скриншоты или сырой HTML. Поддерживает JavaScript-рендеринг (SPA-приложения), геолокацию пользователя, мобильный/десктопный user-agent, а также опциональное извлечение только основного контента страницы (с удалением навигации, футеров и рекламы).
from firecrawl import Firecrawl app = Firecrawl(api_key="fc-YOUR_API_KEY") # Простое извлечение в Markdown result = app.scrape("https://firecrawl.dev") print(result.markdown[:500]) # С дополнительными форматами doc = app.scrape( "https://example.com/blog", formats=["markdown", "html", "screenshot"], only_main_content=True, wait_for=5000 # ждать загрузки JS 5 секунд ) print(doc.metadata.title) print(doc.metadata.source_url) # Markdown контент страницы
curl -X POST 'https://api.firecrawl.dev/v2/scrape' \ -H 'Authorization: Bearer fc-YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{ "url": "https://firecrawl.dev", "formats": ["markdown", "json"], "onlyMainContent": true, "waitFor": 3000 }'
Crawl автоматически обходит все страницы сайта, следуя внутренним ссылкам. Вы задаёте стартовый URL и максимальное количество страниц, а Firecrawl асинхронно обходит сайт, извлекая контент с каждой страницы. Поддерживается настройка глубины обхода, фильтрация путей, исключение поддоменов и управление частотой запросов.
from firecrawl import Firecrawl app = Firecrawl(api_key="fc-YOUR_API_KEY") # SDK автоматически ждёт завершения краула docs = app.crawl( "https://docs.firecrawl.dev", limit=100, scrape_options={ "formats": ["markdown"], "only_main_content": True } ) for doc in docs.data: print(f"URL: {doc.metadata.source_url}") print(f"Title: {doc.metadata.title}") print(f"Content preview: {doc.markdown[:150]}") print("---")
Для больших сайтов можно использовать асинхронный режим с polling:
from firecrawl import Firecrawl import time app = Firecrawl(api_key="fc-YOUR_API_KEY") # Запускаем краул без ожидания job = app.crawl( "https://docs.firecrawl.dev", limit=500, wait_until_done=False ) print(f"Job ID: {job.id}") # Периодически проверяем статус while True: status = app.get_crawl_status(job.id) print(f"Completed: {status.completed}/{status.total}") if status.status == "completed": break time.sleep(5) print(f"Crawled {len(status.data)} pages")
Map мгновенно возвращает список всех страниц сайта (аналог sitemap, но не требует наличия sitemap.xml). Полезно для инвентаризации контента перед краулом или для SEO-аудита.
from firecrawl import Firecrawl app = Firecrawl(api_key="fc-YOUR_API_KEY") # Получаем все ссылки сайта result = app.map("https://firecrawl.dev") for link in result.links: print(f"{link.url} → {link.title}") # Map с поиском по ключевым словам result = app.map("https://firecrawl.dev", search="pricing") print(f"Found {len(result.links)} pages matching 'pricing'")
Search выполняет веб-поиск и сразу возвращает полный контент найденных страниц (не только сниппеты). Идеально для RAG-приложений: один запрос — и у вас готовый контекст для LLM.
from firecrawl import Firecrawl app = Firecrawl(api_key="fc-YOUR_API_KEY") # Поиск с полным контентом страниц results = app.search( "best AI scraping tools 2026", limit=10, formats=["markdown"] ) for r in results.data.web: print(f"## {r.title}") print(f"URL: {r.url}") print(f"Content: {r.markdown[:300]}") print("---")
Agent — это эволюция эндпоинта Extract, которая позволяет описывать задачи на естественном языке. Вы просто говорите, что нужно найти, а Firecrawl Agent автономно ищет, навигирует и извлекает данные. Модели spark-1-mini (быстрее, дешевле на 60%) и spark-1-pro (для сложных многосайтовых исследований). Поддерживается схематическое извлечение через Pydantic-модели.
from firecrawl import Firecrawl from pydantic import BaseModel, Field from typing import List, Optional app = Firecrawl(api_key="fc-YOUR_API_KEY") class PricingPlan(BaseModel): name: str = Field(description="Название тарифа") price: Optional[str] = Field(None, description="Цена") credits: Optional[str] = Field(None, description="Количество кредитов") features: List[str] = Field(default_factory=list) class PricingSchema(BaseModel): plans: List[PricingPlan] = Field(description="Тарифные планы") result = app.agent( prompt="Найди и сравни тарифные планы Firecrawl, Apify и ScrapingBee", schema=PricingSchema, model="spark-1-pro" # pro для мультисайтового сравнения ) for plan in result.data.plans: print(f"{plan.name}: {plan.price} — {', '.join(plan.features)}")
Эндпоинт Interact позволяет AI-агенту взаимодействовать со страницей: кликать кнопки, заполнять формы, скроллить, ждать элементы и нажимать клавиши перед извлечением данных — критично для сайтов с пагинацией, поисковыми формами и динамической подгрузкой контента.
from firecrawl import Firecrawl app = Firecrawl(api_key="fc-YOUR_API_KEY") # Шаг 1: скрейпим страницу result = app.scrape("https://amazon.com") scrape_id = result.metadata.scrape_id # Шаг 2: взаимодействуем — поиск app.interact(scrape_id, prompt="Search for 'mechanical keyboard'") # Шаг 3: кликаем первый результат app.interact(scrape_id, prompt="Click the first search result") # Шаг 4: извлекаем данные app.interact(scrape_id, prompt="Extract product name and price")
Firecrawl имеет нативные интеграции с ключевыми фреймворками для построения LLM-приложений. Это позволяет использовать его как документный загрузчик (Document Loader), поисковый инструмент (Tool) или компонент RAG-пайплайна.
from langchain_community.document_loaders import FireCrawlLoader from langchain_openai import ChatOpenAI from langchain.chains import RetrievalQA # Загружаем документацию через Firecrawl loader = FireCrawlLoader( url="https://docs.firecrawl.dev", api_key="fc-YOUR_API_KEY", mode="crawl" ) documents = loader.load() print(f"Loaded {len(documents)} documents") # Далее — стандартный RAG-пайплайн from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.vectorstores import FAISS from langchain_openai import OpenAIEmbeddings splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200 ) splits = splitter.split_documents(documents) vectorstore = FAISS.from_documents( splits, OpenAIEmbeddings() ) qa_chain = RetrievalQA.from_chain_type( llm=ChatOpenAI(model="gpt-4o"), retriever=vectorstore.as_retriever() ) answer = qa_chain.invoke("Как использовать Firecrawl Agent?") print(answer)
from llama_index.readers.web import FireCrawlWebReader from llama_index.core import VectorStoreIndex # Reader с поддержкой Crawl reader = FireCrawlWebReader( api_key="fc-YOUR_API_KEY", mode="crawl", params={ "limit": 50, "scrapeOptions": {"formats": ["markdown"]} } ) documents = reader.load_data(url="https://docs.firecrawl.dev") index = VectorStoreIndex.from_documents(documents) query_engine = index.as_query_engine() response = query_engine.query( "Какие форматы вывода поддерживает Firecrawl?" ) print(response)
Firecrawl предоставляет MCP-сервер для прямого подключения к AI-ассистентам (Claude Desktop, Cursor, Continue):
{
"mcpServers": {
"firecrawl-mcp": {
"command": "npx",
"args": ["-y", "firecrawl-mcp"],
"env": {
"FIRECRAWL_API_KEY": "fc-YOUR_API_KEY"
}
}
}
}
Благодаря лицензии AGPL-3.0 вы можете развернуть полноценный экземпляр Firecrawl на собственной инфраструктуре. Это особенно важно для компаний с требованиями к конфиденциальности данных, которые не могут отправлять URL во внешние сервисы. Self-hosted версия включает все эндпоинты (Scrape, Crawl, Map, Agent), но требует самостоятельного управления прокси-инфраструктурой.
# 1. Клонируем репозиторий git clone https://github.com/firecrawl/firecrawl.git cd firecrawl # 2. Запускаем все сервисы через Docker Compose docker compose -f docker-compose.self-hosted.yml up -d # 3. Проверяем работоспособность curl http://localhost:3002/v0/scrape \ -H 'Content-Type: application/json' \ -d '{"url": "https://example.com"}' # 4. Масштабируем воркеры при необходимости docker compose -f docker-compose.self-hosted.yml up -d --scale worker=4
Для production-развёртывания потребуется: PostgreSQL, Redis, Node.js 20+, а также настроенные прокси-сервисы для обхода блокировок. Официальная документация рекомендует использовать playbook из CONTRIBUTING.md. Важно: функции Agent (Spark-модели) в self-hosted версии требуют собственного OpenAI-ключа для LLM-извлечения.
Self-hosted вариант особенно привлекателен для компаний, работающих с конфиденциальными данными: финансовые организации, медицинские стартапы, юридические фирмы. Вы полностью контролируете, какие URL и с какими параметрами скрейпятся, а данные никогда не покидают ваш периметр. Кроме того, self-hosting экономически выгоден при объёмах свыше 500 000 страниц в месяц — затраты на серверную инфраструктуру оказываются ниже, чем оплата облачных кредитов Firecrawl. Типичная конфигурация для 1 миллиона страниц в месяц: сервер с 8 vCPU, 32 GB RAM и пулом из 50 резидентных прокси — обходится примерно в $200-400/мес на AWS или Hetzner против $2 500+/мес на облачном Growth-тарифе (при масштабировании).
Batch Scrape позволяет отправлять до нескольких тысяч URL в одном запросе и получать результаты асинхронно. Это критически важно для сценариев вроде мониторинга конкурентов, агрегации новостей или сбора данных о товарах из сотен интернет-магазинов. В отличие от Crawl, Batch Scrape работает с явно заданным списком URL и не следует внутренним ссылкам.
from firecrawl import Firecrawl app = Firecrawl(api_key="fc-YOUR_API_KEY") # Отправляем сотни URL одним запросом urls = [ f"https://example.com/products/{i}" for i in range(1, 501) ] job = app.batch_scrape( urls, formats=["markdown", "json"], only_main_content=True ) print(f"Batch job {job.id} completed: {len(job.data)} pages") # Анализируем результаты success_count = sum(1 for d in job.data if d.markdown) print(f"Successfully scraped: {success_count}/{len(urls)}")
| Характеристика | Firecrawl | Apify | ScraperAPI | Browse AI | Playwright |
|---|---|---|---|---|---|
| LLM-ready вывод | ✅ Markdown/JSON | ◐ Через Actors | ✗ HTML | ◐ Структурир. | ✗ Сырой HTML |
| Open Source | ✅ AGPL-3.0 | ✅ Apache 2.0 | ✗ Проприетарный | ✗ Проприетарный | ✅ Apache 2.0 |
| JS-рендеринг | ✅ Playwright | ✅ Puppeteer/Playwright | ✅ Headless | ✅ Встроенный | ✅ Нативный |
| AI Agent (автономный сбор) | ✅ spark-1-mini/pro | ✗ | ✗ | ✗ | ✗ |
| Crawl целых сайтов | ✅ Async polling | ✅ Actors | ◐ Ограниченный | ✅ Scheduled | ✗ Только вручную |
| SDK | ✅ 10 языков | ✅ JS, Python | ◐ 5 языков | ✗ REST only | ✅ 4 языка |
| MCP-интеграция | ✅ Нативная | ✗ | ✗ | ✗ | ✗ |
| Self-hosting | ✅ Docker | ✅ Docker | ✗ Cloud only | ✗ Cloud only | ✅ (библиотека) |
| Стоимость | Free → $299/мес | Free → $999/мес | $49 → $999/мес | $48 → $499/мес | Бесплатно |
| GitHub Stars | 161 885 | 14 500 | N/A | N/A | 71 000 |
| Тариф | Цена | Кредиты/мес | Ключевые возможности |
|---|---|---|---|
| Free | $0 | 500 | Scrape, Crawl, Map, Search |
| Hobby | $19 | 3 000 | + Batch Scrape, Priority Queue |
| Standard | $99 | 25 000 | + Agent, Interact, Webhooks |
| Growth | $299 | 100 000 | + Fast Processing, More Concurrency |
| Enterprise | Кастом | ∞ | On-premise, SSO, SLA, Custom Models |
💡 1 кредит ≈ 1 страница скрейпинга. Crawl и Agent расходуют кредиты пропорционально количеству обработанных страниц. Self-hosted версия — безлимитно (вы платите только за свою инфраструктуру). Подробнее о возможностях — на странице стоимости Qantcore. Готовы начать? Переходите к оплате.
При промышленном использовании Firecrawl важно правильно обрабатывать ошибки: сетевые таймауты, rate limits, блокировки со стороны целевых сайтов. Python SDK предоставляет исчерпывающую иерархию исключений.
from firecrawl import Firecrawl from firecrawl.exceptions import ( FirecrawlError, RateLimitError, TimeoutError ) import time app = Firecrawl(api_key="fc-YOUR_API_KEY") def safe_scrape(url: str, max_retries: int = 3) -> dict: for attempt in range(max_retries): try: return app.scrape(url, formats=["markdown"]) except RateLimitError as e: wait = min(2 ** attempt, 30) print(f"Rate limited, waiting {wait}s...") time.sleep(wait) except TimeoutError: print(f"Timeout on {url}, retrying...") time.sleep(1) except FirecrawlError as e: print(f"Firecrawl error: {e}") return None print(f"Failed after {max_retries} retries") return None # Продвинутая техника: asyncio + Semaphore для массового скрейпинга import asyncio from firecrawl import AsyncFirecrawl async def scrape_with_semaphore(urls: list, concurrency: int = 5): sem = asyncio.Semaphore(concurrency) app = AsyncFirecrawl(api_key="fc-YOUR_API_KEY") async def safe_fetch(url): async with sem: try: result = await app.scrape(url) return (url, result.markdown) except Exception as e: return (url, None) tasks = [safe_fetch(u) for u in urls] return await asyncio.gather(*tasks) # Использование urls = [ "https://example.com", "https://docs.firecrawl.dev", "https://invalid-url-that-will-fail.xyz" ] for url in urls: data = safe_scrape(url) if data: print(f"✓ {url}: {len(data.markdown)} chars") else: print(f"✗ {url}: failed")
Полный пример построения Retrieval-Augmented Generation пайплайна: Firecrawl извлекает контент с сайта → эмбеддинги → векторная база данных → LLM отвечает на вопросы на основе актуального веб-контента.
from firecrawl import Firecrawl from openai import OpenAI from chromadb import PersistentClient import numpy as np # 1. Скрейпинг + Crawl документации fc = Firecrawl(api_key="fc-YOUR_API_KEY") docs = fc.crawl( "https://docs.firecrawl.dev", limit=50, scrape_options={ "formats": ["markdown"] } ) # 2. Эмбеддинги через OpenAI openai_client = OpenAI() chroma = PersistentClient(path="./chroma_db") collection = chroma.get_or_create_collection("docs_firecrawl") for i, doc in enumerate(docs.data): embedding = openai_client.embeddings.create( model="text-embedding-3-small", input=doc.markdown[:8000] ).data[0].embedding collection.add( ids=[f"doc_{i}"], embeddings=[embedding], documents=[doc.markdown[:1000]], metadatas=[{ "url": doc.metadata.source_url, "title": doc.metadata.title }] ) print(f"Indexed {len(docs.data)} documents") # 3. Поиск + генерация ответа def rag_query(question: str) -> str: q_embedding = openai_client.embeddings.create( model="text-embedding-3-small", input=question ).data[0].embedding results = collection.query( query_embeddings=[q_embedding], n_results=3 ) context = "\n\n".join(results['documents'][0]) response = openai_client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": "Отвечай на основе контекста."}, {"role": "user", "content": f"Контекст:\n{context}\n\nВопрос: {question}"} ] ) return response.choices[0].message.content answer = rag_query("Как использовать Batch Scrape в Firecrawl?") print(answer)
Рекомендация Qantcore: ★★★★★ (9.2/10) — Firecrawl на голову выше всех аналогов по ключевой метрике: качество LLM-готового вывода. Ни один другой сервис не даёт настолько чистый Markdown «из коробки» с правильной обработкой JavaScript-страниц. 161 000 звёзд на GitHub, 10 SDK, self-hosted версия и нативный AI Agent (Spark-модели) делают его безальтернативным выбором для RAG-пайплайнов, AI-агентов и любых приложений, которым нужен структурированный доступ к веб-контенту. Firecrawl — это именно то, что мы рекомендуем в каталоге Qantcore для серьёзной работы с веб-данными.
Главные преимущества:
Недостатки:
Разработчики AI-агентов: если вы строите агента на LangChain/CrewAI, Firecrawl — лучший способ дать ему глаза в интернете. RAG-разработчики: для индексации документации, блогов и новостных сайтов альтернатив нет. Стартапы: Free-тир с 500 кредитами позволяет прототипировать без затрат. Enterprise: on-premise развёртывание через Docker удовлетворяет требования compliance.
Для кого НЕ подходит: Маркетологи без технического бэкграунда (лучше Browse AI с визуальным конструктором); задачи с экстремальными объёмами (100M+ страниц в месяц — дешевле построить свой кластер на Scrapy+Playwright); проекты, требующие безлимитного коммерческого использования без копилефта (тогда только cloud-тарифы Firecrawl, не self-hosted).
Firecrawl продолжает агрессивно развиваться: команда активно итерирует API (уже v2), расширяет список SDK (Elixir и PHP добавлены в 2026), улучшает Spark-модели для Agent. Направление движения — стать стандартным слоем «веб-контекста» для всей AI-экосистемы, подобно тому как Stripe стал стандартом для платежей. Мы в Qantcore ожидаем, что к концу 2026 года Firecrawl преодолеет отметку в 200 000 звёзд и станет дефолтным выбором для любого RAG-приложения.
Бесплатный тир: 500 кредитов/мес. Подключите AI-агента к вебу за 5 минут.
Подпишитесь на наш Telegram-канал для новостей о лучших AI-инструментах.
pip install firecrawl-py — установка Python SDK за 10 секунд
Нужна помощь с выбором тарифа? Посетите страницу оплаты Qantcore или сравнение стоимости.