tradein/cian: капча Циана приходит с HTTP 200 и не распознаётся как отказ площадки — cian_detail_backfill сжигает батч (0/210, 0/400) на одном узле, парсер пишет «def… #3402

Closed
opened 2026-09-06 08:34:05 +00:00 by bot-backend · 4 comments
Collaborator

Факт. cian_detail_backfill (тело — cian_history_backfill, #3284): 6200 (06.09 07:24) — 0 успехов из 210, 6144 — 0/104, 6123/6091/6052/6032/6010/5981 (04–05.09) — 0/400 каждый; при этом 6167 (06.09 01:23) — 161/162. В логах на каждую карточку: WARNING scraper_kit.providers.cian.detail: Cian detail <url>: defaultState extraction failed (133 из 133 в окне 6200), сайдкар при этом штатно поднимается с override из пула и рециклит браузер каждые 15 страниц.

Проба одной карточки через сайдкар (/fetch, provider=cian) по узлам, 06.09 08:45 UTC:

узел сайдкар размер title defaultState / frontend-offer-card
13 agp.mobileproxy 200 604 КБ «Продаю двухкомнатную квартиру 57м² …» 1 / 64 — настоящая карточка
14 ajx.mobileproxy 200 44 КБ «Captcha - база объявлений ЦИАН» 0 / 0
1 (212.8.249.134) 200 374 КБ «Ошибка - Циан» 0 / 0

Прогон 6200 держал ОДНУ аренду на весь батч — узел 14 (leased proxy id=14 provider=cian, единственная аренда cian за час) → все 210 карточек = капча.

Цепочка. Детектор бан-страниц сайдкара (browser/server.py, BanPageDetectedError) знает _REFUSAL_STATUSES {403, 429} и статичную страницу Домклика «403 | Домклик»; капча Циана и «Ошибка - Циан» приходят с 200 → фетчер отдаёт HTML как успех → extract_state(html, mfe="frontend-offer-card", key="defaultState") → None → «extraction failed» (читается как «разметка сменилась») → listings_failed += 1, узел не получает ни report_ban, ни mark_health(False), ротации внутри батча нет (#3357 работает только от SidecarBanPageError), phase-honest-status пишет «причина НЕ установлена».

Чинить в одном месте на слой:

  1. Сайдкар server.py: маркеры капчи/ошибки Циана (title Captcha - база объявлений ЦИАН, Ошибка - Циан; проверить также m.cian / «Доступ ограничен») → BanPageDetectedError (403 + ban_page, как #3379) → у клиента срабатывает _report_platform_ban (#3357): report_ban(node×cian) + ротация аренды внутри батча.
  2. Kit providers/cian/detail.py (defence-in-depth — образы деплоятся раздельно): при провале extract_state проверять те же маркеры и поднимать CianBlockedError (platform), а не молча None; в лог — «капча/страница ошибки Циана», не «extraction failed».
  3. Тесты по значению: HTML капчи (фикстура из пробы) → сайдкар 403+ban_page; kit → CianBlockedError; батч cian_history_backfill с капчей на первом узле → report_ban + ротация, второй узел даёт карточку.

Приёмка: следующий cian_detail_backfilllistings_succeeded > 0; в логах report_ban … source=cian для узла с капчей и смена аренды внутри прогона; defaultState extraction failed на страницах с title «Captcha…» — 0.

Refs #3288, #3357, #3379, #3382, #3394.

**Факт.** `cian_detail_backfill` (тело — `cian_history_backfill`, #3284): 6200 (06.09 07:24) — 0 успехов из 210, 6144 — 0/104, 6123/6091/6052/6032/6010/5981 (04–05.09) — 0/400 каждый; при этом 6167 (06.09 01:23) — 161/162. В логах на каждую карточку: `WARNING scraper_kit.providers.cian.detail: Cian detail <url>: defaultState extraction failed` (133 из 133 в окне 6200), сайдкар при этом штатно поднимается с override из пула и рециклит браузер каждые 15 страниц. **Проба одной карточки через сайдкар (`/fetch`, provider=cian) по узлам, 06.09 08:45 UTC:** | узел | сайдкар | размер | title | defaultState / frontend-offer-card | |---|---|---:|---|---| | 13 agp.mobileproxy | 200 | 604 КБ | «Продаю двухкомнатную квартиру 57м² …» | 1 / 64 — настоящая карточка | | 14 ajx.mobileproxy | 200 | 44 КБ | **«Captcha - база объявлений ЦИАН»** | 0 / 0 | | 1 (212.8.249.134) | 200 | 374 КБ | **«Ошибка - Циан»** | 0 / 0 | Прогон 6200 держал ОДНУ аренду на весь батч — узел 14 (`leased proxy id=14 provider=cian`, единственная аренда cian за час) → все 210 карточек = капча. **Цепочка.** Детектор бан-страниц сайдкара (`browser/server.py`, `BanPageDetectedError`) знает `_REFUSAL_STATUSES {403, 429}` и статичную страницу Домклика «403 | Домклик»; капча Циана и «Ошибка - Циан» приходят с **200** → фетчер отдаёт HTML как успех → `extract_state(html, mfe="frontend-offer-card", key="defaultState")` → None → «extraction failed» (читается как «разметка сменилась») → `listings_failed += 1`, узел не получает ни `report_ban`, ни `mark_health(False)`, ротации внутри батча нет (#3357 работает только от `SidecarBanPageError`), phase-honest-status пишет «причина НЕ установлена». **Чинить в одном месте на слой:** 1. Сайдкар `server.py`: маркеры капчи/ошибки Циана (title `Captcha - база объявлений ЦИАН`, `Ошибка - Циан`; проверить также m.cian / «Доступ ограничен») → `BanPageDetectedError` (403 + `ban_page`, как #3379) → у клиента срабатывает `_report_platform_ban` (#3357): `report_ban(node×cian)` + ротация аренды внутри батча. 2. Kit `providers/cian/detail.py` (defence-in-depth — образы деплоятся раздельно): при провале `extract_state` проверять те же маркеры и поднимать `CianBlockedError` (platform), а не молча `None`; в лог — «капча/страница ошибки Циана», не «extraction failed». 3. Тесты по значению: HTML капчи (фикстура из пробы) → сайдкар 403+`ban_page`; kit → `CianBlockedError`; батч `cian_history_backfill` с капчей на первом узле → `report_ban` + ротация, второй узел даёт карточку. **Приёмка:** следующий `cian_detail_backfill` — `listings_succeeded > 0`; в логах `report_ban … source=cian` для узла с капчей и смена аренды внутри прогона; `defaultState extraction failed` на страницах с title «Captcha…» — 0. Refs #3288, #3357, #3379, #3382, #3394.
Author
Collaborator

База для приёмки (06.09 08:55 UTC): активных cian-объявлений 20 451, из них без detail-обогащения 14 028 (69 %), обогащено за последние 3 суток — 284 (почти всё — прогон 6167 через здоровый узел 13). При 6 прогонах в сутки по 400 карточек очередь должна была бы таять на ~2400/сутки; фактически с 04.09 — ноль, кроме одного прогона. После фикса ждём enriched_3d рост ≥ 1000/сутки и listings_succeeded / listings_processed ≥ 0.8 на прогонах через незакапченный узел.

**База для приёмки (06.09 08:55 UTC):** активных cian-объявлений 20 451, из них **без detail-обогащения 14 028 (69 %)**, обогащено за последние 3 суток — 284 (почти всё — прогон 6167 через здоровый узел 13). При 6 прогонах в сутки по 400 карточек очередь должна была бы таять на ~2400/сутки; фактически с 04.09 — ноль, кроме одного прогона. После фикса ждём `enriched_3d` рост ≥ 1000/сутки и `listings_succeeded / listings_processed` ≥ 0.8 на прогонах через незакапченный узел.
Author
Collaborator

PR #3403 смержен и задеплоен (06.09 ~10:30 UTC, BUILD_SHA=3d154f4 в backend и scraper; сайдкар пересоздан — маркер _CIAN_CAPTCHA_TITLES в /app/server.py, трейсбеков при старте 0; в kit cian/detail.py — маркер «вы не робот»). Семантика после ревью: капча («Captcha - база объявлений ЦИАН», «Вы не робот?») — бан пары узел×cian + ротация аренды на 3-й капче; «Ошибка - Циан» — на цикл наблюдения только WARNING в обоих слоях.

Приёмка: cian_detail_backfill 13:24 UTC — listings_succeeded > 0, в логах scraper BANNED — reporting to pool: … капча и «провалил 3 /fetch подряд — меняем прокси» на капча-узле, «defaultState extraction failed» на капче = 0, строка в scrape_proxy_source_bans для пары узел×cian; очередь без detail (14 028 на 08:55) начинает таять.

PR #3403 смержен и задеплоен (06.09 ~10:30 UTC, `BUILD_SHA=3d154f4` в backend и scraper; сайдкар пересоздан — маркер `_CIAN_CAPTCHA_TITLES` в `/app/server.py`, трейсбеков при старте 0; в kit `cian/detail.py` — маркер «вы не робот»). Семантика после ревью: капча («Captcha - база объявлений ЦИАН», «Вы не робот?») — бан пары узел×cian + ротация аренды на 3-й капче; «Ошибка - Циан» — на цикл наблюдения только WARNING в обоих слоях. **Приёмка:** `cian_detail_backfill` 13:24 UTC — `listings_succeeded > 0`, в логах scraper `BANNED — reporting to pool: … капча` и «провалил 3 /fetch подряд — меняем прокси» на капча-узле, «defaultState extraction failed» на капче = 0, строка в `scrape_proxy_source_bans` для пары узел×cian; очередь без detail (14 028 на 08:55) начинает таять.
Author
Collaborator

Эффект на проде сразу после деплоя (06.09 10:35 UTC, проба одной карточки по узлам через новый сайдкар):

узел до (08:45) после
13 карточка карточка (defaultState 1)
14 капча, HTTP 200 сайдкар 403 + ban_page: true, status: 200; в логе BanPageDetectedError: … капча Циана (title='captcha - база объявлений циан')
1 «Ошибка - Циан» 200 200 + WARNING … страница ошибки Циана (title='ошибка - циан', upstream=200) — не бан, только лог (#3402)

Капча-узел теперь уходит клиенту как отказ площадки → report_platform_ban → бан пары узел×cian и ротация на 3-й капче. Прогонная приёмка — 13:24 UTC.

**Эффект на проде сразу после деплоя (06.09 10:35 UTC, проба одной карточки по узлам через новый сайдкар):** | узел | до (08:45) | после | |---|---|---| | 13 | карточка | карточка (`defaultState` 1) | | 14 | капча, HTTP 200 | **сайдкар 403 + `ban_page: true`, `status: 200`**; в логе `BanPageDetectedError: … капча Циана (title='captcha - база объявлений циан')` | | 1 | «Ошибка - Циан» 200 | 200 + `WARNING … страница ошибки Циана (title='ошибка - циан', upstream=200) — не бан, только лог (#3402)` | Капча-узел теперь уходит клиенту как отказ площадки → `report_platform_ban` → бан пары узел×cian и ротация на 3-й капче. Прогонная приёмка — 13:24 UTC.
Author
Collaborator

Follow-up PR #3406 смержен и задеплоен (06.09 ~11:20 UTC, BUILD_SHA=75b0931; маркер _is_captcha_title в kit cian/detail.py контейнера scraper). Теперь капча-волна видна в отчёте прогона (ban_kinds.platform, blocked, ban_kind='platform'), а на curl-пути (detail-фаза cian city sweep) капча банит пару узел×cian через finally curl_proxy_url. Прогонная приёмка — cian_detail_backfill 13:24 UTC (сторож стоит).

Follow-up PR #3406 смержен и задеплоен (06.09 ~11:20 UTC, `BUILD_SHA=75b0931`; маркер `_is_captcha_title` в kit `cian/detail.py` контейнера scraper). Теперь капча-волна видна в отчёте прогона (`ban_kinds.platform`, `blocked`, `ban_kind='platform'`), а на curl-пути (detail-фаза cian city sweep) капча банит пару узел×cian через `finally` `curl_proxy_url`. Прогонная приёмка — `cian_detail_backfill` 13:24 UTC (сторож стоит).
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
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#3402
No description provided.