Продавцам на Wildberries важно знать, когда конкуренты меняют цену или у них заканчивается товар, а покупателям — когда нужная вещь подешевела или снова появилась. Вручную проверять десятки карточек каждый день нереально.
Нужен был Telegram-бот: присылаешь артикул или ссылку на товар — и дальше он сам следит за ценой и наличием и пишет, только когда что-то действительно изменилось.
Сложность в том, что Wildberries защищается от ботов: цену больше нельзя достать из кода страницы, а его API без проверки «вы не человек» отвечает отказом. Старый способ парсинга перестал работать.
Сделал бота на Python и aiogram 3 с хранением истории в SQLAlchemy и обходом по расписанию через APScheduler.
Чтобы получать данные, несмотря на защиту, парсер открывает карточку товара в настоящем браузере Chromium через Playwright, проходит проверку, как обычный посетитель, и перехватывает ответ API, который запрашивает сама страница. Из него берутся цена для покупателя, цена до скидки, общий остаток по складам, рейтинг и число отзывов. Разбор ответа вынесен в отдельную функцию и проверен на настоящих ответах WB — для товара в наличии и без наличия.
За один обход браузер запускается один раз на все товары, а сбой по одному товару не ломает остальные. После каждого обхода сохраняется срез, и бот сравнивает его с предыдущим: изменение цены — с разницей в рублях и процентах, мелкие колебания ниже порога не беспокоят; отдельные уведомления — «товар закончился» и «снова в наличии».
Команды: добавить товар, список отслеживаемого с текущими ценами, последний срез по товару, удалить, включить или выключить уведомления. Есть проверка без Telegram одной командой. Поведение закреплено 26 автотестами, включая полный обход с подменёнными WB и Telegram.
Бот работает на живых данных Wildberries: по артикулу показывает цену, скидку, остаток и рейтинг и сам присылает уведомление, когда меняется цена или наличие. Вместо ежедневной ручной проверки карточек — короткие сообщения только о том, что изменилось.
Код открыт, запуск одной командой, на сервере — под виртуальным дисплеем; все настройки — в одном файле с примером.