Мониторинг цен и скидок для ВКР: ETL-конвейер от парсера Woot до аналитической витрины
25 марта 2026 года Woot запустил дневную распродажу под Amazon Big Spring Sale: промокод SAVETWENTY срезает ещё 20 % от уже сниженных цен, и Mario Kart World для Switch 2 уходит за $52 вместо $79,99, а контроллер 8BitDo Pro 3 — за $37,60 вместо $69,99. Для выпускника ИТ это не новость про игры, а готовый датасет и сценарий: цена товара меняется каждые несколько часов, промокод живёт сутки, а на 12 разных площадках одна и та же карточка названа по-разному. Ровно такую задачу решает инженер данных — и именно её удобно защищать в ВКР, потому что здесь сходятся парсинг, ETL, дедупликация и аналитика.
Темы ВКР, которые вырастают из этого кейса
| Тема | Актуальность (отсылка к статье) | Цель | Задачи | Структура |
|---|---|---|---|---|
| ETL-конвейер сбора и нормализации цен с маркетплейсов | Акции вроде SAVETWENTY длятся менее 24 часов — данные нужно снимать чаще, чем раз в сутки | Снизить задержку обновления цены до 15 минут | Обзор источников и лимитов; проектирование слоёв raw/stage/mart; реализация парсера и загрузчика; замер freshness | Гл.1 — анализ предметной области и API; Гл.2 — архитектура C4 и схема БД; Гл.3 — нагрузочное тестирование и метрики |
| Сервис отслеживания скидок и промокодов (Change Data Capture) | Промокод действует до 12:59 по восточному времени — система должна ловить появление, изменение и отзыв | Автоматически фиксировать жизненный цикл акции | Модель событий; настройка CDC; логика алертов; проверка на пропуски событий | Гл.1 — обзор event-driven подходов; Гл.2 — брокер сообщений и контракты; Гл.3 — тесты на дубликаты и потери |
| Аналитическая витрина эффективности акций | Скидка от $69,99 до $36 — это 48 %; менеджеру нужен дашборд, а не CSV | Построить витрину и набор метрик глубины скидки | Выбор хранилища; слой агрегатов; BI-дашборд; валидация расчётов | Гл.1 — обзор OLAP-решений; Гл.2 — модель «снежинка»; Гл.3 — сверка с эталонной выборкой |
Как встроить материал в главы: пошагово
Глава 1. Аналитика и требования
Опишите предметную область через реальные сущности статьи: товар, карточка, цена, промокод, период действия акции, площадка. Дальше — обзор источников: официальные API маркетплейсов, фиды, HTML-страницы. Обязательно зафиксируйте ограничения: rate limit, нестабильная разметка, юридические рамки парсинга. Требования оформляйте по ГОСТ 34, а нефункциональные — по ISO/IEC 25010: производительность, надёжность, сопровождаемость. Это снимает половину вопросов комиссии на защите.
Глава 2. Проектирование и реализация
Постройте диаграмму контекста и контейнеров по C4: источник → сборщик → брокер → хранилище → витрина → BI. Ниже — фрагмент DAG, который забирает карточку и нормализует цену. Обратите внимание на идемпотентность: повторный запуск не должен плодить дубли.
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.python import PythonOperator
def fetch_offer(offer_id: str, promo_code: str | None):
"""Забираем сырую карточку и сохраняем в raw.offers с ts."""
payload = http_get(f"/offers/{offer_id}")
raw_price = payload["price"]
promo_price = apply_promo(raw_price, promo_code) if promo_code else None
upsert("raw.offers", {
"offer_id": offer_id,
"raw_price": raw_price,
"promo_price": promo_price,
"collected_at": datetime.utcnow(),
}, key=("offer_id", "collected_at"))
with DAG(
dag_id="woot_price_watch",
schedule=timedelta(minutes=15),
start_date=datetime(2026, 3, 25),
catchup=False,
default_args={"retries": 3, "retry_delay": timedelta(minutes=2)},
) as dag:
for oid in OFFER_IDS:
PythonOperator(
task_id=f"fetch_{oid}",
python_callable=fetch_offer,
op_kwargs={"offer_id": oid, "promo_code": "SAVETWENTY"},
)
Отдельная головная боль — сопоставление карточек между площадками: «8BitDo Ultimate 2 Bluetooth Controller» и «8bitdo ultimate 2 (bluetooth)» — это один товар. Покажите каскад матчинга: точный ключ → нормализация строки → нечёткое сравнение. Метрики качества — precision и recall на размеченной выборке в 300–500 пар.
Глава 3. Тестирование и оценка эффективности
Здесь защищаются цифрами, а не словами «работает быстро». Инструментируйте конвейер через OpenTelemetry, метрики выведите в Prometheus, визуализируйте в Grafana. Минимальный набор — в таблице.
| Метрика | Что показывает | Целевое значение |
|---|---|---|
| Freshness | Отставание витрины от реальной цены | ≤ 15 мин |
| Precision матчинга | Доля верных склеек карточек | ≥ 0,95 |
| Recall матчинга | Доля найденных дублей | ≥ 0,90 |
| P95 latency загрузки | Скорость обработки батча | ≤ 40 с |
| Uptime сборщика | Доступность пайплайна | ≥ 99,5 % |
Экономический эффект считайте через TCO: сравните ручной мониторинг (часы аналитика × ставка) с автоматическим. Для магазина с 2 000 SKU и ежедневными акциями это обычно десятки часов в месяц — хороший аргумент в выводах.
Чему вы научитесь
- Проектировать ETL-конвейер со слоями raw/stage/mart и идемпотентной загрузкой.
- Настраивать сбор метрик через OpenTelemetry и Prometheus и доказывать эффективность числами.
- Строить диаграммы C4/BPMN и оформлять их по ГОСТ 19.701-90 без переделок на нормоконтроле.
- Считать precision/recall для задач дедупликации и защищать выбор порога.
- Оформлять требования по ГОСТ 34 и ISO/IEC 25010 так, чтобы комиссия видела границы системы.
Частые вопросы студентов
Легально ли парсить цены маркетплейсов для ВКР?
Для учебной работы берите официальные API, партнёрские фиды или открытые датасеты, соблюдайте robots.txt и условия использования. В тексте ВКР явно опишите источник и ограничения — это снимает вопросы этики и права.
Где взять данные, если API недоступен?
Синтетический датасет + снапшоты вручную собранных страниц. Кейс со скидкой от $79,99 до $52 даёт естественный временной ряд: за сутки цена и промокод меняются, и на этом легко показать работу CDC и алертов.
Какой стек выбрать, чтобы не утонуть?
Минимум: Python + requests/Playwright, PostgreSQL для сырья, dbt или SQL для трансформаций, Grafana для визуализации. Airflow добавляйте, если нужны расписания и ретраи. Не тащите Kafka без обоснования — комиссия спросит «зачем».
Как считать эффективность, если нет реальных пользователей?
Сравнивайте с базовой линией: ручной сбор против автоматического, задержка обновления, доля ошибок матчинга. Метрику без базы сравнения защитить почти невозможно — закладывайте её в Главу 1.
- Задачи из введения дословно совпадают с выводами по главам.
- Каждая метрика имеет цель и способ измерения.
- Схемы (C4, ERD, BPMN) пронумерованы и подписаны по ГОСТ.
- Листинги кода вынесены в приложения, в тексте — только ключевые фрагменты.
- Требования оформлены по ГОСТ 34, качество — по ISO/IEC 25010.
- Проверена уникальность и оформлены ссылки на источники.
- Приложения содержат полные конфиги и результаты замеров.
- Парсинг без нормализации. Студент сохраняет цену строкой «$37.60» и потом не может посчитать скидку. Приводите типы на входе в stage-слой, иначе расчёты в главе 3 развалятся.
- Отсутствие базы сравнения. Утверждение «конвейер быстрый» без цифр P95 и freshness не защищается. Кейс с суточной акцией SAVETWENTY как раз показывает, почему задержка критична.
- Игнорирование дублей. Одна и та же карточка на разных площадках ломает агрегаты. Заложите матчинг и метрики precision/recall заранее, а не в последнюю неделю.
Источник: Woot is offering over 20 percent off Switch 2 controllers and games today (опубликовано 2026-03-25)