vvs35.ru боты, парсеры, серверы
УслугиГотовые решенияБлог принимаем заказы

Парсинг каталога товаров в Excel: как это устроено

Задача звучит просто: вот сайт магазина или поставщика, нужен весь каталог в таблице — названия, цены, характеристики, фото. Руками это дни копирования. Парсер делает то же самое за один проход, но только если в нём учтены места, где каталоги обычно ломают сбор.

Расскажу, что происходит между ссылкой на каталог и готовым файлом, какие колонки в нём будут, сколько это стоит и что собирать можно, а что нет.

Как парсер обходит каталог

Сбор идёт в три слоя:

  1. Дерево категорий. Парсер забирает меню каталога со всеми подкатегориями. Путь вроде «Сантехника / Смесители / Для кухни» потом попадает в таблицу отдельной колонкой — по нему удобно фильтровать.
  2. Списки товаров. В каждой категории проходятся все страницы и собираются ссылки на карточки.
  3. Карточки. С каждой карточки берутся название, артикул, цена, наличие, описание, характеристики и фото.

Между вторым и третьим шагом ссылки очищаются от дублей. Один и тот же товар часто лежит в нескольких категориях сразу — в «Новинках», в «Распродаже» и в своей основной. Без этой чистки таблица распухает повторами, а дубли потом приходится вычищать руками. Сверяю по адресу карточки, а в готовой таблице ещё раз — по артикулу или идентификатору товара.

Пагинация: где парсер застревает или теряет товары

Страницы в каталоге листаются тремя способами, и каждый собирается по-своему:

  • Номер страницы в адресе — ?page=2, /page/3/. Самый простой случай.
  • Кнопка «Показать ещё» — товары догружаются отдельным запросом. Этот запрос я нахожу во вкладке Network и дальше вызываю напрямую.
  • Бесконечная прокрутка — по сути то же самое, только запрос срабатывает при скролле.

Типовая ловушка. Многие сайты на запрос несуществующей страницы — скажем, ?page=999 — не отдают ошибку, а молча показывают первую или последнюю страницу. Парсер, который ждёт пустую страницу, чтобы остановиться, начинает ходить по кругу. Поэтому остановка у меня — по повтору набора товаров, а не только по пустому ответу.

Вторая частая потеря — лимит на глубину. Некоторые каталоги отдают максимум 50–100 страниц в категории, даже если товаров больше. Тогда большую категорию приходится дробить фильтрами: по брендам или по диапазонам цен.

Когда данные подгружаются через JavaScript

Открываете код страницы, а цены там нет — вместо неё пустой блок. Значит, цена подтягивается скриптом уже после загрузки. То же бывает с остатками и с ценами для разных городов.

Порядок действий тут такой:

  1. Поискать данные внутри самой страницы. Их часто кладут в JSON прямо в HTML — в разметку application/ld+json для поисковиков или в стартовое состояние приложения. Оттуда их забрать проще всего.
  2. Найти запрос, которым страница получает цены. Обычно сайт сам себе отдаёт аккуратный JSON — забирать его быстрее и надёжнее, чем разбирать вёрстку.
  3. Только если ни то ни другое не получилось — открывать страницы в браузере под управлением скрипта. Это работает почти всегда, но медленнее в разы и тяжелее для сервера.

Характеристики: самая капризная часть

У холодильника одни характеристики, у чайника другие, и даже в пределах одной категории набор у товаров разный. Отсюда два варианта выгрузки:

  • Каждая характеристика — своя колонка. «Мощность, Вт», «Объём, л», «Цвет». У товаров, где такой характеристики нет, ячейка пустая. Этот вид нужен для импорта в интернет-магазин и для фильтрации в Excel.
  • Одна колонка текстом: Мощность: 2200 Вт; Объём: 1,7 л; Цвет: белый. Компактно, удобно читать глазами, но фильтровать неудобно.

Грабли, которые встречаются почти в каждом каталоге: одно и то же свойство названо по-разному («Вес», «Вес, кг», «Масса»), а единицы измерения то в названии, то в значении. Если характеристики нужны для импорта, я свожу такие варианты в одну колонку и выношу число отдельно от единиц.

Фото

В таблицу попадают ссылки на фото в полном размере, а не на превью из списка. Две типовые проблемы:

  • картинки подгружаются по мере прокрутки, и в обычном атрибуте src лежит заглушка, а настоящий адрес — в data-src или похожем атрибуте;
  • размер зашит в адрес: /resize/200x200/photo.jpg. Если его убрать или заменить, часто сайт отдаёт оригинал.

Если нужны сами файлы, а не ссылки, — скачиваю в папки с именами по артикулу: AB-1234_1.jpg, AB-1234_2.jpg.

Цены, остатки и варианты товара

  • Старая и новая цена — две колонки, иначе скидку потом не посчитать.
  • Цена зависит от города. Сайт определяет регион и показывает свою цену. Парсер должен явно выбрать нужный город, иначе получите цены того региона, который сайт подставит сам.
  • Наличие часто пишут словами: «много», «мало», «под заказ». Оставляю как есть и добавляю колонку «да/нет», чтобы по ней можно было фильтровать.
  • Варианты — размеры, цвета, объёмы. У каждого может быть своя цена и свой остаток, поэтому каждый вариант — отдельная строка с общим артикулом родителя.

