Исходная ситуация: в отделе снабжения ведём собственный каталог автозапчастей и заменителей. Поставщик публикует актуальные цены, остатки и применимость в закрытом 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).