Аптечні агрегатори влаштовані так, що ціна видно всім і одразу. Покупець заходить, вбиває назву препарату і бачить список аптек із доставкою, відсортований за ціною. Перші три позиції збирають більшу частину замовлень. Різниця в кілька гривень вирішує, чи буде продаж.
Власник аптеки прийшов із задачею: він хоче бачити не свої ціни, які й так знає, а ціни конкурентів по своєму асортименту. І не разово, а регулярно, щоб реагувати. Нижче – як влаштований такий моніторинг і чому зіставлення товарів складніше за сам збір даних.

Постановка задачі
Формулювання клієнта було коротким: “по назві мого товару знайти такі самі товари конкурентів, які теж роблять доставку, і двічі на тиждень надсилати вивантаження з моїми цінами і цінами конкурентів, підсвічуючи позиції, де я дорожчий або дешевший”.
У цьому реченні заховано чотири окремі підзадачі, і тільки одна з них – власне парсинг.
- Забрати свій асортимент.
- Знайти на майданчику ті самі позиції в конкурентів.
- Відфільтрувати тих, хто справді конкурує, – тобто робить доставку в потрібний регіон.
- Зібрати все в звіт, де видно не набір чисел, а рішення: що піднімати, що опускати, де все гаразд.
Найважча частина – зіставлення товарів
Здається, що звірити ціни просто: береш назву, шукаєш, порівнюєш. На практиці саме тут проєкт або працює, або перетворюється на генератор сміття.
Один і той самий препарат в різних аптек називається по-різному. Різна форма запису дозування, різний порядок слів, різні скорочення форми випуску, різний виробник у назві або відсутність його. Плюс пастка: та сама назва при різному фасуванні – це різні товари, і порівнювати їх за ціною не можна. Двадцять таблеток дешевші за шістдесят не тому, що аптека демпінгує.
Тому зіставлення робиться в кілька шарів:
- Прямий збіг за кодом. Якщо на майданчику є внутрішній ідентифікатор картки товару, це найнадійніший шлях. Один товар – одна картка – список аптек із цінами.
- Нормалізація назви. Назва приводиться до єдиного вигляду: прибираються зайві символи, уніфікуються скорочення, окремо виділяються дозування, кількість в упаковці і форма випуску.
- Порівняння за нормалізованими ознаками. Збіг вважається дійсним, тільки якщо збіглися і діюча речовина, і дозування, і кількість. Інакше позиція йде в окремий список “потребує перевірки”.
Цей останній список – принципова річ. Автоматика не має права мовчки підставляти сумнівні збіги: одне помилкове зіставлення, і клієнт опустить ціну там, де цього робити не треба. Краще чесно сказати “тут я не впевнений”, ніж підсунути красиве, але неправильне число.
Фільтр за доставкою
Клієнту не цікаві всі аптеки країни. Йому цікаві ті, у кого покупець реально може замовити з доставкою, тобто ті, з ким він конкурує за один і той самий кошик. Тому в збір закладено фільтр за способом отримання і регіоном. Це помітно скорочує список і робить звіт придатним до дії, а не просто великим.
Як виглядає звіт
Вивантаження робиться двічі на тиждень. Це не просто таблиця цін, а таблиця з висновками:
- назва позиції і моя ціна;
- мінімальна ціна серед конкурентів з доставкою і скільки таких конкурентів;
- різниця в гривнях і у відсотках;
- кольорове підсвічування: червоне – я істотно дорожчий, зелене – я найдешевший, жовте – різниця в межах похибки;
- окремий аркуш із позиціями, де зіставлення не вдалося і потрібне око людини.
Сенс кольору простий: власник відкриває файл і за тридцять секунд бачить, куди дивитися. Довгі таблиці без пріоритетів ніхто не читає далі другого тижня.
Технічний бік
Навантаження на джерело
Асортимент навіть невеликої аптеки – це тисячі позицій. Тупий обхід кожної позиції окремо – це і довго, і неввічливо стосовно сайту. Тому збір побудований так, щоб брати максимум інформації за мінімум запитів, і рознесений у часі. Швидкість тут не самоціль: звіт потрібен двічі на тиждень, а не за хвилину.
Стабільність
Агрегатори регулярно міняють верстку і внутрішні адреси. У парсер закладені перевірки на адекватність результату: якщо раптом у половини товарів зникла ціна або кількість знайдених конкурентів обвалилася в рази, я отримую сповіщення і перевіряю, що змінилося на сайті, до того як клієнт побачить дивний звіт.
Історія
Кожне вивантаження зберігається. Через кілька місяців з’являється те, чого не дає жоден разовий зріз: видно, хто з конкурентів системно демпінгує, хто піднімає ціну слідом за вами, а хто взагалі не стежить за ринком.
Коли моніторинг окупається
Розробка тут – це зіставлення товарів, фільтри і звіт, а далі щомісячна підтримка: майданчик міняється, і парсер треба тримати в робочому стані. Чи окупиться це, залежить не від складності задачі, а від обороту.
- Розібратися в майданчику – це вже половина роботи. Коли відомо, як він влаштований і як коректно брати дані, наступне підключення під схожу задачу йде значно швидше.
- Та сама сума для різних бізнесів важить по-різному. Для магазину з великим оборотом, де кожен відсоток ціни помітний у виручці, моніторинг окупається за перші тижні. Для невеликого асортименту дешевше переглядати ціни руками раз на тиждень.
- Спершу порахуйте втрати. Скільки замовлень ви не отримуєте через завищену ціну і скільки маржі віддаєте там, де найдешевші без потреби. Від цього числа і варто відштовхуватися.
Кому потрібен моніторинг цін
Найкраще це працює там, де виконуються дві умови: товар порівнюваний і покупець бачить ціни поруч. Аптеки, електроніка, автозапчастини, побутова хімія, будматеріали – класика. Якщо у вас унікальний товар, моніторинг конкурентів мало що дасть.
Друга умова – готовність щось робити з результатом. Моніторинг сам по собі не приносить грошей. Гроші приносить рішення: підняти ціну там, де ви найдешевші без потреби, і опустити там, де ви на п’ятому місці у видачі і не отримуєте замовлень.
З чого почати
Мінімальний варіант – разове вивантаження по вашому асортименту. Ви бачите реальну картину, розумієте, чи є взагалі різниця, і вже потім вирішуєте, чи потрібне регулярне спостереження. Це чесніший шлях, ніж одразу підписуватися на щомісячну підтримку.
Далі, якщо картина цікава, налаштовується розклад: раз на тиждень, двічі на тиждень, щодня – за потребою. Детальніше про напрямок є на сторінці парсинг сайтів із захистом від ботів і в інших розборах блогу.
Опишіть свій випадок: який майданчик, скільки позицій, як часто потрібні дані. За коротку розмову я скажу, чи вирішується задача і скільки це коштуватиме.