Защита от ботов

Большинство магазинов спокойно отдают каталог, если парсер ведёт себя прилично: ходит с паузами, в несколько потоков, а не в сотню, и не шлёт запросы пачками без пауз. На каталоге в тысячи товаров сбор занимает минуты, а не секунды, — это нормальный темп.

Если сайт показывает капчу на каждый запрос или проверяет браузер перед входом, я говорю об этом до начала работы. Крупные площадки с активной защитой — Авито, Wildberries и подобные — не беру: такой парсер ломается после каждого их обновления. Если у площадки есть официальный API или выгрузка для партнёров, работаю через них.

Что будет в файле

Набор колонок зависит от сайта и задачи. Типовая таблица каталога выглядит так:

КолонкаЧто внутриПример
Артикулкак на сайте, текстом, чтобы не потерялись нули в начале0012-BK
Названиеполное название из карточкиСмеситель для кухни, чёрный
Брендотдельно от названиякак указан на сайте
Категорияполный путьСантехника / Смесители / Для кухни
Ценачислом, не текстом4 990
Старая ценаесли есть скидка5 590
Наличиекак на сайте + да/нетмало · да
Характеристикипо колонке на каждуюМатериал: латунь
Описаниетекст без рекламных вставок магазинаобычно 1–3 абзаца
Фотоссылки на оригиналы через точку с запятойhttps://…/1.jpg; https://…/2.jpg
Ссылкаадрес карточкиhttps://…/product/0012-bk/
Дата сборакогда снята цена28.09.2026

Файл — xlsx с автофильтрами и отдельным листом сводки: сколько товаров в каждой категории, средние цены и диапазоны. Можно CSV или Google Таблицу. Если нужен импорт в ваш магазин, колонки называются и располагаются так, как ждёт ваша CMS.

Сколько стоит и сколько делается

Цены те же, что на странице услуги:

  • Разовый сбор каталога — от 2 000 ₽, 1–2 дня. Название, цена, наличие, характеристики, фото и ссылка — одним файлом.
  • Регулярный сбор с историей цен — от 4 000 ₽, 3–5 дней. Запуск по расписанию, база, уведомление, если что-то изменилось.
  • Второй сайт со схожей структурой — примерно плюс день.

Цену поднимают вещи из этой статьи: данные только через JavaScript, цены по городам, сложные варианты товаров, скачивание фото файлами. Точную сумму называю, когда посмотрю сайт-источник, — до этого любая цифра будет гаданием.

Что собирать можно, а что нет

  • Можно: открытые данные о товарах, которые сайт показывает любому посетителю без входа, — названия, цены, наличие, характеристики. Это обычная практика для мониторинга цен и анализа ассортимента.
  • Нельзя: персональные данные людей — имена и контакты из отзывов, профили покупателей. Не беру это ни в каком объёме.
  • Не обхожу авторизацию, закрытые разделы и защиту от ботов.
  • Не кладу сайт: нагрузка ограничена, чтобы источник работал для своих посетителей как обычно.

Отдельно про тексты и фото. Описания и фотографии — чей-то контент. Для внутренней работы — сравнить ассортимент, посмотреть характеристики — это одно. Выложить у себя как своё — уже вопрос к правам на этот контент, а ещё поисковики плохо относятся к скопированным текстам. Если задача такая, я предупреждаю об этом заранее. Пользовательское соглашение сайта-источника тоже остаётся в силе.

Коротко: частые вопросы

Сколько стоит парсинг каталога товаров в Excel?

Разовый сбор каталога с одного сайта — от 2 000 ₽, срок 1–2 дня: название, цена, наличие, характеристики, фото и ссылка одним файлом. Регулярный сбор с историей цен — от 4 000 ₽ и 3–5 дней. Второй сайт со схожей структурой — примерно плюс день. Точную сумму называю, когда посмотрю сайт-источник.

Можно ли выгрузить характеристики товаров отдельными колонками?

Да. Каждая характеристика получает свою колонку, а у товаров, где её нет, ячейка остаётся пустой. Для импорта в интернет-магазин обычно нужен именно такой вид. Если колонок получается слишком много, характеристики можно дополнительно свести в одну колонку текстом.

Что делать, если цены на сайте подгружаются через JavaScript?

Сначала поискать данные в самой странице — они часто лежат там в JSON, потом найти запрос, которым страница получает цены: чаще всего это JSON от самого сайта, и забирать его быстрее и надёжнее, чем открывать страницы в браузере. Браузер под управлением скрипта — запасной вариант, когда другого пути нет.

Законно ли парсить каталог конкурента?

Сбор открытых данных о товарах, которые сайт показывает любому посетителю, — обычная практика. Персональные данные не собираю, авторизацию и защиту не обхожу, сайт-источник запросами не перегружаю. Тексты и фото — чужой контент: для анализа — одно, публиковать у себя как своё — другое, об этом предупреждаю заранее.

Пришлите ссылку на каталог, который нужно собрать. Посмотрю, как устроен сайт, и скажу, какие колонки получатся, сколько это займёт и во что обойдётся.

Читать дальше