Автоматизированная система сбора и визуализации аналитики маркетплейса Wildberries
Программа, которая по расписанию сама забирает все отчёты кабинета продавца Wildberries, складывает их в базу данных и выводит готовые сводные таблицы в Google Sheets — без ручного скачивания и копирования.

Слайд 1 из 7
ОПИСАНИЕ
ETL-конвейер на Python, полностью автоматизирующий сбор бизнес-данных продавца маркетплейса. Система самостоятельно собирает более десяти типов отчётов (заказы, остатки, штрафы и удержания, скидки, комиссии, КТР, характеристики товаров, рекламные затраты, поставки FBW, поисковые запросы, еженедельный финансовый отчёт), нормализует их и поддерживает в актуальном состоянии набор управленческих листов в Google Sheets. Кодовая база разделена на четыре слоя — авторизация и подготовка профилей, сбор сырых данных, загрузка в PostgreSQL, выгрузка в таблицы — плюс изолированный слой доступов и конфигурации.
Оркестрация
Корневой процесс работает в бесконечном цикле с настраиваемым интервалом и на каждой итерации последовательно запускает три этапа как отдельные процессы: сбор → база → выгрузка, а затем профилактическую очистку. Внутри каждого этапа диспетчер порождает дочерние скрипты и исполняет их параллельно, контролируя каждый индивидуальным тайм-аутом: зависший скрипт принудительно завершается, а связанные с ним подвисшие процессы браузера зачищаются. За счёт изоляции по процессам сбой одного отчёта не роняет ни соседние, ни конвейер в целом. Все процессы запускаются через общий раннер, обеспечивающий сквозной перехват ошибок (вынесен в отдельную работу).
Каналы сбора данных
Сбор данных идёт двумя каналами в зависимости от того, что отдаёт Wildberries. Где есть официальный API (реклама, поставки FBW) — используются REST-запросы с JWT-авторизацией, постраничная выгрузка, троттлинг под лимиты запросов и агрегация на стороне клиента. Отчёты, которых в API нет, добываются браузерной автоматизацией на Selenium: скрипт открывает реальный кабинет, инициирует серверное формирование Excel-отчёта за нужный период и скачивает готовый файл. Сценарии написаны под нестабильную и постоянно меняющуюся вёрстку личного кабинета: каскад резервных селекторов с приоритетом устойчивых атрибутов, клик с откатом на JavaScript, ожидание асинхронно формируемых отчётов через опрос статуса очереди, обход интерфейсных ловушек вроде баннеров, уводящих со страницы. Скачивание тяжёлых файлов отслеживается по появлению результата с фильтрацией незавершённых загрузок.
Пул профилей Chrome
Пул профилей Chrome — ключевое решение слоя сбора. Авторизация (вход по телефону и SMS через Selenium) выполняется один раз, после чего мастер-профиль клонируется в десять независимых профилей, и каждый загрузчик работает на своём. Это позволяет собирать отчёты параллельно и сохранять сессию между циклами. Профили обслуживаются отдельными утилитами: проверка статуса авторизации, безопасная очистка кэша и снятие lock-файлов перед каждым запуском, чтобы профиль не «залипал».
Слой данных PostgreSQL
Слой данных — PostgreSQL, единая схема, доступ через psycopg2 с настройками устойчивости соединения. DDL идемпотентен и живёт в коде: таблицы создаются при отсутствии, а новые поля отчётов подхватываются автоматической миграцией (ALTER TABLE ... ADD COLUMN IF NOT EXISTS) без ручного вмешательства. Запись — пакетная; справочник товаров обновляется через upsert. Данные не перезаписываются, а накапливаются снимками с меткой времени — база хранит историю, а выгрузка читает последний срез. Справочник товаров — опорная сущность: остальные таблицы строятся относительно него, так что строка есть у каждого товара даже при нулевых показателях.
Парсинг Excel-отчётов
Парсинг исходных Excel-отчётов устойчив к «грязным» файлам Wildberries: архивы читаются из памяти без распаковки, строка заголовков определяется эвристически, колонки сопоставляются по нормализованным названиям с резервом на позиционные индексы, числа аккуратно приводятся к типам (запятые, неразрывные пробелы, проценты, пустые значения). Самостоятельный по сложности модуль — еженедельный финансовый отчёт: суммы удержаний собираются из разных колонок в зависимости от вида, а сами виды заранее неизвестны и приходят длинными строками. Поскольку имя столбца в PostgreSQL ограничено по длине, каждому виду присваивается короткий ключ, а соответствие «ключ → полное название» хранится в отдельной таблице; начисления уровня аккаунта распределяются по товарам пропорционально.
Выгрузка в Google Sheets
Выгрузка в Google Sheets выполнена через сервисный аккаунт по принципу атомарной публикации: каждый скрипт пишет во временный лист, и только после успешного завершения всех загрузок основные листы атомарно подменяются — пользователь никогда не видит полузаполненную таблицу. Форматирование (числовые форматы, проценты, визуальные разделители групп) задаётся пакетными запросами к API. Часть листов собирается не зеркалированием одного отчёта, а соединением нескольких таблиц с группировкой и сортировкой; для отдельных листов вызывается развёрнутое веб-приложение Google Apps Script для финального оформления.
Сквозные решения
Сквозные решения: единый текстовый протокол диагностики (успех / удаление / ошибка с типом, сообщением и стеком), на который опирается подсистема логирования; все секреты и внешние доступы вынесены из бизнес-логики и переопределяются через переменные окружения; время везде приведено к московской зоне; версии зависимостей зафиксированы.
ИСПОЛЬЗУЕМЫЕ ИНСТРУМЕНТЫ
- Python 3
- Selenium (WebDriver
- Chrome/ChromeDriver
- Chrome DevTools Protocol)
- pandas
- openpyxl
- PostgreSQL
- psycopg2
- gspread (Google Sheets API)
- Google service account
- Google Apps Script
- requests
- REST API Wildberries (JWT-авторизация)
- pytz
- subprocess (многопроцессная оркестрация)
- Git
РЕЗУЛЬТАТ
- Построен сквозной ETL-конвейер «сбор → PostgreSQL → Google Sheets», работающий по расписанию без участия человека.
- Реализован оркестратор из независимых процессов с параллельным запуском, индивидуальными тайм-аутами и зачисткой зависших процессов браузера — отказ одного отчёта не ломает конвейер.
- Автоматизирован сбор более десяти типов отчётов двумя каналами: официальный REST API Wildberries и браузерная автоматизация на Selenium для данных, недоступных через API.
- Создан пул из десяти предавторизованных профилей Chrome с разовым входом по SMS и закреплением профиля за каждым загрузчиком — для параллельного сбора и сохранения сессии.
- Разработаны устойчивые к смене вёрстки сценарии Selenium: каскад селекторов, откат на JavaScript-клик, ожидание асинхронно формируемых отчётов, обход интерфейсных ловушек, контроль скачивания файлов.
- Спроектирована схема БД в PostgreSQL с идемпотентным созданием таблиц, автоматической миграцией структуры, пакетной вставкой и upsert-ом справочника; данные хранятся снимками во времени.
- Реализован устойчивый парсер Excel/ZIP на pandas с эвристическим разбором заголовков и безопасным приведением типов.
- Решена нетривиальная задача финансового отчёта: динамический набор видов удержаний с генерацией ключей колонок в обход ограничений PostgreSQL, таблица-справочник и пропорциональное распределение общих начислений.
- Внедрён атомарный механизм публикации в Google Sheets через временные листы, программное форматирование и постобработку через Google Apps Script.
- Реализована сборка сводных листов соединением нескольких таблиц с группировкой и сортировкой.
- Все секреты и доступы вынесены в отдельный слой с переопределением через переменные окружения.
AI АССИСТЕНТ
Задать вопрос по этой работе