From 062eee9b169da0ada265935686034ca2e8361ee7 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Thu, 13 Aug 2026 12:28:23 +0500 Subject: [PATCH] =?UTF-8?q?docs(tradein):=20=D1=81=D0=BD=D1=8F=D1=82=D1=8C?= =?UTF-8?q?=20=D1=83=D1=81=D1=82=D0=B0=D1=80=D0=B5=D0=B2=D1=88=D0=B5=D0=B5?= =?UTF-8?q?=20=D0=BE=D0=B1=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BE=D0=B1=D1=80=D1=8B=D0=B2=D0=B0=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=D0=BD=D0=B0=20=D0=94=D0=BE=D0=BC=D0=BA=D0=BB?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Докстринг domclick_detail_backfill утверждал: «No IP-rotation/cooldown recovery step exists here (DomClick uses one dedicated residential proxy, not a rotating pool)». Второе перестало быть правдой на миграции 253 (#2800), снявшей резервацию узла: на 13.08 узлов четыре и у всех provider_affinity='any'. Разница не косметическая. Пока узел был один, «ротации нет» СЛЕДОВАЛО из «ротировать нечего» — обрыв прогона на первом блоке был вынужденным. Теперь это непринятое решение, и обоснование, пережившее свою предпосылку, читается как довод не менять поведение. Цена измерена в #2854: buckets_completed=0 во ВСЕХ прогонах свипа, то есть шесть комнатных корзин не доводятся никогда, а блок бьёт внутри первой. Длительность до блока 111-332 с при примерно постоянной выработке — свежий узел, вероятно, получает свой бюджет. Заодно: шапка 260_houses_drop_has_panorama.sql называла себя 259_ — след вчерашнего переименования при коллизии номеров (два PR взяли 259; имя файла, ссылку в тесте и манифест поправил, комментарий внутри пропустил). Отслеживание идёт по filename (_schema_migrations, без контрольной суммы), правка безопасна. Refs #2854, #2800 --- .../app/tasks/domclick_detail_backfill.py | 17 ++++++++++++----- .../data/sql/260_houses_drop_has_panorama.sql | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/tradein-mvp/backend/app/tasks/domclick_detail_backfill.py b/tradein-mvp/backend/app/tasks/domclick_detail_backfill.py index 0e304651..00d91cf9 100644 --- a/tradein-mvp/backend/app/tasks/domclick_detail_backfill.py +++ b/tradein-mvp/backend/app/tasks/domclick_detail_backfill.py @@ -17,8 +17,9 @@ Both are wired together in the debug endpoint `POST /scrape/domclick/debug/detai wiring into the production scheduled orchestrator (previously only reachable manually). Solution: single snapshot SELECT at start (guarantees termination) + one BrowserFetcher -per run (async context manager, source="domclick" -- dedicated residential proxy pool, -see 173_scrape_proxies_add_domclick_affinity.sql) + cookies loaded ONCE via +per run (async context manager, source="domclick" -- узел берётся из ОБЩЕГО пула; +выделенного узла у Домклика больше нет, резервацию сняла миграция 253 (#2800), +на 13.08 все четыре узла имеют provider_affinity='any') + cookies loaded ONCE via domclick_session.load_session(db) and threaded into every fetch_detail() call. NAMING TRAP (verified live against prod DB 2026-07-04, do NOT "fix" this anywhere): @@ -40,9 +41,15 @@ Exception triad differs from Avito: Статус такого прогона — 'banned' (#2674, см. runs.mark_backfill_finished): блок это external constraint, не наш баг, но и НЕ успех — раньше здесь стоял mark_done, и 24 из 30 прогонов с нулём обогащений назывались успешными. - No IP-rotation/cooldown recovery step exists here - (DomClick uses one dedicated residential proxy, not a rotating pool) -- an - aborted run simply retries the remaining backlog next window. + No IP-rotation/cooldown recovery step exists here -- an aborted run simply + retries the remaining backlog next window. + УСТАРЕВШЕЕ ОБОСНОВАНИЕ, снято 13.08: здесь стояло «DomClick uses one dedicated + residential proxy, not a rotating pool». Это перестало быть правдой на миграции + 253 (#2800), снявшей резервацию узла; сегодня узлов четыре и все общие. То есть + отсутствие ротации больше НЕ следует из «ротировать нечего» — это просто + непринятое решение. Разбор цены и рисков: #2854 (блок бьёт внутри первой + комнатной корзины, buckets_completed=0 во ВСЕХ прогонах; свежий узел, судя по + длительности до блока 111-332 с, получает свой бюджет). ОГРАНИЧЕНИЕ (#2764): диагноз scrape_runs.ban_kind этот прогон НЕ передаёт и получает 'unknown'. Один и тот же DomClickBlockedError поднимается и на распознанном QRATOR-маркере (площадка), и на любом сбое браузерного fetch diff --git a/tradein-mvp/backend/data/sql/260_houses_drop_has_panorama.sql b/tradein-mvp/backend/data/sql/260_houses_drop_has_panorama.sql index 58fcaecc..c53c6ce5 100644 --- a/tradein-mvp/backend/data/sql/260_houses_drop_has_panorama.sql +++ b/tradein-mvp/backend/data/sql/260_houses_drop_has_panorama.sql @@ -1,4 +1,4 @@ --- 259_houses_drop_has_panorama.sql +-- 260_houses_drop_has_panorama.sql -- Issue #2674 (хвост) — снос houses.has_panorama: признака НЕТ в предметной области. -- -- Dependencies: 031_houses_alter_yandex.sql (завела колонку),