Практическая методология, как собрать данные с десятков, сотен и тысяч сайтов конкурентов, привести их в порядок и подать в Codex (или любому другому агенту) так, чтобы он фактически с ними работал, а не захлёбывался в мусоре. Это не обзор одного сервиса — это карта всего конвейера и развилок на каждом шаге.
Главная мысль: парсинг — это не цель, а первый шаг конвейера «собрать → очистить → сохранить → подать агенту». Слабое звено на любом этапе обнуляет результат. Чистый агент на грязных данных всё равно врёт.
Что это
Конвейер конкурентной разведки для ИИ-агента — пять звеньев: список доменов → сбор данных → очистка и схема → хранилище → подача в Codex через AGENTS.md или RAG. На каждом шаге своя развилка: что именно собирать, какой сервис использовать, как нормализовать результат и в каком виде отдать агенту.
Пара базовых понятий:
- Скрапинг (scrape) — забрать одну конкретную страницу по URL.
- Краулинг (crawl) — обойти весь сайт по ссылкам и собрать все страницы разом. Для конкурентной разведки почти всегда нужен именно краулинг.
Зачем нужно
- Сравнить цены и тарифы 50–200 конкурентов без ручного открывания каждого сайта.
- Собрать каталог фич и позиционирование для маркетингового анализа.
- Найти общие паттерны в отрасли — какие блоки есть на лендингах, какие аргументы используют, какие кейсы показывают.
- Следить за изменениями: цены, офферы, новые фичи — по расписанию, без ручного мониторинга.
- Подать собранный датасет в Codex как контекст: агент отвечает на вопросы по конкурентам со ссылками на источник.
Как устроено
Конвейер выглядит так:
flowchart LR
A["Список доменов
конкурентов"] --> B{"Нужен весь сайт
или точечные факты?"}
B -->|"Точечные ответы"| C["Search API
Tavily / Brave"]
B -->|"Контент страниц"| D["Краулинг и парсинг
Firecrawl / ZenRows / Scrapy"]
C --> E["Очистка и структура
Markdown + JSON по схеме"]
D --> E
E --> F["Хранилище
файлы / БД / эмбеддинги"]
F --> G["Подача в Codex
AGENTS.md + RAG"]
Шаг 1. Нужен ли вообще парсинг
Самая частая ошибка — кидаться краулить сайты, когда задача решается дешевле. Развилка по типу задачи:
- Нужны точечные факты («какая цена на тарифе Pro у 50 конкурентов») — начните с поискового API: Tavily, Brave Search API, Parallel. Сервис возвращает уже найденный и очищенный контент без обхода всего сайта.
- Нужен весь контент страниц (полные описания, документация, блоги, структура каталога) — тогда краулинг через Firecrawl, ZenRows или собственный Scrapy.
- Нужны соцсети — это отдельная история со своими API и ограничениями, обычный краулинг там не работает.
Развилка по масштабу:
| Масштаб | Чем брать | Почему |
|---|---|---|
| 10 сайтов | Managed API (Firecrawl, ZenRows) или ручной экспорт | Настройка своей инфраструктуры дороже, чем сами данные |
| 100 сайтов | Managed API + очередь и схема данных | Нужна автоматизация и нормализация, но не свои прокси |
| 1000+ сайтов | Managed API на объёме или собственный Scrapy + прокси | На больших объёмах считайте цену за страницу |
Шаг 2. Какой инструмент выбрать
Нет «лучшего» сервиса — есть подходящий под тип сайтов, масштаб и ваш уровень контроля.
- Firecrawl — managed API, который забирает контент целого сайта одной командой и сразу отдаёт его в LLM-ready виде. Берите, когда нужно быстро получить чистый Markdown или JSON по всему сайту и не хочется возиться с инфраструктурой: его эндпоинт /v2/extract умеет вытаскивать поля по вашей JSON Schema прямо в ответе.
- ZenRows — тоже managed API, заточенный под сайты с жёсткой антибот-защитой (Cloudflare, DataDome и подобные). Его сильная сторона — высокий процент успешных запросов и оплата по сути за результат (платите только за успешные запросы; 404 и 410 считаются успехом), поэтому он выручает там, где обычные парсеры упираются в капчи и блокировки. Важный нюанс по цене: базовый запрос дешёвый, но JS-рендеринг умножает стоимость ×5, premium-прокси — ×10, а оба режима вместе — ×25, причём на хорошо защищённых сайтах сервис может включать их сам. Поэтому реальную цену на защищённых доменах считайте с учётом множителей.
- Tavily / Brave Search API — это поисковые API, а не краулеры. Выбирайте их, когда нужны конкретные ответы и факты, а не весь сайт: они находят и извлекают релевантный контент без обхода всех страниц, что заметно дешевле и быстрее для точечных вопросов.
- Scrapy — self-hosted фреймворк на Python (async-движок, CSS/XPath-селекторы, item-pipelines, экспорт в JSON/CSV/S3) для тех, кому нужно собрать тысячи сайтов с полным контролем и минимальной ценой за страницу. Это зрелый инструмент под крупные краулы, но взамен вы сами держите прокси, ротацию IP и обработку ошибок.
- Playwright / Puppeteer — браузерная автоматизация для сложных случаев: SPA на React/Vue, авторизация, клики и многошаговые сценарии. Даёт полный рендеринг страницы и контроль над поведением, но требует больше кода и ресурсов на каждый сайт.
- Apify — платформа с маркетплейсом готовых акторов (скраперов). Удобна, когда нужны соцсети и нишевые источники: часто под нужный сайт уже есть готовое решение, которое не придётся писать с нуля.
Trade-off: managed API экономят месяцы возни с прокси и капчами, но на больших объёмах дороже. Self-hosted дешевле за страницу, но вы сами держите прокси, ротацию IP и обход защит. Граница окупаемости зависит от защиты сайтов и доли premium-прокси — ориентировочно это десятки–сотни тысяч страниц, но точную точку считайте на своих данных.
Грубые цифры (на 2026 год, для прикидки):
- Поисковые API: Parallel — Search API $0.005 за 10 результатов, Extract API $0.001 за запрос; 16 000 запросов бесплатно на старте. Tavily — бесплатный тариф на 1 000 кредитов в месяц, Pay-As-You-Go $0.008/кредит. Brave Search API — $5 бесплатных кредитов в месяц, 50 запросов/сек, 30+ млрд страниц в индексе.
- Firecrawl: есть бесплатный тариф на пробу, платные планы помесячно за объём запросов.
- ZenRows: подписка с балансом (от ~$69/мес), деньги списываются только за успешные запросы по тарифу с множителями (см. выше).
- Self-hosted (Scrapy + прокси): сам фреймворк бесплатный (BSD-лицензия), основная статья расходов — резидентные прокси (порядка нескольких $ за ГБ трафика).
Цены ориентировочные и быстро меняются — перед запуском проверяйте актуальные цифры на сайтах вендоров.
Шаг 3. Антибот, лимиты и легальность
Этот шаг чаще всего ломает наивные парсеры.
- Антибот-защита. Cloudflare, DataDome, reCAPTCHA блокируют обычные скрипты после нескольких запросов. Либо берите сервис, который обходит это сам (ZenRows, Firecrawl), либо стройте свою ротацию резидентных прокси.
- Rate limiting. Не бейте по сайту в сотню потоков. Ставьте задержки и лимит параллельных запросов на домен — иначе бан и испорченный датасет.
- JavaScript-сайты. React/Vue/Angular отдают пустую болванку обычному парсеру. Нужен рендеринг страницы (браузер или сервис с JS-рендером).
- Правовые рамки. Перед сбором проверьте robots.txt и Terms of Service источника. Парсинг публичных данных в большинстве случаев допустим, но коммерческое использование, обход защит и сбор персональных данных могут нарушать правила и закон. На больших проектах согласуйте подход с юристом.
- Особенности для РФ. Если среди собранных данных есть персональные (имена, контакты, профили сотрудников), их обработка попадает под 152-ФЗ «О персональных данных»: нужны законное основание обработки, а в ряде случаев — хранение данных россиян на серверах в РФ. Публичная доступность данных на сайте не делает их свободными для любой обработки. Сбор агрегированных неперсональных данных (цены, фичи, позиционирование) обычно безопаснее, чем персональных, но при сомнениях согласуйте подход с юристом.
Шаг 4. Очистка и структурирование
Сырой HTML или даже Markdown — это ещё не данные. Агенту нужна структура.
- Markdown как промежуточный формат. Чистый Markdown без скриптов и навигации — то, что хорошо переваривают модели. Managed API отдают его из коробки.
- JSON по схеме — главный результат. Не храните «простыни текста». Извлекайте поля по заранее заданной схеме, одинаковой для всех сайтов. Тогда данные сравнимы между собой.
- OCR для PDF и картинок. Если у конкурентов цены или условия лежат в PDF — прогоните их через OCR, иначе потеряете эту часть.
- Дедупликация. Один и тот же контент часто приходит с разных URL. Считайте хэш контента и схлопывайте дубли, иначе агент будет «голосовать» повторами.
Пример единой схемы извлечения, в которую складывается каждый сайт:
{
"company": "string",
"source_url": "string",
"positioning": "string",
"pricing_plans": [
{ "name": "string", "price": "string", "features": ["string"] }
],
"key_features": ["string"],
"target_audience": "string",
"collected_at": "2026-07-02"
}
Совет: задайте схему один раз и заставляйте сервис извлечения (например, Firecrawl Extract) возвращать строго её. Так вы получите таблицу сравнимых карточек, а не сотни разнородных текстов.
Шаг 5. Где хранить данные
Хранилище выбирается по объёму и тому, как вы будете запрашивать данные.
| Объём и задача | Хранилище | Когда подходит |
|---|---|---|
| До сотен карточек, отдаём агенту целиком | Файлы (Markdown + JSON в репозитории) | Codex читает папку напрямую, версионирование через git |
| Тысячи строк, нужны фильтры и агрегаты | БД (Supabase, ClickHouse) | Сравнение цен, аналитика, выборки по полям |
| Нужен семантический поиск по контенту | Эмбеддинги (BGE-M3, EmbeddingGemma) + векторная БД | RAG: агент ищет смысл, а не точное слово |
| Поиск связей без LLM | TF-IDF / semantic snapshot | Дёшево и быстро, когда эмбеддинги избыточны |
Шаг 6. Как подать данные в Codex
Цель — чтобы агент работал с данными уверенно и не выдумывал.
- Markdown + AGENTS.md. Положите данные в репозиторий и опишите в AGENTS.md, где что лежит и как с этим работать. Это самый надёжный способ для Codex.
- Чанкинг. Большие файлы режьте на смысловые куски (по одному сайту/разделу на файл), а не один файл на 5 МБ.
- RAG для больших объёмов. Если данных тысячи карточек — не суйте всё в контекст. Поднимите векторный поиск и подавайте агенту только релевантное.
- Skills. Повторяемую логику работы с датасетом оформите как навык, чтобы не объяснять её каждый раз.
Пример AGENTS.md для датасета конкурентов:
# Датасет: конкуренты
## Структура
- structured/ — JSON-карточки конкурентов по единой схеме (competitor.schema.json)
- raw/ — исходные markdown-страницы, если нужен контекст
- index.md — оглавление: домен → файл
## Правила
- Отвечай только на основе файлов в structured/.
- Если данных по полю нет — пиши "нет данных", не выдумывай.
- При сравнении цен всегда указывай source_url.
Шаг 7. Масштаб и регулярность
Одноразовый сбор и постоянный мониторинг — разные задачи.
- Очереди и фоновые задачи. На сотнях сайтов гоняйте сбор через очередь с ретраями, а не одним скриптом, который падает на 50-м домене.
- Инкрементальный краулинг. Не пересобирайте всё каждый раз — забирайте только изменившиеся страницы.
- Расписание. Цены и офферы меняются: поставьте регулярный прогон (cron, systemd timer) и сравнивайте срезы во времени.
- Оркестрация без кода. Для связки «собрал → очистил → положил → уведомил» удобно использовать n8n или Composio.
Когда использовать
- Маркетинговая разведка: цены, фичи, позиционирование, таргетинг 50–500 конкурентов в одной нише.
- Мониторинг изменений: раз в неделю/день обходить сайты конкурентов и подсвечивать новые фичи или изменённые тарифы.
- Наполнение каталога для агента: подать в Codex датасет конкурентов, чтобы он отвечал на вопросы «у кого из конкурентов есть X?» со ссылками на источник.
- Подготовка к запуску продукта: за месяц до релиза собрать лендинги конкурентов и анализировать, какие блоки работают в нише.
- Аудит собственного сайта: сравнить свой контент с конкурентами и найти, чего не хватает.
Не используйте этот конвейер, если:
- Задача решается одним поисковым запросом — не стройте инфраструктуру, используйте Tavily или Brave напрямую.
- Нужны только 1–3 сайта — хватит ручного экспорта.
- Данные нужны разово и в малом объёме — проще открыть сайты руками.
- Бизнесу нужна юридическая чистота — обсудите с юристом до запуска, особенно если собираете персональные данные.
Пример
Эталонный сценарий: 200 сайтов конкурентов → датасет для Codex.
- Собрать список доменов в domains.txt — по одному на строку.
- Краулить каждый домен через managed API с извлечением по схеме. Блок ниже — условный псевдокод для иллюстрации логики, а не реальные команды CLI: точный синтаксис смотрите в документации выбранного сервиса.
# псевдо-пайплайн: на каждый домен — crawl + extract по схеме
while read domain; do
firecrawl crawl "$domain" \
--extract-schema competitor.schema.json \
--formats markdown,json \
--output "raw/${domain}"
done < domains.txt
- Нормализовать результаты в единый вид и сложить в structured/
.json по единой схеме. - Дедуплицировать по хэшу контента и собрать index.md (домен → файл).
- Разложить в репозиторий с понятной структурой:
competitors-dataset/
raw/ # сырой markdown по каждому сайту
structured/ # JSON по единой схеме
competitor.schema.json # схема данных
index.md # оглавление: домен → файл
AGENTS.md # инструкция агенту
- Подключить Codex к репозиторию: агент читает AGENTS.md, работает с structured/ и ссылается на source_url.
- Поставить на расписание инкрементальное обновление и сравнение срезов.
Итог: на выходе у вас не «куча текста с сайтов», а структурированный, дедуплицированный и описанный датасет, по которому агент даёт проверяемые ответы со ссылками на источник.
Ограничения
Ограничения
Цена растёт на защищённых сайтах — у ZenRows JS-рендер ×5, premium-прокси ×10, оба режима ×25.
На Cloudflare-защищённых доменах реальная стоимость запроса в разы выше базовой.
Managed API упёрся в лимиты — у Parallel 600 req/min на Search, 25/час на Find All, 16 000 бесплатных запросов Pay-as-you-go.
На пиковых сборках быстро упираетесь в потолок.
Self-hosted требует инфраструктуры — резидентные прокси, ротация IP, обработка капч.
Scrapy бесплатный, но эксплуатационные расходы могут перекрыть экономию на managed API.
Парсинг персональных данных в РФ
если среди собранных данных есть имена, контакты или профили сотрудников, обработка попадает под 152-ФЗ и может потребовать хранение на серверах в РФ.
Цены меняются быстро — все тарифы, указанные в материале, ориентировочные.
Перед запуском проверяйте актуальные цифры на сайтах вендоров.
JavaScript-сайты — React/Vue/Angular отдают пустую болванку обычному парсеру.
Без браузерного рендера или сервиса с JS-рендером данные будут неполными.
Объём контекста LLM ограничен — даже при чанкинге тысячи карточек в один файл не влезут.
Для больших датасетов нужен RAG, а не «прочитать всё разом».
Антипаттерны
Антипаттерны
Краулить всё подряд без схемы данных
получите терабайты мусора, который агент не переварит и не сможет сравнивать между конкурентами.
Игнорировать антибот и бить в сотню потоков
бан, капчи, битые страницы, испорченный датасет.
Скидывать сырой HTML агенту
теги и скрипты съедают контекст и качество ответов падает.
Забыть про дедуп
повторы искажают любые сравнения и агрегаты, агент «голосует» одной и той же выдержкой несколько раз.
Совать весь датасет в контекст вместо RAG
когда данных тысячи карточек, контекстное окно закончится, агент начнёт выдумывать или пропускать.
Собрать один раз и считать данные актуальными через полгода
цены и офферы у конкурентов меняются еженедельно, одноразовый сбор быстро устаревает.
Игнорировать robots.txt и ToS
в лучшем случае получите бан, в худшем — юридические проблемы.
Использовать выдуманные CLI-флаги — реальные эндпоинты сервисов (например, POST /v2/extract у Firecrawl) принимают JSON в теле запроса, а не флаги —extract-schema.
Сверяйтесь с документацией вендора, прежде чем копировать псевдокод из чужих туториалов.
Чеклист
Чеклист
Цель сформулирована
понятно, какие именно данные нужны (цены, фичи, позиционирование, контакты), а не «всё подряд».
Тип задачи определён
решено, нужен весь сайт или достаточно поисковой выдачи по конкретным вопросам.
Масштаб оценён
10, 100 или 1000+ сайтов; от этого зависит выбор инструмента.
Антибот-защита изучена
выбран инструмент под конкретную защиту целевых сайтов.
Схема данных задана
JSON-схема, в которую складываются результаты, одинаковая для всех сайтов.
Дедупликация и обработка ошибок продуманы
что делаем с битыми страницами и пустыми ответами.
Хранилище выбрано
файлы, БД или эмбеддинги под итоговый объём данных.
Способ подачи в Codex определён
файлы + AGENTS.md или RAG, понятно, как агент получит данные.
Правовые рамки проверены
robots.txt и ToS источников прочитаны, при необходимости — согласовано с юристом.
Бюджет заложен
посчитан на запросы и регулярное обновление, не только на разовый сбор.
Ссылки
Ссылки
- Документация: Firecrawl Extract API
- Документация: Parallel API pricing
- Документация: Tavily pricing
- Документация: Brave Search API
- Сайт: Scrapy — open source web scraping framework for Python
- Сайт: ZenRows — Universal Scraper API