[tradein][scrapers] cian: full_load зомбится ~43% + city_sweep self-inflicted watchdog-бан → 86% инвентаря stale #1949

Closed
opened 2026-06-27 07:46:45 +00:00 by lekss361 · 1 comment
Owner

Из глубокой диагностики скрейперов 2026-06-27 (живой репро). cian — главный объём вторички, собирает мало.

Корни (подтверждены)

1. cian_full_load зомбится ~43% (носитель вторичного инвентаря). done=4 / zombie=3 за 7д. Внутри price-бакета asyncio.gather(concurrency=5) нет per-fetch hard-cancel и нет периодического heartbeat → зависший browser-fetch морозит весь run → reap_zombies метит zombie через 6ч (ZOMBIE_THRESHOLD_HOURS=6). Часть «зомби» — артефакт деплоя (recreate scraper'а посреди run'а, см. отдельный deploy-issue), часть — реальный browser/proxy stall внутри бакета. Exhaustive идёт по неск. бакетов/ночь → медленное обновление.

  • Evidence: run 404 heartbeat замёрз 06-26 21:37, finished 03:37 (+6ч); done_buckets=3 (только room1 0–5.49M из 6×N), unique_fetched=857, detail_attempted=0.

2. cian_city_sweep 7/7 banned — self-inflicted watchdog, НЕ блок cian. fetch_around_multi_room = до 12 последовательных browser-fetch (~12s каждый) + 5s sleep'ы + detail/houses-фаза, всё под ОДНИМ ANCHOR_TIMEOUT_SEC=240 → каждый anchor >240s → TimeoutError → CIAN_SWEEP_MAX_CONSECUTIVE_FAILURES=3 → mark_banned. Живой fetch доказал: cian отдаёт (dt=12.1s, total_offers=13459, 28 лотов распарсились). reCAPTCHA-маркеры в HTML benign (на каждой норм. странице).

  • Evidence: error на ВСЕХ 7/7 banned = 'cian sweep aborted: 3 consecutive anchor failures (last: anchor timeout 240s)'; ANCHOR_TIMEOUT_SEC=240 (scrape_pipeline.py:119); mark_banned (:2311). NB: cian_city_sweep = newbuilding-only & shipped DORMANT (scheduler.py:69) — вторичкой владеет full_load.

3. Следствие: 86% активного cian-инвентаря >14д → отсекается фильтром эстиматора scraped_at>now()-14d → comps усыхают. SQL: stale_gt14d=13710 / total_active=15971 (86%), fresh_le14d=2261, scraped_last12h=18. Это следствие (1)+(2), не самостоятельный корень.

DoD (направление, приоритет — full_load)

  • full_load anti-zombie (главное): per-fetch hard-cancel (asyncio.wait_for на каждый browser-fetch внутри bucket-gather) + периодический update_heartbeat ВНУТРИ бакета, чтобы зависший fetch не морозил весь run. Investigate browser-pool recycle-stall в tradein-browser.
  • city_sweep watchdog: разнести таймаут SERP-фазы от detail/houses ИЛИ распараллелить SERP (gather как full_load) ИЛИ сократить rooms×pages. Учитывая что city_sweep DORMANT/newbuilding-only — рассмотреть реже расписание / понизить приоритет (банный шум на ~0 полезного сбора).
  • НЕ добавлять SERP-changeip-ротацию: cian-прокси (ha:2013) auto-rotate'ит сам (ipify×2 → разные IP 188.170.73.102/31.173.82.96), фейлы = таймауты не блоки.

scope/backend, scrapers, tradein, priority/p1. Refs аудит 2026-06-27, #1871 (89% stale), #559.

