gendesign/backend/tests/services/scrapers
Light1YT aafcb208e9 fix(scrapers): isolate flats from poison-extras to restore KN flats_count (#1945)
ГЛАВНЫЙ unblock. Эмпирически (prod worker):
  • flats endpoint /portal-kn/api/sales/portal/table @ concurrency=2 — 0 WAF-бан
    на 250 объектах / 251 req, 77163 flat-строк (vs текущие 9 во всём sweep);
  • extras /сервисы/api/object/{id}/* отдают 403 СРАЗУ (volume-independent, мертвы
    с 2026-06-03) И травят cookies сессии → последующие flats на ней тоже 403.
flats_count рухнул 3670→9 именно из-за shared-session отравления.

Fix: flats и extras больше НИКОГДА не делят сессию.
- run_region_sweep(extras_isolated=True, дефолт): warm flats-сессия тянет ТОЛЬКО
  flats (extras на ней не вызываются) → flats_count восстанавливается; extras
  уходят отдельным best-effort проходом _run_extras_pass с recycle BrowserSession
  на каждый WAF-403 (яд не накапливается, flats-сессия уже закрыта).
- _run_extras_pass: ранний обрыв после N подряд полностью-WAF объектов
  (_EXTRAS_ABORT_AFTER_CONSEC_WAF=5) — extras мертвы целиком, нет смысла жечь
  ~1500 релончей браузера. Любой сбой паса → log, run НЕ падает.
- extras_isolated=False → старое combined-поведение (poison-prone).
- config: scrape_kn_extras_isolated=True (ENV SCRAPE_KN_EXTRAS_ISOLATED);
  прокинут через оба worker call-site.
- рефактор: _process_flats_result / _process_extras_result / _extras_coros
  делят upsert-логику между combined-loop и isolated-pass.
- tests: _extras_coros без flats, _is_waf_poisoned, recycle-на-poison,
  early-abort на wholesale-WAF.

Сохраняет throttle + optional-proxy из предыдущего коммита.
2026-06-28 17:34:23 +05:00
..
__init__.py feat(22d): domrf_catalog_object scraper — fill ~25 NULL kn_objects cols from SSR __NEXT_DATA__ (#335) 2026-05-17 21:26:22 +00:00
test_domrf_catalog_object.py feat(22d): domrf_catalog_object scraper — fill ~25 NULL kn_objects cols from SSR __NEXT_DATA__ (#335) 2026-05-17 21:26:22 +00:00
test_domrf_catalog_parse.py fix(scrapers): narrow domrf Level-1 status badge-class regex (#1609 follow-up) 2026-06-17 21:21:56 +03:00
test_domrf_kn_isolation.py fix(scrapers): isolate flats from poison-extras to restore KN flats_count (#1945) 2026-06-28 17:34:23 +05:00
test_domrf_kn_normalize.py fix(domrf_kn): детерминированный sha256-fallback для flat_id (#1208) 2026-06-13 06:09:54 +00:00
test_ekb_krt_registry.py feat(sf): scraper реестра КРТ-площадок ЕКБ → ekb_krt_sites (#1126) 2026-06-07 11:24:49 +00:00
test_ekb_ppt_tep_parser.py fix(sf): ekb_ppt_tep post-фильтры + врезка в analyze (#1136) 2026-06-13 09:32:52 +00:00
test_gisogd_so_client.py feat(sf): ingest функц.зон генплана ЕКБ-2045 из ГИСОГД-СО WFS → ekb_genplan_functional_zone (#1137) 2026-06-07 12:03:39 +00:00
test_izyatie_ocr.py feat(sf): OCR-пайплайн изъятия ЕКБ (Tesseract rus) → land_reservation (#1062) 2026-06-07 18:07:06 +03:00
test_okn_egrkn_client.py fix(okn): expand registry coverage + load detail-card name/address (#1159) 2026-06-13 15:02:50 +05:00
test_page_reservation_parser.py feat(sf): ПАГЕ-парсер изъятия/резервирования → land_reservation (#1118) 2026-06-07 10:15:03 +00:00
test_stealth_throttle_proxy.py fix(scrapers): throttle + optional proxy levers for KN flats loader (#1945) 2026-06-28 17:10:22 +05:00