Ты — Claude Code (код-агент). Твоя задача: реализовать воспроизводимый сбор данных и сохранить итог в Excel.
ПЕРВЫЙ ШАГ (ОБЯЗАТЕЛЬНО: спроси данные, НЕ НАЧИНАЙ СБОР, пока не получишь ответы) Сначала задай пользователю ровно 5 вопросов (в одном сообщении), чтобы настроить поиск:
- Какой населённый пункт ищем? (точное название как “в идеале в документах”)
- Какие административные привязки считать “якорями”? (район/уезд/волость/регион/АССР/губерния — перечисли, что есть)
- Какие известные разночтения/варианты написания уже встречались? (хотя бы 3–10 примеров)
- Какие критерии включения? (включать только родившихся там, или также проживавших/призванных/захороненных, если география совпадает?)
- Нужны все участники или только определённые категории? (погибшие/пропавшие/все)
Если пользователь не отвечает на какой-то пункт — прими разумные значения по умолчанию и явно перечисли, что именно принял по умолчанию.
ПОСЛЕ ТОГО КАК ПОЛУЧИШЬ ОТВЕТЫ — ВЫПОЛНИ ЗАДАЧУ НИЖЕ.
КОНТЕКСТ / ЦЕЛЬ Нужно найти все упоминания солдат, связанных с указанным пользователем населённым пунктом (с учётом разночтений), которые участвовали во Второй мировой / Великой Отечественной войне, используя сайт https://warsearch.ru как источник, и сформировать Excel-таблицу результатов.
ЧТО ДОЛЖНО БЫТЬ НА ВЫХОДЕ Создай файл: results.xlsx со следующими листами:
Лист 1: "Итог" Колонки (строго в таком порядке):
- ФИО солдата
- Год рождения
- Статус участия в войне (нормализованный: убит / умер от ран / пропал без вести / плен / ранен / вернулся / жив / другое)
- Ссылка warsearch (на карточку/профиль на warsearch.ru)
- Ссылка "Память народа" (прямая, если есть)
- Основание “наш” (коротко: A / B / C)
- География (как в источнике: место рождения/призыва/жительства/др.)
Лист 2: "Кандидаты" Те, кто похож, но география не подтверждена. Колонки: ФИО,Год рождения,Причина сомнения,Ссылка warsearch,Заметка по географии
Лист 3: "Журнал" Каждая строка — одна попытка по одному варианту запроса: Вариант запроса,Попытка (1/2/3),Итоговый сигнал (A/B/C/D/НЕОПРЕДЕЛЕНО),Найдено,Включено,Исключено,Комментарий
Лист 4: "Варианты" Список всех вариантов написания, которые ты реально использовал.
ПРАВИЛА “НАШ/НЕ НАШ” (параметризуются ответами пользователя) На основе ответов пользователя зафиксируй критерии включения. По умолчанию используй:
A) Явно указано название населённого пункта (или близкий вариант) в месте рождения/проживания/призыва/захоронения B) Указаны административные “якоря” (район/регион/РВК и т.п. из ответа пользователя) + одновременно встречается короткий вариант названия (если используется “короткий” поиск) C) В карточке есть прямая ссылка на "Память народа" и она подтверждает нужную географию (или warsearch уже однозначно связывает)
Если связь не доказана — НЕ включай в "Итог", отправляй в "Кандидаты".
КРИТИЧЕСКОЕ: ЖЁСТКИЙ WAIT-РЕЖИМ (warsearch “думает”) warsearch.ru часто грузит выдачу/карточки с задержкой. Ты НЕ ИМЕЕШЬ ПРАВА писать “0 результатов” или идти дальше, пока не увидишь один из ДОКАЗАТЕЛЬНЫХ СИГНАЛОВ:
СИГНАЛЫ (для выдачи И карточек) A) На странице виден список результатов (строки/карточки/таблица) B) Видно число результатов (“найдено N” или аналог) C) Видна пагинация (страницы 1,2,3…/“следующая”) D) Виден явный текст “ничего не найдено / 0 результатов / не найдено”
Если ни A/B/C/D нет — считаем, что страница НЕ ЗАГРУЗИЛАСЬ.
ПРОТОКОЛ ОЖИДАНИЯ (для кода) После каждого действия (запрос, переход, карточка, пагинация):
- Попытка 1: ждать 8–12 секунд + проверить A/B/C/D
- Если нет: скролл/повторная проверка + ещё 3–5 секунд
- Попытка 2: один refresh страницы + ждать 8–12 секунд + проверка A/B/C/D
- Попытка 3: повторить действие + ждать 8–12 секунд + проверка A/B/C/D
- Только если увидел D — фиксируй “0”.
- Если после 3 попыток нет A/B/C/D — фиксируй “НЕОПРЕДЕЛЕНО” в "Журнал" и переходи дальше.
ПОВЕДЕНИЕ ДЛЯ “ОЧЕНЬ ОБЩИХ” ВАРИАНТОВ
- Никогда не принимай результаты по коротким/общим вариантам без сужения административными “якорями”.
- Если интерфейс позволяет — добавляй слова-якоря в запрос/фильтры.
- Иначе отбрасывай записи без подтверждения якорей.
ТЕХНИЧЕСКАЯ РЕАЛИЗАЦИЯ
- Создай структуру:
- scraper.py (основной скрипт)
- requirements.txt
- README.md (как запустить)
- results.xlsx (генерируется)
- Python + Playwright (headless=false по умолчанию).
- Выдача: собрать ссылки на карточки со всех страниц (пагинация до конца).
- Карточка: извлечь ФИО, год рождения, статус (сырой), географию (сырьём), ссылку на “Память народа” (если есть), ссылку на карточку warsearch.
- Нормализация статуса: маппинг по ключевым словам; неизвестное → “другое”.
- Дедуп: ключ = нормализованное ФИО (ё→е, пробелы, регистр) + год рождения; статус конфликт → финальный приоритет: убит > умер от ран > пропал без вести > плен > ранен > вернулся > жив > другое
- Excel: openpyxl или pandas+openpyxl. Автофильтр, закрепить верхнюю строку, кликабельные ссылки.
- Ограничение скорости: паузы 0.8–1.5 сек с джиттером.
ШАГ 1 — ВАРИАНТЫ НАПИСАНИЯ На основе ответов пользователя:
- сформируй “нормальные” варианты (дефисы/пробелы/склонения),
- “короткие” (осторожно),
- OCR-искажения (5–12 самых вероятных), и запиши реальный список на лист "Варианты".
ШАГ 2 — ОБХОД ВАРИАНТОВ Для каждого варианта:
- выполнить поиск на warsearch.ru
- соблюсти WAIT-РЕЖИМ, дождаться A/B/C/D и записать строку в "Журнал"
- пройти пагинацию до конца, собрать карточки
- обработать карточки с WAIT-РЕЖИМОМ, извлечь поля, решить “наш/кандидат/мимо”
- обновлять счётчики “найдено/включено/исключено” в "Журнал"
ACCEPTANCE (критерий приёмки)
- results.xlsx создан
- "Итог" содержит только подтверждённых “наших”
- "Кандидаты" содержит сомнительные с причиной
- "Журнал" содержит строки по каждому варианту и подтверждение A/B/C/D/НЕОПРЕДЕЛЕНО
- Код запускается одной командой и описан в README
НАЧИНАЙ Сначала задай 5 вопросов, затем после ответов — реализуй код, запусти и сгенерируй results.xlsx.