Вихідна ситуація: у відділі постачання ведемо власний каталог автозапчастин та замінників. Постачальник публікує актуальні ціни, залишки та застосовність у закритому B2B-каталозі, де сторінки рендеруються через JS, частина запитів йде в XHR, є антибот (перевірки заголовків, rate-limit, періодичні CAPTCHA), а картки товару змінюють структуру. Потрібен стійкий парсер, який регулярно оновлює дані та фіксує зміни, щоб ми не порівнювали все вручну. Технічне середовище та вступні: Linux (Ubuntu 22.04), Python 3.11, PostgreSQL 15. Розгортання в Docker Compose. Доступ до B2B через логін-пароль та 2FA за одноразовим кодом з email (IMAP доступ дамо). Проксі надамо, але їхня якість різна. Зберігаємо 2 мови опису (RU/EN), валюти можуть бути різні. Що має вийти: сервіс, який за розкладом збирає з B2B-каталогу категорії та товари, тягне за кожним товаром артикул, бренд, назву, ціни за складами, залишки, терміни поставки, застосовність/аналоги, посилання на зображення, характеристики (ключ-значення), а також позначає зняті з продажу позиції. Дані повинні зберігатися в PostgreSQL у нормалізованій схемі з історією змін (цін/залишків) та можливістю вивантаження у CSV. Етапи виконання: 1) Аналіз джерела та протоколу: визначити точки входу, XHR-ендпоінти, параметри фільтрів/пагінації, ліміти, сигнатури запитів, поведінка антибота, стратегії ретраїв. 2) Реалізація логіну та сесій: авторизація, обробка 2FA через IMAP, зберігання сесії, автоматичне продовження, безпечне зберігання секретів через env. 3) Збір даних: обхід категорій, пагінація, збирання карток, завантаження зображень лише за потребою (прапор), вилучення характеристик та аналогів, нормалізація валют/одиниць виміру. 4) Сховище: PostgreSQL схема (мінімум товари, пропозиції/склади, залишки, ціни-історія, аналоги, характеристики, медіа), міграції, індекси, upsert-логіка та дифф-оновлення. 5) Стійкість: проксі-rotation, обмеження швидкості, backoff, детект блокувань, перемикання на альтернативний маршрут (XHR vs HTML), докладні логи та метрики виконання. 6) Експорт та звіти: CLI команди для вивантаження CSV за фільтрами (бренд, категорія, дата), звіт про зміни за період (скільки товарів змінилося за ціною/залишками). Обмеження: - CAPTCHA вирішувати через зовнішні платні послуги не можна. Якщо з'являється CAPTCHA, завдання парсера - коректно зафіксувати подію, переключити проксі/пауза та продовжити без ручного введення, наскільки це можливо. - Навантаження на сайт: не більше 1 запиту в секунду на один проксі, максимум 3 паралельні воркери. - Код без прив'язки до GUI, керування через CLI та конфіг. Вимірні критерії приймання: - Прогін, що повторюється, на тестовому наборі з 5 категорій повинен зібрати не менше 95% товарів, знайдених через вбудований пошук на сайті (похибка допускається через тимчасові блокування, але повинна бути у звіті). - Для 100 випадково обраних товарів дані в БД збігаються з сайтом за артикулом, брендом, ціною та залишком (перевіримо вручну за списком). - При другому прогоні без змін у джерелі не створюються зайві дублікати та історія цін/залишків не поповнюється. - Логи містять: кількість оброблених сторінок, товарів, помилок за типами, середній час відповіді, кількість блокувань/ретраїв. - Docker Compose піднімає все однією командою, є README з інструкціями запуску, змінними оточенням та прикладами CLI. Переважні інструменти: Playwright (Python) для JS/антибот-обходу + requests/httpx там, де можливо; Alembic для міграцій; структуровані логи (json)