Сбор данных с сайта без API: как это делается на практике
Нужны цены конкурента, остатки поставщика или карточки из каталога — а публичного API у сайта нет и не будет. Разбираем, что в этой ситуации реально работает, где сбор чаще всего ломается и что делать с данными после того, как они собраны.
Сначала убедитесь, что API действительно нет
«Нет API» в половине случаев означает «нет документации». Сам сайт почти всегда получает данные не из HTML, а из внутренних запросов — и их видно в браузере. Откройте инструменты разработчика, вкладку «Сеть», фильтр XHR/Fetch, и пролистайте страницу или переключите фильтр. Если в ответах приходит JSON с ценами и характеристиками — это и есть готовый источник, куда более стабильный, чем разбор вёрстки.
Что стоит проверить до того, как писать сбор с нуля:
- внутренние JSON-запросы каталога, поиска и карточки товара;
sitemap.xmlиrobots.txt— там часто лежит полный список URL;- товарные фиды для маркетплейсов и рекламы: YML, CSV, XML-выгрузки;
- мобильное приложение — у него бывает свой, более простой API;
- личный кабинет партнёра или оптовика, если вы уже клиент этой компании.
Найденный внутренний эндпоинт — не публичный договор: его могут закрыть или изменить без предупреждения. Но пока он есть, сбор через него дешевле и быстрее в разы.
Три способа собрать данные, когда API нет
HTTP-запрос плюс разбор HTML. Самый быстрый и дешёвый вариант: страница скачивается как есть, из неё вытаскиваются нужные поля по селекторам. Подходит для простых каталогов, справочников, новостных лент. Ломается, если контент подгружается скриптами — тогда в ответе придёт пустая разметка.
Настоящий браузер. Страница открывается в реальном браузере под управлением кода: выполняются скрипты, срабатывают подгрузки при прокрутке, работают фильтры и пагинация. Медленнее и тяжелее по ресурсам, зато видит ровно то же, что видит человек. Мы собираем данные именно так — через Playwright, с российского адреса, потому что для маркетплейсов, карт и региональных цен это принципиально.
Гибрид. Браузер используется только там, где без него никак — авторизация, получение сессии, прохождение проверки, — а дальше данные тянутся быстрыми запросами. На больших объёмах это единственный способ уложиться в разумное время.
Где сбор ломается чаще всего
Антибот. Сайт смотрит не только на IP, но и на набор признаков браузера: заголовки, шрифты, отпечаток движка, поведение курсора. Обычный скрипт с подменённым User-Agent отсеивается на первом же запросе — вместо данных приходит заглушка или капча. Настоящий браузер эту проверку проходит, потому что он и есть настоящий браузер.
Регион. Российские сайты, маркетплейсы и карты отдают разные цены, остатки и выдачу в зависимости от местоположения. Сбор с зарубежного сервера даёт формально «рабочий» результат, который не совпадает с тем, что видит ваш покупатель. Отсюда требование: собирать с российского адреса и явно фиксировать город.
Вёрстка. Селекторы живут ровно до ближайшего редизайна. Поэтому сбор без контроля бесполезен: нужны проверки на пустой результат, на резкое изменение числа позиций, на подозрительные цены — и уведомление, когда что-то из этого сработало.
Собрать — половина дела. Дальше история и выгрузки
Одна выгрузка отвечает на вопрос «сколько стоит сейчас». Бизнесу обычно нужен другой: «что происходит с ценой и наличием». Это значит, что каждый прогон надо складывать в базу, а не перезаписывать файл. У нас на своей базе истории цен накоплено около 3,8 ГБ — из неё видно, кто и когда демпингует, у кого товар пропал из наличия и как менялась средняя цена по категории.
Данные должны приходить туда, где с ними работают, а не лежать в папке на сервере:
- таблицы и CSV/Excel для ручного анализа;
- 1С, CRM и товароучётные системы — через выгрузки и обмен;
- сайт или внутренний сервис — если цены пересчитываются автоматически;
- телеграм-бот или монитор — когда важен не отчёт, а сигнал: цена упала, товар появился, конкурент изменил условия.
И последнее: сбор должен работать без человека. У нас это Linux-сервер, задания по расписанию, журналы и сторожа, которые пишут в телеграм, если сбор упал или вернул подозрительный результат. Скрипт, который надо запускать руками, перестают запускать примерно на третьей неделе.
Соберём под ваш случай и покажем на ваших данных.
Сбор данных →