TL;DR
Firecrawl — это мощный API для конвертации веб-страниц в структурированные данные (Markdown или JSON), готовые для обработки языковыми моделями. Инструмент решает проблему неструктурированного веб-контента, предоставляя разработчикам clean data для AI-приложений.
Введение: контекст и актуальность
В эпоху LLM (Large Language Models) и RAG (Retrieval-Augmented Generation) доступ к структурированным веб-данным становится критически важным. Традиционные методы парсинга (puppeteer, cheerio) требуют кастомных решений для каждого сайта и часто ломаются при изменениях верстки. Firecrawl предлагает унифицированный API, который абстрагирует эти сложности.
Основная часть: работа с Firecrawl API
Базовый пример использования
import { FirecrawlApp } from '@firecrawl/firecrawl-js';
const app = new FirecrawlApp({ apiKey: 'YOUR_API_KEY' });
// Scrape single URL
const scrapedData = await app.scrapeUrl('https://example.com', {
pageOptions: {
includeMarkdown: true,
excludeImages: true
}
});
console.log(scrapedData.markdown);
Продвинутые сценарии
- Рекурсивный краулинг:
const crawlResult = await app.crawlUrl('https://example.com/blog', {
crawlerOptions: {
maxDepth: 2,
limit: 50
},
pageOptions: {
onlyMainContent: true
}
});
// Process all pages
for await (const page of crawlResult) {
storeToVectorDB(page.content, page.metadata);
}
- Кастомизация вывода:
const customExtraction = await app.scrapeUrl('https://shop.example.com', {
extractorOptions: {
mode: 'llm-extraction',
extractionSchema: {
product: 'string',
price: 'number',
description: 'string | null'
}
}
});
Практическое применение в production
Интеграция с AI-стеком
// Пример RAG pipeline с Firecrawl + OpenAI
async function generateAnswer(question: string, url: string) {
const { markdown } = await app.scrapeUrl(url);
const context = await embedText(markdown);
const relevantChunks = retrieveFromVectorDB(question, context);
return openai.chat.completions.create({
model: 'gpt-4-turbo',
messages: [
{ role: 'system', content: 'Answer using provided context' },
{ role: 'user', content: `${question}\n\nContext: ${relevantChunks}` }
]
});
}
Оптимизация для production
- Кеширование результатов:
const cachedScrape = async (url: string) => {
const cacheKey = `firecrawl:${url}`;
const cached = await redis.get(cacheKey);
if (cached) return JSON.parse(cached);
const freshData = await app.scrapeUrl(url);
await redis.setex(cacheKey, 3600, JSON.stringify(freshData));
return freshData;
};
- Обработка ошибок и retry logic:
const resilientScrape = async (url: string, retries = 3) => {
try {
return await app.scrapeUrl(url);
} catch (error) {
if (retries > 0 && error.statusCode !== 404) {
await new Promise(res => setTimeout(res, 1000 * (4 - retries)));
return resilientScrape(url, retries - 1);
}
throw error;
}
};
Заключение
Firecrawl устраняет ключевое bottleneck в AI-разработке — преобразование неструктурированного веб-контента в machine-readable формат. Для senior разработчиков инструмент предлагает:
- Избавление от boilerplate кода парсеров
- Готовую инфраструктуру для масштабирования
- Интеграцию с современным AI-стеком
При всех преимуществах, важно учитывать лимиты API и юридические аспекты веб-скрапинга. Для enterprise-решений стоит рассмотреть self-hosted вариант или проконсультироваться с legal team.
Источник: https://github.com/firecrawl/firecrawl