Задача звучит просто: вот сайт магазина или поставщика, нужен весь каталог в таблице — названия, цены, характеристики, фото. Руками это дни копирования. Парсер делает то же самое за один проход, но только если в нём учтены места, где каталоги обычно ломают сбор.
Расскажу, что происходит между ссылкой на каталог и готовым файлом, какие колонки в нём будут, сколько это стоит и что собирать можно, а что нет.
Сбор идёт в три слоя:
Между вторым и третьим шагом ссылки очищаются от дублей. Один и тот же товар часто лежит в нескольких категориях сразу — в «Новинках», в «Распродаже» и в своей основной. Без этой чистки таблица распухает повторами, а дубли потом приходится вычищать руками. Сверяю по адресу карточки, а в готовой таблице ещё раз — по артикулу или идентификатору товара.
Страницы в каталоге листаются тремя способами, и каждый собирается по-своему:
?page=2, /page/3/. Самый простой случай.Типовая ловушка. Многие сайты на запрос несуществующей страницы — скажем, ?page=999 — не отдают ошибку, а молча показывают первую или последнюю страницу. Парсер, который ждёт пустую страницу, чтобы остановиться, начинает ходить по кругу. Поэтому остановка у меня — по повтору набора товаров, а не только по пустому ответу.
Вторая частая потеря — лимит на глубину. Некоторые каталоги отдают максимум 50–100 страниц в категории, даже если товаров больше. Тогда большую категорию приходится дробить фильтрами: по брендам или по диапазонам цен.
Открываете код страницы, а цены там нет — вместо неё пустой блок. Значит, цена подтягивается скриптом уже после загрузки. То же бывает с остатками и с ценами для разных городов.
Порядок действий тут такой:
application/ld+json для поисковиков или в стартовое состояние приложения. Оттуда их забрать проще всего.У холодильника одни характеристики, у чайника другие, и даже в пределах одной категории набор у товаров разный. Отсюда два варианта выгрузки:
Мощность: 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.
Цены те же, что на странице услуги:
Цену поднимают вещи из этой статьи: данные только через JavaScript, цены по городам, сложные варианты товаров, скачивание фото файлами. Точную сумму называю, когда посмотрю сайт-источник, — до этого любая цифра будет гаданием.
Отдельно про тексты и фото. Описания и фотографии — чей-то контент. Для внутренней работы — сравнить ассортимент, посмотреть характеристики — это одно. Выложить у себя как своё — уже вопрос к правам на этот контент, а ещё поисковики плохо относятся к скопированным текстам. Если задача такая, я предупреждаю об этом заранее. Пользовательское соглашение сайта-источника тоже остаётся в силе.
Разовый сбор каталога с одного сайта — от 2 000 ₽, срок 1–2 дня: название, цена, наличие, характеристики, фото и ссылка одним файлом. Регулярный сбор с историей цен — от 4 000 ₽ и 3–5 дней. Второй сайт со схожей структурой — примерно плюс день. Точную сумму называю, когда посмотрю сайт-источник.
Да. Каждая характеристика получает свою колонку, а у товаров, где её нет, ячейка остаётся пустой. Для импорта в интернет-магазин обычно нужен именно такой вид. Если колонок получается слишком много, характеристики можно дополнительно свести в одну колонку текстом.
Сначала поискать данные в самой странице — они часто лежат там в JSON, потом найти запрос, которым страница получает цены: чаще всего это JSON от самого сайта, и забирать его быстрее и надёжнее, чем открывать страницы в браузере. Браузер под управлением скрипта — запасной вариант, когда другого пути нет.
Сбор открытых данных о товарах, которые сайт показывает любому посетителю, — обычная практика. Персональные данные не собираю, авторизацию и защиту не обхожу, сайт-источник запросами не перегружаю. Тексты и фото — чужой контент: для анализа — одно, публиковать у себя как своё — другое, об этом предупреждаю заранее.
Пришлите ссылку на каталог, который нужно собрать. Посмотрю, как устроен сайт, и скажу, какие колонки получатся, сколько это займёт и во что обойдётся.