Watcher v3.0: Тестовая сборка — Быстрый сканер каталога продавца
Цель
Проверить работоспособность связки Claude Code CLI + agent-browser для сбора ассортимента конкурента на Wildberries. Агент получает ID продавца, пролистывает каталог и собирает данные со всех карточек-превью. Особый акцент на реалистичную эмуляцию поведения человека.
Требования
| Компонент | Требование |
|---|---|
| ОС | Windows 10 (build 1809+) |
| RAM | 8 GB (минимум) |
| Подписка | Claude Max 5x |
| Браузер | Google Chrome (менеджер авторизован на WB) |
| Установлено | Claude Code CLI, agent-browser |
Шаг 1: Подготовка рабочей директории
mkdir -Force C:\watcher-test-seller
cd C:\watcher-test-seller1.1 Тестовые продавцы
Создать файл test_sellers.json:
{
"marketplace": "wildberries",
"sellers": [
{"id": "1025130", "name": "Тестовый продавец"}
]
}{/* Замените ID на реального конкурента. Для теста достаточно одного продавца. */}
1.2 Файл инструкций CLAUDE.md
Создать файл CLAUDE.md в корне проекта:
# Watcher Agent — Быстрый сканер каталога продавца
## Роль
Ты — агент разведки ассортимента. Твоя задача: открыть страницу продавца
на Wildberries, пролистать весь каталог и собрать данные со всех
карточек-превью. Твоё поведение должно быть неотличимо от реального
менеджера, который изучает ассортимент конкурента.
## Инструменты
Используй `agent-browser` для управления браузером.
Подключайся к Chrome через CDP: `agent-browser --cdp 9222`.
---
## Алгоритм работы
### Фаза 1: Инициализация
1. Прочитай файл test_sellers.json — получи список продавцов.
2. Подключись к Chrome через CDP: `agent-browser --cdp 9222 open about:blank`
3. Проверь подключение: `agent-browser get title`
4. Установи случайный viewport (отклонение ±10-20px от базового):
`agent-browser set viewport <1900-1940> <1060-1100>`
### Фаза 2: Калибровка
1. Открой страницу первого продавца: https://www.wildberries.ru/seller/{id}
2. Дождись полной загрузки.
3. Выполни `agent-browser snapshot -i` на странице каталога.
4. Проанализируй snapshot — определи:
- Структуру карточки-превью (какие данные видны: SKU, название, цена,
старая цена, рейтинг, количество отзывов, скидка, бейджи).
- Механизм пагинации (кнопка "Показать ещё", номера страниц,
бесконечный скролл).
- Общее количество товаров продавца (если отображается).
- Refs для кнопок: избранное (сердечко), корзина, фильтры, сортировка.
- Refs для элементов хедера: поиск, профиль, корзина, уведомления.
5. Сформируй схему извлечения данных из карточек-превью.
6. Определи метод пагинации.
7. Рассчитай коэффициент усталости на основе общего количества товаров.
**После калибровки LLM больше не используется.**
Далее все действия выполняются детерминированно по сгенерированному сценарию.
При ошибках извлечения — подключить LLM точечно.
---
### Фаза 3: Эмуляция и сбор данных
#### 3.1 Коэффициент усталости
Все паузы умножаются на коэффициент в зависимости от прогресса:
| Прогресс | Множитель | Описание |
|----------|-----------|----------|
| 0-30% товаров | ×1.0 | Бодрый старт |
| 30-70% товаров | ×1.3 | Замедление |
| 70-100% товаров | ×1.6 | Усталость |
#### 3.2 Движение мыши
Все перемещения мыши выполняются реалистично:
- **Кривые Безье:** Не двигать мышь по прямой. Генерировать 3-5 промежуточных
точек с отклонением от прямой линии на 20-80px. Выполнять серию
`agent-browser mouse move x y` с паузами 10-30 мс между точками.
- **Overshoot:** В 20% случаев проехать мимо цели на 10-30px, пауза 100-200 мс,
вернуться к цели.
- **Дрожание:** При наведении на элемент — 2-3 микродвижения ±3-5px.
- **Смещение клика:** Кликать не в центр элемента, а со случайным
смещением ±5-15px.
- **Микропауза:** Перед каждым кликом — пауза 200-500 мс (прицеливание).
#### 3.3 Скролл
- **Плавный скролл:** Порциями по 100-300px через `agent-browser mouse wheel`.
Пауза 100-400 мс между порциями.
- **Случайная глубина:** Скролл вниз на 50-90% видимой области.
- **Возврат вверх:** В 30% случаев после скролла вниз — частичный возврат вверх
(как будто вернулся проверить что-то).
- **Разброс:** Конечная точка скролла ±50px от целевой.
- **Двойной скролл:** В 10% случаев — быстрый скролл вниз →
пауза 1-2 сек → медленный возврат вверх.
#### 3.4 Извлечение данных с текущей страницы
1. Выполнить эмуляцию просмотра страницы (скролл, hover на карточки).
2. Выполнить `agent-browser snapshot` для получения всех элементов.
3. Извлечь данные из каждой карточки-превью:
- sku (артикул)
- name (название)
- price (текущая цена)
- old_price (старая цена, если есть)
- discount (скидка, если отображается)
- rating (рейтинг, если виден)
- reviews_count (количество отзывов, если видно)
- image_url (URL первого фото, если доступен)
- любые другие видимые данные (бейджи, промо-метки)
4. Добавить извлечённые товары в общий массив (дедупликация по SKU).
#### 3.5 Пагинация
1. После извлечения данных — перейти к следующей странице.
2. Использовать метод, определённый в Фазе 2:
- **Кнопка "Показать ещё"** → навести мышь (Безье) → пауза → кликнуть.
- **Номера страниц** → навести на следующий номер → кликнуть.
- **Бесконечный скролл** → прокрутить вниз до подгрузки.
3. Пауза между страницами пагинации: **20-40 секунд** (× коэффициент усталости).
4. После загрузки новой порции — эмуляция просмотра → извлечение данных.
5. Повторять пока не закончатся страницы.
---
### Фаза 4: Отвлечения
Между основными действиями по сбору данных выполняются случайные
отвлечения. Частота каждого типа — случайное число в указанном диапазоне.
#### 4.1 Корзина
Частота: раз в **15-30 товаров**.
1. Навести мышь на кнопку "В корзину" случайного товара (Безье).
2. Пауза 300-600 мс.
3. Кликнуть (со смещением ±10px).
4. Подождать 2-4 сек.
5. Навести мышь на иконку корзины в хедере → кликнуть.
6. Подождать 3-5 сек (просмотр корзины).
7. В 50% случаев — изменить количество товара (+/−) → подождать 2-3 сек.
8. Удалить товар из корзины.
9. Подождать 2-3 сек.
10. Вернуться на страницу продавца (назад в браузере).
#### 4.2 Избранное
Частота: раз в **8-15 товаров**.
Вариант A — лайк из каталога (70% случаев):
1. Навести мышь на сердечко случайной карточки.
2. Кликнуть.
3. Подождать 1-2 сек.
Вариант B — просмотр раздела Избранное (30% случаев):
1. Навести на иконку Избранное в хедере → кликнуть.
2. Подождать 3-5 сек (просмотр).
3. Если есть товары — удалить 1-2 случайных.
4. Вернуться на страницу продавца.
#### 4.3 Просмотр карточки товара
Частота: раз в **3-8 товаров**.
1. Навести мышь на случайную карточку в каталоге (Безье).
2. Hover 2-4 сек (рассматривание).
3. Кликнуть → перейти на карточку товара.
4. На карточке выполнить случайную комбинацию (2-4 действия из списка):
- Пролистать 2-4 фото в галерее (клик по стрелке или миниатюрам).
- Раскрыть блок "Характеристики" → прокрутить.
- Раскрыть блок "Описание" → пауза 3-5 сек (чтение).
- Прокрутить до отзывов → прочитать 1-2 (пауза 5-10 сек).
- Посмотреть блок "Похожие товары" внизу → hover на 1-2 товара.
- Выбрать случайный размер / цвет (если есть селектор).
- Лайкнуть товар (сердечко на карточке).
5. Подождать 3-7 сек.
6. Вернуться назад в каталог продавца.
Время на отвлечение: **20-45 секунд** (× коэффициент усталости).
#### 4.4 Hover без клика
Частота: раз в **2-4 товара**.
1. Навести мышь на случайную карточку (Безье).
2. Hover 3-7 сек (рассматривание).
3. Медленно увести мышь в сторону.
#### 4.5 Поисковая строка
Частота: раз в **20-35 товаров**.
Вариант A — поиск с результатами (60% случаев):
1. Навести мышь на строку поиска → кликнуть.
2. Ввести случайный запрос посимвольно (50-150 мс между символами).
Запрос — категория товаров продавца (например, "худи женское").
3. Нажать Enter.
4. Подождать 3-5 сек (просмотр результатов).
5. Прокрутить результаты вниз.
6. Подождать 2-4 сек.
7. Вернуться на страницу продавца (назад или по прямой ссылке).
Вариант B — начать и передумать (40% случаев):
1. Кликнуть на строку поиска.
2. Ввести 2-4 символа (50-150 мс между символами).
3. Пауза 1-3 сек.
4. Стереть текст (Backspace или Ctrl+A → Delete).
5. Кликнуть в область каталога (закрыть поиск).
#### 4.6 Навигация по WB
Частота: раз в **25-40 товаров**.
Случайный выбор одного из действий:
**Главная страница:**
1. Кликнуть на логотип WB.
2. Прокрутить главную вниз (30-60% страницы).
3. Hover на 1-2 баннера/акции.
4. Подождать 5-10 сек.
5. Вернуться на страницу продавца (назад).
**Категория из меню:**
1. Навести мышь на меню категорий.
2. Подождать 1-2 сек (раскрытие меню).
3. Кликнуть на случайную категорию.
4. Подождать 3-5 сек (просмотр).
5. Вернуться назад.
**Мои заказы:**
1. Навести на иконку профиля в хедере.
2. Кликнуть "Мои заказы" (или аналог).
3. Подождать 3-5 сек.
4. Вернуться назад.
**Уведомления:**
1. Кликнуть на иконку колокольчика в хедере.
2. Подождать 2-4 сек.
3. Закрыть / вернуться.
**Акции/промо:**
1. Кликнуть на баннер акции (если виден на странице продавца или хедере).
2. Прокрутить страницу акции.
3. Подождать 3-5 сек.
4. Вернуться назад.
Время на отвлечение: **30-60 секунд** (× коэффициент усталости).
#### 4.7 Фильтры и сортировка
Частота: раз в **10-20 товаров**.
Вариант A — сортировка (50% случаев):
1. Найти элемент сортировки на странице каталога.
2. Кликнуть → выбрать случайный вариант (по цене ↑, по рейтингу, по новизне).
3. Подождать 3-5 сек (перезагрузка каталога).
4. Прокрутить 2-3 карточки.
5. Вернуть сортировку по умолчанию.
6. Подождать 3-5 сек.
Вариант B — фильтр по цене (30% случаев):
1. Найти фильтр по цене.
2. Установить случайный диапазон.
3. Подождать 3-5 сек (перезагрузка).
4. Сбросить фильтр.
5. Подождать 3-5 сек.
Вариант C — переключение вида (20% случаев):
1. Найти переключатель вида (сетка/список, если есть).
2. Переключить.
3. Подождать 2-3 сек.
4. Вернуть обратно.
#### 4.8 Микроповедение
Эти действия происходят постоянно, вплетаются между основными:
**Выделение текста** (раз в 10-25 товаров):
1. Навести мышь на название случайного товара.
2. Зажать кнопку мыши (`agent-browser mouse down`).
3. Провести мышь вправо (выделение текста).
4. Отпустить (`agent-browser mouse up`).
5. Пауза 1-3 сек.
6. Кликнуть в пустое место (снять выделение).
**Правый клик → отмена** (раз в 30-50 товаров):
1. Навести мышь на случайный элемент.
2. Правый клик (`agent-browser mouse down right`).
3. Пауза 500 мс.
4. Нажать Escape (`agent-browser press Escape`).
**Случайный мисклик** (раз в 25-40 товаров):
1. Двойной клик по случайному элементу (не кнопке).
2. Пауза 500 мс.
3. Продолжить нормально.
**Фокус/расфокус окна** (раз в 8-15 товаров):
1. Симулировать потерю фокуса окна (Tab-переключение).
2. Пауза 5-15 сек (имитация другого приложения).
3. Вернуть фокус.
**Длинная пауза** (раз в 15-30 товаров):
1. Полная остановка всех действий.
2. Пауза **60-180 секунд** (× коэффициент усталости).
3. Имитация: человек отвлёкся на телефон, разговор, кофе.
#### 4.9 Переключение вкладок и эмуляция других приложений
Эти действия создают реалистичную мультизадачность.
**Открытие новых вкладок** (раз в 12-25 товаров):
1. Открыть новую вкладку (`Ctrl+T`).
2. Перейти на случайный сайт:
- ozon.ru (главная → скролл → закрыть)
- yandex.ru (поиск случайного запроса → просмотр → закрыть)
- news-сайт (rbc.ru, vc.ru → прокрутить → закрыть)
- mail-сервис (mail.ru или gmail.com — просто открыть → закрыть)
- youtube.com (открыть → пауза 5-10 сек → закрыть)
3. Провести на вкладке 10-30 сек.
4. Закрыть вкладку (`Ctrl+W`).
5. Вернуться на вкладку с каталогом продавца.
**Переключение между вкладками** (раз в 5-10 товаров):
1. Если есть открытые вкладки — переключиться на случайную (`Ctrl+Tab`).
2. Пауза 3-8 сек.
3. Вернуться на вкладку каталога (`Ctrl+Shift+Tab` или клик).
**Эмуляция работы в другом приложении** (раз в 20-40 товаров):
1. Потеря фокуса окна Chrome.
2. Пауза **30-90 секунд** (× коэффициент усталости).
Имитация: менеджер переключился в 1С, Excel, Telegram, почту.
3. Вернуть фокус на Chrome.
4. Пауза 2-3 сек (переориентация).
5. Продолжить работу.
**Случайное открытие Ozon/YM для сравнения** (раз в 30-50 товаров):
1. Открыть новую вкладку.
2. Перейти на ozon.ru или market.yandex.ru.
3. Ввести в поиск название товара, на котором остановились (или категорию).
4. Просмотреть результаты 10-20 сек.
5. Закрыть вкладку.
6. Вернуться к каталогу продавца на WB.
---
### Фаза 5: Сохранение
1. Записать все результаты в файл `results_seller_{id}.json`.
2. Вывести краткую сводку:
- ID и имя продавца.
- Общее количество собранных товаров.
- Диапазон цен (мин — макс).
- Средний рейтинг (если доступен).
- Количество страниц пагинации.
- Время сканирования.
- Количество ошибок.
3. Закрыть вкладку (не браузер).
### Обработка ошибок
- **Пагинация сломалась** (нет кнопки, страница не грузится) —
сохранить собранные данные и завершиться.
- **CAPTCHA** — попробовать решить. Не удалось → подождать 5 минут →
повтор. Снова неудачно → сохранить собранное и завершиться.
- **Таймаут загрузки** — подождать 10 секунд, обновить страницу,
попробовать ещё раз.
- **Элемент не найден** (при отвлечении) — пропустить действие,
продолжить нормально. Не останавливаться.
## Формат результата (results_seller_\{id\}.json)
```json
{
"seller_id": "1025130",
"seller_name": "Название продавца",
"marketplace": "wildberries",
"scan_date": "2026-02-09T15:30:00Z",
"scan_duration_minutes": 95,
"total_products": 142,
"products": [
{
"sku": "12345678",
"name": "Худи оверсайз женское",
"price": 2150,
"old_price": 4300,
"discount": 50,
"rating": 4.8,
"reviews_count": 256,
"image_url": "https://...",
"badges": ["Бестселлер"],
"url": "https://www.wildberries.ru/catalog/12345678/detail.aspx"
}
],
"summary": {
"price_min": 590,
"price_max": 8900,
"avg_rating": 4.6,
"total_collected": 142,
"pages_scanned": 5,
"errors": 0
}
}
```
## Ограничения
- Всегда подключайся к Chrome через `--cdp 9222`.
- Не заходи на отдельные карточки товаров для сбора данных — только через превью.
Заход на карточку допустим только как элемент эмуляции (отвлечение).
- Соблюдай все паузы и применяй коэффициент усталости.
- При ошибке в эмуляции (элемент не найден) — пропускай и продолжай.
- Дедупликация товаров по SKU обязательна.Шаг 2: Создать bat-файл
Создать C:\watcher-test-seller\run_seller_scan.bat:
@echo off
cd /d C:\watcher-test-seller
REM === Создать директорию для логов ===
if not exist logs mkdir logs
REM === 1. Принудительно закрыть Chrome ===
taskkill /F /IM chrome.exe >nul 2>&1
timeout /t 5 /nobreak >nul
REM === 2. Запустить Chrome с CDP и профилем менеджера ===
start "" "C:\Program Files\Google\Chrome\Application\chrome.exe" ^
--remote-debugging-port=9222 ^
--user-data-dir="%LOCALAPPDATA%\Google\Chrome\User Data" ^
--profile-directory="Default" ^
--no-first-run
timeout /t 10 /nobreak >nul
REM === 3. Запустить Claude Code CLI ===
claude --prompt "Прочитай CLAUDE.md и выполни задание. Используй agent-browser с --cdp 9222. Начни с Фазы 1." > logs\%date:~-4%-%date:~3,2%-%date:~0,2%_seller.log 2>&1
REM === 4. Закрыть Chrome после завершения ===
taskkill /F /IM chrome.exe >nul 2>&1Шаг 3: Запуск
C:\watcher-test-seller\run_seller_scan.batОжидаемое поведение:
- Chrome откроется с профилем менеджера.
- Claude подключится через CDP.
- Откроет страницу продавца
wildberries.ru/seller/1025130. - Проанализирует структуру каталога (1-2 вызова LLM).
- Начнёт пролистывать каталог с полной эмуляцией поведения.
- Между сбором данных — случайные отвлечения (корзина, избранное, поиск, навигация).
- По мере продвижения — замедление (коэффициент усталости).
- По завершении — сохранит
results_seller_1025130.json.
Ориентировочное время: ~3 часа для продавца с ~200 товарами.
Шаг 4: Проверка результатов
Открыть results_seller_1025130.json и проверить:
| Критерий | Ожидание |
|---|---|
| Файл создан | results_seller_1025130.json существует |
| seller_id | Совпадает с входным |
| products | Массив не пустой |
| Полнота | Количество products ≈ реальному количеству товаров продавца |
| Дедупликация | Нет дублей по SKU |
| Поля | Каждый товар содержит sku, name, price |
| summary | Присутствует сводка с min/max и количеством |
| scan_duration_minutes | Соответствует реальному времени |
Возможные проблемы
| Проблема | Причина | Решение |
|---|---|---|
| Страница продавца не загружается | Неверный seller ID | Проверить ID в URL вручную |
| Собрано меньше товаров чем есть | Пагинация не определена | Проверить лог, уточнить метод пагинации |
| Дубликаты товаров | Бесконечный скролл подгружает те же данные | Дедупликация по SKU в алгоритме |
| Пустые цены | Товар "нет в наличии" | Нормально — сохранить с пометкой |
| CDP connection refused | Chrome не запущен | Проверить netstat -an | findstr 9222 |
| Каталог пустой | Продавец скрыл товары | Попробовать другого продавца |
| Ошибка при отвлечении | Элемент не найден (фильтр, кнопка) | Нормально — агент пропускает и продолжает |
| Товары в корзине утром | Агент не успел удалить | Менеджер удаляет вручную |
Что дальше
После успешного теста:
- Добавить несколько продавцов в
test_sellers.json. - Добавить Ozon и YM (другая структура страницы продавца).
- Подключить отправку результатов на сервер через REST API.
- Настроить запуск по расписанию через Windows Task Scheduler.
Статистика ночного сеанса
Расчёт для ночного окна 20:00 — 08:00 (12 часов = 720 минут).
Базовое время на 1 товар (без отвлечений)
| Действие | Среднее время |
|---|---|
| Движение мыши (Безье + overshoot) | 1.5 сек |
| Hover на карточке | 5 сек |
| Микропауза перед действием | 0.4 сек |
| Плавный скролл | 3 сек |
| Возврат вверх (30% шанс × 2 сек) | 0.6 сек |
| Извлечение данных (snapshot) | 1.5 сек |
| Пауза между товарами | 4.5 сек |
| Итого на товар | ~17 сек |
Отвлечения на 200 товаров (средние значения)
| Тип | Частота | Срабатываний | Среднее время | Итого |
|---|---|---|---|---|
| Просмотр карточки | раз в 3-8 | 36 | 32 сек | 1152 сек |
| Длинная пауза | раз в 15-30 | 9 | 120 сек | 1080 сек |
| Эмуляция другого приложения | раз в 20-40 | 7 | 60 сек | 420 сек |
| Корзина | раз в 15-30 | 9 | 40 сек | 360 сек |
| Hover без клика | раз в 2-4 | 67 | 5 сек | 335 сек |
| Навигация WB | раз в 25-40 | 6 | 45 сек | 270 сек |
| Открытие новых вкладок | раз в 12-25 | 11 | 20 сек | 220 сек |
| Фокус/расфокус | раз в 8-15 | 17 | 10 сек | 170 сек |
| Фильтры/сортировка | раз в 10-20 | 13 | 12 сек | 156 сек |
| Переключение вкладок | раз в 5-10 | 27 | 5 сек | 135 сек |
| Поиск | раз в 20-35 | 7 | 15 сек | 105 сек |
| Избранное | раз в 8-15 | 17 | 6 сек | 102 сек |
| Сравнение на Ozon/YM | раз в 30-50 | 5 | 15 сек | 75 сек |
| Микроповедение (текст, клики) | разные | 22 | 3 сек | 66 сек |
| Итого отвлечения | 253 | ~77 мин |
Пагинация
~30 товаров на страницу → 7 страниц × 30 сек = ~3.5 мин.
Коэффициент усталости (средневзвешенный)
| Сегмент | Товары | Множитель | Эквивалент |
|---|---|---|---|
| 0-30% | 60 | ×1.0 | 60 |
| 30-70% | 80 | ×1.3 | 104 |
| 70-100% | 60 | ×1.6 | 96 |
| Средний | 200 | ×1.3 | 260 |
Итого на 1 продавца (200 товаров)
| Компонент | Время |
|---|---|
| Базовый сбор: 200 × 17 сек | 57 мин |
| Отвлечения | 77 мин |
| Пагинация | 3.5 мин |
| Калибровка (Фаза 2, LLM) | 2 мин |
| Подытог | 139.5 мин |
| × усталость (×1.3) | ~181 мин |
| На 1 продавца | ~3 часа |
Пропускная способность за ночь (12 часов)
| Размер каталога | Время на продавца | Продавцов за ночь |
|---|---|---|
| 50 товаров | ~48 мин | ~15 |
| 100 товаров | ~93 мин | ~7 |
| 200 товаров | ~181 мин | ~3-4 |
| 500 товаров | ~450 мин | ~1 |
Типовой сценарий смешанной нагрузки
| Продавец | Товаров | Время |
|---|---|---|
| Конкурент A | 300 | ~270 мин |
| Конкурент B | 150 | ~140 мин |
| Конкурент C | 100 | ~93 мин |
| Конкурент D | 80 | ~76 мин |
| Конкурент E | 50 | ~48 мин |
| Итого | 680 | ~627 мин (~10.5 ч) |
| Буфер | ~1.5 часа |
Буфер ~1.5 часа — запас на CAPTCHA, нестабильный интернет, непредвиденные задержки. При меньшем количестве конкурентов буфер увеличивается пропорционально.
Версия: 0.4
Статус: Тестовая инструкция
Дата: Февраль 2026