[HIGH] tradein/scraper: капча Циана и пустые выдачи Яндекса засчитываются как успешный прогон — 41 из 68 прогонов за 2 недели забрали ноль лотов без ед… #2625

Closed
opened 2026-08-02 11:24:00 +00:00 by lekss361 · 5 comments
Owner

Найдено 2026-08-02 при проверке включения вторички Циана по области (#2623). Оказалось, фильтр новостроек был не единственной и даже не главной причиной, почему по области нет данных.

Что происходит

Запустил тагильскую развёртку Циана вне расписания. Прогон завершился со статусом done, errors_count: 0, http_errors: 0, lots_fetched: 0. В логах при этом:

WARNING scraper_kit.providers.cian.serp: cian SERP state extraction failed
  (mfe=frontend-serp key=initialState) — возможно Cian изменил структуру или вернул captcha
INFO  cian: 0 lots fetched rooms=(1,) page=1 url=https://ekb.cian.ru/cat.php?...&region=4886&room1=1

И так на всех четырёх запросах по комнатности. То есть капча (или смена вёрстки) засчитывается как «ничего не нашлось»: счётчик ошибок не растёт, статус done, для мониторинга прогон выглядит успешным.

Масштаб

Прогоны со статусом done и lots_fetched = 0 за 14 дней:

источник прогонов из них пустых
yandex 33 24 (73%)
cian 35 17 (49%)
avito 13 0
domclick 2 0

По городским развёрткам Циана:

развёртка прогонов пустых с ошибками % пустых
cian_city_sweep_serov 1 1 0 100%
cian_city_sweep (ЕКБ) 15 8 7 53%
cian_city_sweep_kamensk_uralskiy 2 1 0 50%
cian_city_sweep_nizhniy_tagil 15 7 0 47%

半 прогонов Циана и три четверти прогонов Яндекса не приносят ничего — и ни один не помечен как проблемный.

Показательно, что Авито и Домклик дают ноль пустых прогонов: у них детект блокировки реализован (статус banned, см. AvitoBlockedErrormark_banned). У Циана и Яндекса такого пути нет.

Почему это важнее, чем кажется

  1. Диагностика уводится не туда. Мы полдня считали, что по области нет вторички из-за фильтра новостроек. Фильтр действительно был неверен (#2623 исправлен), но даже после починки данных не прибавится, пока половина прогонов упирается в капчу.
  2. Нет сигнала для ротации IP. Ротация по бану (#2611) существует, но триггерить её нечем: бан не распознаётся. То же самое, что уже описано в #2600 п.2 для Авито, но здесь ещё хуже — там хотя бы заглушка детектится по тексту.
  3. Это четвёртый случай за сутки одного и того же класса: сбой, выглядящий как успех. Предыдущие три — геокодирование с saved=0 восемь ночей (#2604), снапшоты в zombie шесть ночей (#2607), задача с done и нулевым результатом. Общее у всех: статус прогона не отражает, сделал ли он работу.

Что делать

1. Отличать «пусто» от «заблокировали». В providers/cian/serp.py предупреждение о неудачной экстракции состояния уже есть — надо превратить его в счётчик и в статус. Если состояние не извлеклось на ВСЕХ запросах якоря — это блокировка, а не пустая выдача, и прогон должен уходить в banned, как у Авито. То же для Яндекса.

2. Алерт на бизнес-результат, а не на статус. Прогон done с нулевым результатом N раз подряд по одному источнику должен подниматься. Механизм алерта в services/scrape_runs.py считает только failed/banned — он структурно не видит этот класс.

3. Связать с ротацией. Как только блокировка распознаётся, появляется триггер для POST /api/v1/admin/proxies/{id}/rotate (#2611) — сейчас ротация есть, но вызывать её нечему.

4. Разобраться, почему именно Циан. Прогон 2026-08-01 09:11 забрал 184 лота — значит конфигурация рабочая, дело в противодействии. Проверить, коррелирует ли успех с конкретным прокси (в пробном прогоне использовался id=10 asocks-mobile-2, тот самый, что утром отдавал 502).

Связанное

#2623 (включение вторички по области — необходимо, но недостаточно), #2600 (сигнал бана до пула прокси), #2611 (ротация), #2604 и #2607 (тот же класс молчаливых сбоев).

Найдено 2026-08-02 при проверке включения вторички Циана по области (#2623). Оказалось, фильтр новостроек был не единственной и даже не главной причиной, почему по области нет данных. ## Что происходит Запустил тагильскую развёртку Циана вне расписания. Прогон завершился со статусом `done`, `errors_count: 0`, `http_errors: 0`, `lots_fetched: 0`. В логах при этом: ``` WARNING scraper_kit.providers.cian.serp: cian SERP state extraction failed (mfe=frontend-serp key=initialState) — возможно Cian изменил структуру или вернул captcha INFO cian: 0 lots fetched rooms=(1,) page=1 url=https://ekb.cian.ru/cat.php?...&region=4886&room1=1 ``` И так на всех четырёх запросах по комнатности. То есть **капча (или смена вёрстки) засчитывается как «ничего не нашлось»**: счётчик ошибок не растёт, статус `done`, для мониторинга прогон выглядит успешным. ## Масштаб Прогоны со статусом `done` и `lots_fetched = 0` за 14 дней: | источник | прогонов | из них пустых | |---|---|---| | **yandex** | 33 | **24 (73%)** | | **cian** | 35 | **17 (49%)** | | avito | 13 | 0 | | domclick | 2 | 0 | По городским развёрткам Циана: | развёртка | прогонов | пустых | с ошибками | % пустых | |---|---|---|---|---| | `cian_city_sweep_serov` | 1 | 1 | 0 | 100% | | `cian_city_sweep` (ЕКБ) | 15 | 8 | 7 | 53% | | `cian_city_sweep_kamensk_uralskiy` | 2 | 1 | 0 | 50% | | `cian_city_sweep_nizhniy_tagil` | 15 | 7 | 0 | 47% | 半 прогонов Циана и три четверти прогонов Яндекса не приносят ничего — и ни один не помечен как проблемный. Показательно, что Авито и Домклик дают ноль пустых прогонов: у них детект блокировки реализован (статус `banned`, см. `AvitoBlockedError` → `mark_banned`). У Циана и Яндекса такого пути нет. ## Почему это важнее, чем кажется 1. **Диагностика уводится не туда.** Мы полдня считали, что по области нет вторички из-за фильтра новостроек. Фильтр действительно был неверен (#2623 исправлен), но даже после починки данных не прибавится, пока половина прогонов упирается в капчу. 2. **Нет сигнала для ротации IP.** Ротация по бану (#2611) существует, но триггерить её нечем: бан не распознаётся. То же самое, что уже описано в #2600 п.2 для Авито, но здесь ещё хуже — там хотя бы заглушка детектится по тексту. 3. **Это четвёртый случай за сутки** одного и того же класса: сбой, выглядящий как успех. Предыдущие три — геокодирование с `saved=0` восемь ночей (#2604), снапшоты в `zombie` шесть ночей (#2607), задача с `done` и нулевым результатом. Общее у всех: **статус прогона не отражает, сделал ли он работу**. ## Что делать **1. Отличать «пусто» от «заблокировали».** В `providers/cian/serp.py` предупреждение о неудачной экстракции состояния уже есть — надо превратить его в счётчик и в статус. Если состояние не извлеклось на ВСЕХ запросах якоря — это блокировка, а не пустая выдача, и прогон должен уходить в `banned`, как у Авито. То же для Яндекса. **2. Алерт на бизнес-результат, а не на статус.** Прогон `done` с нулевым результатом N раз подряд по одному источнику должен подниматься. Механизм алерта в `services/scrape_runs.py` считает только `failed`/`banned` — он структурно не видит этот класс. **3. Связать с ротацией.** Как только блокировка распознаётся, появляется триггер для `POST /api/v1/admin/proxies/{id}/rotate` (#2611) — сейчас ротация есть, но вызывать её нечему. **4. Разобраться, почему именно Циан.** Прогон 2026-08-01 09:11 забрал 184 лота — значит конфигурация рабочая, дело в противодействии. Проверить, коррелирует ли успех с конкретным прокси (в пробном прогоне использовался id=10 `asocks-mobile-2`, тот самый, что утром отдавал 502). ## Связанное #2623 (включение вторички по области — необходимо, но недостаточно), #2600 (сигнал бана до пула прокси), #2611 (ротация), #2604 и #2607 (тот же класс молчаливых сбоев).
Collaborator

Пункты 1 и 2 закрыты в PR #2642 (merged): Cian — детект провала Redux-state extraction (все запросы прогона провалили → banned, как у Avito; частичный fail не флапает; честная пустота с валидным state остаётся done); Yandex — то же через _extract_gate_data-классификацию во всех терминальных исходах, включая schema-drift «response без search.offers», _probe и пагинацию page≥2. Алерт: 3 подряд done с нулевым результатом по источнику — существующим _alert_on_run_id-механизмом.

Пункт 3 (связка с ротацией #2611): banned-статус теперь достижим как триггер, сам вызов ротации не подключён — ASOCKS_API_TOKEN ждёт владельца (#2638-кластер). Пункт 4 (корреляция успеха с конкретным прокси) — не делался, остаётся в issue.

Верификация на живом капча-эпизоде: после следующего прогона Cian/Yandex со 100% провалом экстракции ожидаем в scrape_runs статус banned вместо done. Не закрываю issue до этого наблюдения + пунктов 3-4.

Пункты 1 и 2 закрыты в PR #2642 (merged): Cian — детект провала Redux-state extraction (все запросы прогона провалили → `banned`, как у Avito; частичный fail не флапает; честная пустота с валидным state остаётся `done`); Yandex — то же через `_extract_gate_data`-классификацию во всех терминальных исходах, включая schema-drift «response без search.offers», `_probe` и пагинацию page≥2. Алерт: 3 подряд `done` с нулевым результатом по источнику — существующим `_alert_on_run_id`-механизмом. Пункт 3 (связка с ротацией #2611): `banned`-статус теперь достижим как триггер, сам вызов ротации не подключён — `ASOCKS_API_TOKEN` ждёт владельца (#2638-кластер). Пункт 4 (корреляция успеха с конкретным прокси) — не делался, остаётся в issue. Верификация на живом капча-эпизоде: после следующего прогона Cian/Yandex со 100% провалом экстракции ожидаем в `scrape_runs` статус `banned` вместо `done`. Не закрываю issue до этого наблюдения + пунктов 3-4.
Collaborator

Живое подтверждение детекта (обещанная верификация на реальном эпизоде).

Первый прогон domclick_detail_backfill после возврата джобы (#2636), 05.08 07:29:

{"failed": 0, "blocked": 3, "enriched": 0, "attempted": 3, "duration_sec": 49}

Три подряд challenge-страницы → blocked=3, failed=0, block-breaker остановил прогон на пороге за 49 секунд. До фикса это были бы 3 «failed» и прожиг батча дальше (до 100 запросов по заблокированному ресурсу).

Это Домклик (его детект чинился в #2645 тем же классом-фиксом). Для Cian/Yandex — детект из этого issue задеплоен, ждём их ближайшего капча-эпизода: критерий прежний — прогон со 100% провалом экстракции должен дать banned, а не done+0. Плюс подстрахован алертом на 3 подряд done с нулевым результатом.

Живое подтверждение детекта (обещанная верификация на реальном эпизоде). Первый прогон `domclick_detail_backfill` после возврата джобы (#2636), 05.08 07:29: ``` {"failed": 0, "blocked": 3, "enriched": 0, "attempted": 3, "duration_sec": 49} ``` Три подряд challenge-страницы → **`blocked=3`, `failed=0`**, block-breaker остановил прогон на пороге за 49 секунд. До фикса это были бы 3 «failed» и прожиг батча дальше (до 100 запросов по заблокированному ресурсу). Это Домклик (его детект чинился в #2645 тем же классом-фиксом). Для Cian/Yandex — детект из этого issue задеплоен, ждём их ближайшего капча-эпизода: критерий прежний — прогон со 100% провалом экстракции должен дать `banned`, а не `done`+0. Плюс подстрахован алертом на 3 подряд `done` с нулевым результатом.
Collaborator

Замер прода 2026-08-10 + остаток закрыт в PR #2813 (merged).

Что уже покрыто соседними правками. Пп. 1-2 закрыл #2642. Симптом на проде исчез — развёртки cian_city_sweep*/yandex_city_sweep*/*_full_load:

эра done из них с нулём banned failed
до #2642 (21.07 → 04.08 19:00 UTC) 89 42 (47%) 0 0
после (04.08 19:00 → 10.08) 30 1 (3%) 0 0

Числа из тела issue (yandex 24/33, cian 17/35) воспроизвелись и ушли.

Опровергнутая предпосылка — важнее самой починки. banned = 0 в ОБЕИХ колонках. Значит падение 42 → 1 дал не детект #2642, а то, что сбор реально заработал (#2796, #2798, #2800-#2805, #2804). Детект #2642 на проде не срабатывал ни разу за 5.5 суток. Комментарий от 04.08 обещал верификацию «на живом капча-эпизоде Cian/Yandex» — эпизода не было, домкликовский blocked=3 из комментария 05.08 подтверждал ДРУГОЙ детект (#2645), не этот. Правильность #2642 на сегодня подтверждена только юнит-тестами.

Что осталось и починено. Прогон 3557 (yandex_city_sweep_pervouralsk, 09.08 17:11): 155 мс, anchors_total=1, errors_count=1, lots_fetched=0, статус done. Не новый: за 90 суток 28 таких прогонов, включая yandex_city_sweep_nizhniy_tagil — 16 суток подряд (15-30.07), каждый ровно 240 с (таймаут якоря), ноль лотов, done.

Детект #2642 их не видит и правильно не видит: он считает попытки РАЗБОРА, а transport_error туда не попадает намеренно (#2600 п.1). Якорь, упавший до первого разобранного ответа, даёт attempts = 0 — условие attempts > 0 and failures == attempts молчит.

Три случая разведены:

случай статус
площадка отбила (структура не извлеклась ни разу) banned#2642
площадка честно отдала пустоту done — здоровый ответ, сохранён
мы не дошли (таймаут / исключение якоря) donefailed#2813

Признак — errors_count >= anchors_total при измеренном нуле. Доказывает: каждый якорь кончился отказом, собрано ноль. НЕ доказывает, кто виноват — поэтому failed без ban_kind, а не banned/platform (#2764). На маркеры не опирается вовсе.

Ложной тревоги нет (90 суток): 132 прогона с отказами, но ненулевым сбором, и 37 прогонов честной пустоты (errors_count = 0) остаются done.

По п. 2 задачи — пустая выдача Яндекса. Отличима структурно: валидный gate-JSON с pager и entities = [] — честная пустота; неразобранный ответ — «отбили или сменили API». Кто именно отбил, по ответу НЕ определяется, и выдуманная причина туда не подставляется.

Критерий приёмки, записан ДО факта. Ближайшие способные сработать прогоны: yandex_city_sweep_nizhniy_tagil (~14:10 UTC ежедневно), yandex_city_sweep_pervouralsk (~17:10 UTC, раз в 3 суток). Проверка 11.08 после 18:00 UTC:

SELECT id, source, status, error, counters->>'errors_count' AS errs,
       counters->>'anchors_total' AS anchors, counters->>'lots_fetched' AS lots
FROM scrape_runs
WHERE started_at >= timestamptz '2026-08-11 00:00+00'
  AND source LIKE '%_city_sweep%'
ORDER BY started_at;
  • Принято: ни одной строки done при errors_count >= anchors_total и lots_fetched = 0; попавшие под правило несут failed + error LIKE 'sweep-honest-status:%'.
  • Отклонено: появился failed при lots_fetched > 0 или errors_count < anchors_total — ложная тревога, откатывать.
  • Не проверено (ожидаемо и допустимо): все прогоны собрали данные, правило не сработало. Срок годности вердикта — до 24.08; если за две недели ни один прогон не отказал целиком, признак остаётся подтверждён только тестами, как и детект #2642.

Остаётся открытым в issue:

  • п. 3 — связка banned → ротация #2611: статус достижим, вызов не подключён, ASOCKS_API_TOKEN ждёт владельца;
  • п. 4 — корреляция успеха Циана с конкретным прокси: не делалось;
  • верификация детекта #2642 на живом эпизоде: за 5.5 суток эпизода не случилось.
Замер прода 2026-08-10 + остаток закрыт в PR #2813 (merged). **Что уже покрыто соседними правками.** Пп. 1-2 закрыл #2642. Симптом на проде исчез — развёртки `cian_city_sweep*`/`yandex_city_sweep*`/`*_full_load`: | эра | `done` | из них с нулём | `banned` | `failed` | |---|---|---|---|---| | до #2642 (21.07 → 04.08 19:00 UTC) | 89 | **42 (47%)** | 0 | 0 | | после (04.08 19:00 → 10.08) | 30 | **1 (3%)** | 0 | 0 | Числа из тела issue (yandex 24/33, cian 17/35) воспроизвелись и ушли. **Опровергнутая предпосылка — важнее самой починки.** `banned = 0` в ОБЕИХ колонках. Значит падение 42 → 1 дал не детект #2642, а то, что сбор реально заработал (#2796, #2798, #2800-#2805, #2804). **Детект #2642 на проде не срабатывал ни разу за 5.5 суток.** Комментарий от 04.08 обещал верификацию «на живом капча-эпизоде Cian/Yandex» — эпизода не было, домкликовский `blocked=3` из комментария 05.08 подтверждал ДРУГОЙ детект (#2645), не этот. Правильность #2642 на сегодня подтверждена только юнит-тестами. **Что осталось и починено.** Прогон 3557 (`yandex_city_sweep_pervouralsk`, 09.08 17:11): 155 мс, `anchors_total=1, errors_count=1, lots_fetched=0`, статус `done`. Не новый: за 90 суток 28 таких прогонов, включая `yandex_city_sweep_nizhniy_tagil` — 16 суток подряд (15-30.07), каждый ровно 240 с (таймаут якоря), ноль лотов, `done`. Детект #2642 их не видит и правильно не видит: он считает попытки РАЗБОРА, а `transport_error` туда не попадает намеренно (#2600 п.1). Якорь, упавший до первого разобранного ответа, даёт `attempts = 0` — условие `attempts > 0 and failures == attempts` молчит. **Три случая разведены:** | случай | статус | |---|---| | площадка отбила (структура не извлеклась ни разу) | `banned` — #2642 | | площадка честно отдала пустоту | `done` — здоровый ответ, сохранён | | **мы не дошли** (таймаут / исключение якоря) | ~~`done`~~ → **`failed`** — #2813 | Признак — `errors_count >= anchors_total` при измеренном нуле. Доказывает: каждый якорь кончился отказом, собрано ноль. НЕ доказывает, кто виноват — поэтому `failed` без `ban_kind`, а не `banned`/`platform` (#2764). На маркеры не опирается вовсе. **Ложной тревоги нет** (90 суток): 132 прогона с отказами, но ненулевым сбором, и 37 прогонов честной пустоты (`errors_count = 0`) остаются `done`. **По п. 2 задачи — пустая выдача Яндекса.** Отличима структурно: валидный gate-JSON с `pager` и `entities = []` — честная пустота; неразобранный ответ — «отбили или сменили API». Кто именно отбил, по ответу НЕ определяется, и выдуманная причина туда не подставляется. **Критерий приёмки, записан ДО факта.** Ближайшие способные сработать прогоны: `yandex_city_sweep_nizhniy_tagil` (~14:10 UTC ежедневно), `yandex_city_sweep_pervouralsk` (~17:10 UTC, раз в 3 суток). Проверка 11.08 после 18:00 UTC: ```sql SELECT id, source, status, error, counters->>'errors_count' AS errs, counters->>'anchors_total' AS anchors, counters->>'lots_fetched' AS lots FROM scrape_runs WHERE started_at >= timestamptz '2026-08-11 00:00+00' AND source LIKE '%_city_sweep%' ORDER BY started_at; ``` - **Принято:** ни одной строки `done` при `errors_count >= anchors_total` и `lots_fetched = 0`; попавшие под правило несут `failed` + `error LIKE 'sweep-honest-status:%'`. - **Отклонено:** появился `failed` при `lots_fetched > 0` или `errors_count < anchors_total` — ложная тревога, откатывать. - **Не проверено** (ожидаемо и допустимо): все прогоны собрали данные, правило не сработало. Срок годности вердикта — **до 24.08**; если за две недели ни один прогон не отказал целиком, признак остаётся подтверждён только тестами, как и детект #2642. **Остаётся открытым в issue:** - п. 3 — связка `banned` → ротация #2611: статус достижим, вызов не подключён, `ASOCKS_API_TOKEN` ждёт владельца; - п. 4 — корреляция успеха Циана с конкретным прокси: не делалось; - верификация детекта #2642 на живом эпизоде: за 5.5 суток эпизода не случилось.
Collaborator

Проверка критерия 11.08 + замер 12.08: пп.1-2 держатся, пп.3-4 открыты — задача остаётся

Критерий от 10.08 (записан ДО факта) дал исход «повода не было» — тот, который он сам предусматривал.

Прогонов *_city_sweep* с 11.08 00:00 — 17. Ни одной строки done при errors_count >= anchors_total и lots_fetched = 0. Строк с error LIKE 'sweep-honest-status:%' по всей таблице — 0: правило #2813 не срабатывало ни разу, потому что ни один прогон не отказал целиком. Ни «Принято», ни «Отклонено» не наступило.

Ловушка, в которую легко попасть при беглом чтении: 12.08 два прогона failed при ненулевом сборе — avito_city_sweep_pervouralsk (3756, lots 150) и avito_city_sweep_verkhnyaya_pyshma (3768, lots 151). По букве «Отклонено: появился failed при lots_fetched > 0» это выглядит как ложная тревога и повод откатывать. Это другой сторож: их error начинается с phase-honest-status: и ссылается на #2700 (фаза detail отказала полностью, 3 из 3 попыток), а не на sweep-honest-status:. Правку #2813 они не задевают.

Срок годности вердикта прежний — 24.08. До него признак errors_count >= anchors_total остаётся подтверждён только тестами.

Симптом из шапки держится. *_city_sweep* + *_full_load* с 10.08:

done 16 · из них с нулём лотов 0 · banned 5 · failed 4

Ноль пустых done третьи сутки — против 42 из 89 (47%) в эре до #2642.

Живого эпизода детекта #2642 так и не случилось, и ноль здесь имеет точную причину. Прогонов banned у cian/yandex за всё время — 16, но все они с 31.05 по 03.07 и с текстом cian sweep aborted: 3 consecutive anchor failures (last: anchor timeout 240s), ban_kind=platform — это старый сторож якорей, а не детект провала Redux-state. С момента мержа #2642 (04.08) banned у cian/yandex — ноль. Значит «повода не было», а не «сторож сломан»; правильность #2642 по-прежнему подтверждена только юнит-тестами.

Остаётся открытым, поштучно:

  • п.3 — связка banned → ротация #2611: заблокировано выше. ASOCKS_API_TOKEN в окружении tradein-scraper не задан (проверено: непустых совпадений 0). Кодом не закрывается, ждёт владельца.
  • п.4 — корреляция успеха Циана с конкретным прокси: никто не брался, ни одного PR со ссылкой.
  • верификация #2642 на живом эпизоде — ждёт эпизода, срок 24.08.
## Проверка критерия 11.08 + замер 12.08: пп.1-2 держатся, пп.3-4 открыты — задача остаётся **Критерий от 10.08 (записан ДО факта) дал исход «повода не было» — тот, который он сам предусматривал.** Прогонов `*_city_sweep*` с 11.08 00:00 — 17. Ни одной строки `done` при `errors_count >= anchors_total` и `lots_fetched = 0`. Строк с `error LIKE 'sweep-honest-status:%'` по всей таблице — **0**: правило #2813 не срабатывало ни разу, потому что ни один прогон не отказал целиком. Ни «Принято», ни «Отклонено» не наступило. Ловушка, в которую легко попасть при беглом чтении: 12.08 два прогона `failed` при ненулевом сборе — `avito_city_sweep_pervouralsk` (3756, lots 150) и `avito_city_sweep_verkhnyaya_pyshma` (3768, lots 151). По букве «Отклонено: появился failed при lots_fetched > 0» это выглядит как ложная тревога и повод откатывать. **Это другой сторож:** их `error` начинается с `phase-honest-status:` и ссылается на #2700 (фаза detail отказала полностью, 3 из 3 попыток), а не на `sweep-honest-status:`. Правку #2813 они не задевают. **Срок годности вердикта прежний — 24.08.** До него признак `errors_count >= anchors_total` остаётся подтверждён только тестами. **Симптом из шапки держится.** `*_city_sweep*` + `*_full_load*` с 10.08: ``` done 16 · из них с нулём лотов 0 · banned 5 · failed 4 ``` Ноль пустых `done` третьи сутки — против 42 из 89 (47%) в эре до #2642. **Живого эпизода детекта #2642 так и не случилось, и ноль здесь имеет точную причину.** Прогонов `banned` у cian/yandex за всё время — 16, но все они с 31.05 по 03.07 и с текстом `cian sweep aborted: 3 consecutive anchor failures (last: anchor timeout 240s)`, `ban_kind=platform` — это **старый** сторож якорей, а не детект провала Redux-state. С момента мержа #2642 (04.08) `banned` у cian/yandex — ноль. Значит «повода не было», а не «сторож сломан»; правильность #2642 по-прежнему подтверждена только юнит-тестами. **Остаётся открытым, поштучно:** - **п.3** — связка `banned` → ротация #2611: **заблокировано выше**. `ASOCKS_API_TOKEN` в окружении `tradein-scraper` не задан (проверено: непустых совпадений 0). Кодом не закрывается, ждёт владельца. - **п.4** — корреляция успеха Циана с конкретным прокси: **никто не брался**, ни одного PR со ссылкой. - верификация #2642 на живом эпизоде — ждёт эпизода, срок 24.08.
lekss361 added the
bug
observability
scope/backend
scrapers
tradein
labels 2026-08-16 10:25:10 +00:00
Author
Owner

Закрываю по итогам разбора трекера 16.08.2026

Вердикт: сделано кодом.

Доказательство: Два смерженных PR: #2642 (капча Циана и заглушки Яндекса → status='banned') и #2813 (10.08: «все якоря отказали, 0 лотов» → status='failed'). Тест tests/test_2625_run_that_did_nothing.py покрывает ровно тот 16-суточный тагильский сценарий, что описан в задаче.

Независимая проверка. Вердикт проверялся отдельным проходом, задачей которого было именно опровергнуть закрытие, а не подтвердить его — опровергнуть не удалось.

Если что-то из перечисленного всё же живо — переоткройте задачу, разбор мог упустить частный случай.

## Закрываю по итогам разбора трекера 16.08.2026 **Вердикт:** сделано кодом. **Доказательство:** Два смерженных PR: #2642 (капча Циана и заглушки Яндекса → `status='banned'`) и #2813 (10.08: «все якоря отказали, 0 лотов» → `status='failed'`). Тест `tests/test_2625_run_that_did_nothing.py` покрывает ровно тот 16-суточный тагильский сценарий, что описан в задаче. **Независимая проверка.** Вердикт проверялся отдельным проходом, задачей которого было именно опровергнуть закрытие, а не подтвердить его — опровергнуть не удалось. Если что-то из перечисленного всё же живо — переоткройте задачу, разбор мог упустить частный случай.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2625
No description provided.