Одна из самых частых задач в магазинах и на маркетплейсах — следить за ценами и ассортиментом конкурентов. Вручную это часы работы каждый день, а нужен простой результат: таблица со всеми товарами и отдельный список того, что изменилось со вчера — кто поднял или снизил цену, что закончилось, что появилось.
Это демонстрационный проект: парсер собирает учебный магазин books.toscrape.com, сделанный специально для отработки парсинга (1000 товаров). Под реальный сайт меняется только модуль разбора страниц — загрузка, история, сравнение и выгрузка остаются как есть.
Написал парсер на Python с асинхронной загрузкой (asyncio, httpx).
Страницы списка обходятся по порядку, карточки товаров — параллельно, но бережно к сайту: с ограничением одновременных запросов и паузой после каждого. Временные ошибки — перегрузка, сбой сервера, обрыв сети — повторяются с нарастающей паузой, а «страница не найдена» не повторяется. Если какая-то карточка не открылась, обход идёт дальше, а в конце видно, сколько было повторов и ошибок.
Из карточки достаются название, категория, цена, остаток на складе, рейтинг, артикул, описание и картинка. Каждый запуск сохраняется в базу SQLite, и следующий сравнивается с прошлым по артикулу: цена выросла или снизилась, товар закончился или снова в наличии, новые и пропавшие позиции.
Результат — Excel на три листа: все товары (фильтры, закреплённая шапка, формат денег, звёзды рейтинга, ссылки на товар, подсветка нулевого остатка), сводка по категориям (количество, средняя, минимальная и максимальная цена, остатки) и изменения с прошлого запуска с цветовой разметкой. По желанию — CSV, который Excel открывает с кириллицей без настроек. Код покрыт 24 автотестами, включая обход подменённого сайта с «падающей» карточкой — без обращения к сети.
Весь каталог из 1000 товаров собирается за 52 секунды — 1050 запросов без единой ошибки. Каждый следующий запуск сразу показывает, что изменилось: на скриншоте видно, как парсер сам нашёл изменения цен, наличия и состава каталога.
Запускается одной командой, по расписанию — раз в день или чаще. Код открыт.