Из глубокой диагностики скрейперов 2026-06-27 (живой репро). cian — главный объём вторички, собирает мало. ## Корни (подтверждены) **1. `cian_full_load` зомбится ~43%** (носитель вторичного инвентаря). done=4 / zombie=3 за 7д. Внутри price-бакета `asyncio.gather(concurrency=5)` нет per-fetch hard-cancel и нет периодического heartbeat → зависший browser-fetch морозит весь run → `reap_zombies` метит zombie через 6ч (ZOMBIE_THRESHOLD_HOURS=6). Часть «зомби» — артефакт деплоя (recreate scraper'а посреди run'а, см. отдельный deploy-issue), часть — реальный browser/proxy stall внутри бакета. Exhaustive идёт по неск. бакетов/ночь → медленное обновление. - Evidence: run 404 heartbeat замёрз 06-26 21:37, finished 03:37 (+6ч); done_buckets=3 (только room1 0–5.49M из 6×N), unique_fetched=857, detail_attempted=0. **2. `cian_city_sweep` 7/7 banned — self-inflicted watchdog, НЕ блок cian.** `fetch_around_multi_room` = до 12 последовательных browser-fetch (~12s каждый) + 5s sleep'ы + detail/houses-фаза, всё под ОДНИМ `ANCHOR_TIMEOUT_SEC=240` → каждый anchor >240s → TimeoutError → `CIAN_SWEEP_MAX_CONSECUTIVE_FAILURES=3` → mark_banned. Живой fetch доказал: cian отдаёт (dt=12.1s, total_offers=13459, 28 лотов распарсились). reCAPTCHA-маркеры в HTML benign (на каждой норм. странице). - Evidence: error на ВСЕХ 7/7 banned = `'cian sweep aborted: 3 consecutive anchor failures (last: anchor timeout 240s)'`; ANCHOR_TIMEOUT_SEC=240 (scrape_pipeline.py:119); mark_banned (:2311). **NB: cian_city_sweep = newbuilding-only & shipped DORMANT (scheduler.py:69) — вторичкой владеет full_load.** **3. Следствие: 86% активного cian-инвентаря >14д** → отсекается фильтром эстиматора `scraped_at>now()-14d` → comps усыхают. SQL: stale_gt14d=13710 / total_active=15971 (86%), fresh_le14d=2261, scraped_last12h=18. Это следствие (1)+(2), не самостоятельный корень. ## DoD (направление, приоритет — full_load) - **full_load anti-zombie** (главное): per-fetch hard-cancel (`asyncio.wait_for` на каждый browser-fetch внутри bucket-gather) + периодический `update_heartbeat` ВНУТРИ бакета, чтобы зависший fetch не морозил весь run. Investigate browser-pool recycle-stall в tradein-browser. - **city_sweep watchdog**: разнести таймаут SERP-фазы от detail/houses ИЛИ распараллелить SERP (gather как full_load) ИЛИ сократить rooms×pages. Учитывая что city_sweep DORMANT/newbuilding-only — рассмотреть реже расписание / понизить приоритет (банный шум на ~0 полезного сбора). - НЕ добавлять SERP-changeip-ротацию: cian-прокси (ha:2013) auto-rotate'ит сам (ipify×2 → разные IP 188.170.73.102/31.173.82.96), фейлы = таймауты не блоки. scope/backend, scrapers, tradein, priority/p1. Refs аудит 2026-06-27, #1871 (89% stale), #559.
lekss361 added the
priority/p1
scope/backend
scrapers
tradein
labels 2026-06-27 08:51:20 +00:00
Author
Owner

Working on this (автономный проход по backlog) — ветка fix/tradein-cian-zombie-watchdog. Безопасно стартовать: #2202 (proxy_pool wiring в scrape_pipeline.py) уже смержен. Скоуп строго cian-specific (full_load anti-zombie heartbeat/hard-cancel + city_sweep watchdog timeout + honest partial/done status) — НЕ трогаю _rotate_proxy_ip/changeip-recovery (#1950, отдельным PR следующим шагом после мержа этого).

Working on this (автономный проход по backlog) — ветка `fix/tradein-cian-zombie-watchdog`. Безопасно стартовать: #2202 (proxy_pool wiring в scrape_pipeline.py) уже смержен. Скоуп строго cian-specific (full_load anti-zombie heartbeat/hard-cancel + city_sweep watchdog timeout + honest partial/done status) — НЕ трогаю `_rotate_proxy_ip`/changeip-recovery (#1950, отдельным PR следующим шагом после мержа этого).
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#1949
No description provided.