Структурированные данные из любого сайта для LLM: разбор Lightfeed Extractor
Lightfeed Extractor — open source TypeScript-библиотека, которая превращает веб-страницы в валидированные структурированные данные для LLM. Разбираю архитектуру, ключевые фичи и практические сценарии использования.
Проблема: почему обычные парсеры не справляются
Каждый, кто строил пайплайны для извлечения данных с веб-сайтов, знает боль. Написал парсер под конкретную вёрстку — сайт обновился, парсер сломался. Добавил обработку краевых случаев — появились новые. Попробовал регулярки для динамического контента — получил хрупкий код, который разваливается при первом изменении CSS-класса.
LLM казались логичным решением: скорми HTML модели, попроси вернуть JSON. На практике всё сложнее. HTML-страница — это килобайты навигации, футеров и рекламных блоков. Токены сжигаются впустую. LLM возвращает невалидный JSON. Один битый элемент в массиве ломает всю структуру.
Lightfeed Extractor решает именно этот набор проблем — и делает это элегантно.
Что такое Lightfeed Extractor
Lightfeed Extractor — open source TypeScript-библиотека (github.com/lightfeed/extractor), которая закрывает полный пайплайн от URL до валидированных структурированных данных. Вышла из продакшн-использования команды Lightfeed и попала на главную страницу Hacker News.
Установка: npm install @lightfeed/extractor. Плюс LLM-провайдер на выбор — OpenAI, Google Gemini, Anthropic Claude или Ollama для локальных моделей. Всё через LangChain-совместимый интерфейс.
Архитектура: пять слоёв надёжности
1. HTML → LLM-ready Markdown
Первый этап — конвертация HTML в чистый Markdown. Библиотека вырезает навигацию, хедеры, футеры и рекламу, оставляя основной контент. Опционально сохраняет изображения. Чистит URL от трекинговых параметров.
Вместо 50 КБ сырого HTML модель получает 5 КБ чистого текста — критично для экономии токенов.
2. LLM-экстракция через Zod-схемы
Ядро библиотеки — функция extract(). Определяешь Zod-схему того, что хочешь получить, и передаёшь вместе с контентом. Zod-схема одновременно служит и описанием данных для LLM (через .describe()), и валидатором результата. Типобезопасность на входе и выходе.
3. Восстановление битого JSON
Главная техническая находка — safeSanitizedParser. LLM не всегда генерируют идеальный JSON. Один невалидный элемент массива обычно роняет весь парсинг.
safeSanitizedParser восстанавливает частичные данные: удаляет невалидные элементы из вложенных массивов, подставляет null для необязательных полей, спасает всё, что можно спасти. Вместо ошибки «invalid JSON» получаешь 95% данных.
Для продакшн-пайплайнов это разница между «упало на третьей странице из тысячи» и «обработало все тысячу с минимальными потерями».
4. Валидация и нормализация URL
Отдельный слой обрабатывает URL: разрешает относительные ссылки относительно sourceUrl, удаляет невалидные, чинит Markdown-экранированные ссылки.
5. Автоматизация браузера через Playwright
Встроенная интеграция с Playwright закрывает проблему JavaScript-рендеринга и SPA. Три режима работы: Local (обычный Playwright), Serverless (для облачных функций), Remote (подключение к удалённому браузеру). Встроенные anti-bot патчи и поддержка прокси.
Практический сценарий
Полный пайплайн — скрапинг каталога товаров. Определяешь Zod-схему с полями name, brand, price, rating, productUrl, imageUrl. Инициализируешь браузер Playwright, переходишь на страницу. Вызываешь extract() с LLM, HTML-контентом и схемой. На выходе — типизированный массив продуктов. Не регулярки, не CSS-селекторы. Схема описывает что нужно, LLM находит это в контенте.
AI-навигация + экстракция
Для сложных сценариев (поиск товара, пагинация, попапы) работает связка с @lightfeed/browser-agent. Метод page.ai() принимает инструкцию на естественном языке: «Search for organic coffee and go to the second page». Никаких селекторов, никаких хрупких скриптов.
Сравнение с альтернативами
llm-scraper — похожая концепция, но без восстановления битого JSON, без встроенной очистки HTML и без AI-навигации.
Python-скраперы (Scrapy, BeautifulSoup + LLM) — требуют ручной настройки каждого этапа. Lightfeed Extractor даёт цельный пайплайн из коробки.
Коммерческие API (Diffbot, ScrapingBee) — закрытые, платные, привязка к провайдеру. Lightfeed Extractor — MIT-лицензия, любой LLM-провайдер.
Когда это реально полезно
- Мониторинг цен конкурентов — схема один раз, работает на разных сайтах
- Сбор датасетов для RAG — структурированные данные из произвольных источников
- Агрегация контента — новости, обзоры, каталоги без привязки к вёрстке
- Миграция данных — перенос контента между платформами
Ограничения
LLM-экстракция не бесплатна: каждая страница — запрос к модели. Для Gemini 2.5 Flash это копейки, для GPT-4o — ощутимо на масштабе. Скорость ниже, чем у детерминированных парсеров. Для real-time сценариев с миллисекундными SLA не подходит. Для пакетной обработки — отлично.
Итог
Lightfeed Extractor — зрелая, продакшн-проверенная библиотека, которая закрывает полный цикл веб-экстракции для LLM. Восстановление битого JSON, очистка HTML, валидация URL, автоматизация браузера и AI-навигация — всё в одном пакете.
Если вы строите пайплайны извлечения данных на TypeScript и устали чинить парсеры каждую неделю — Lightfeed Extractor стоит попробовать.