From 3cc015c2493e2b0356d848e9cb952b74dcc5f94c Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 27 Jun 2026 22:26:48 +0300 Subject: [PATCH] =?UTF-8?q?fix(tradein/domclick-local):=20SERP=20enumerate?= =?UTF-8?q?=20=E2=80=94=20wait=5Ffor=5Fselector=20=D0=B2=D0=BC=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=BE=20=D1=81=D0=BB=D0=B5=D0=BF=D0=BE=D0=B3=D0=BE=20ren?= =?UTF-8?q?der-wait?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Карточки SERP появляются клиентской гидрацией через ~6-12с после domcontentloaded. Фиксированный render-sleep ловил пустой DOM при медленном ответе → enumerate молча собирал 0 ids (silent 0-coverage; всплыло при ускоренном профиле render 3-5). Теперь fetch_serp_page ждёт 'a[href*=/card/]' явно (timeout 12с) → пустой ценовой band корректно даёт 0 по таймауту, render_wait остаётся коротким settle. Подтверждено enumerate-only --limit 5 с render 3-5. --- tradein-mvp/backend/scripts/domclick_local_runner.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tradein-mvp/backend/scripts/domclick_local_runner.py b/tradein-mvp/backend/scripts/domclick_local_runner.py index de9542f8..26e7ff9e 100644 --- a/tradein-mvp/backend/scripts/domclick_local_runner.py +++ b/tradein-mvp/backend/scripts/domclick_local_runner.py @@ -770,7 +770,15 @@ async def fetch_serp_page( DomClickBlockedError: 403 или QRATOR-маркеры в title. """ resp = await page.goto(url, wait_until="domcontentloaded", timeout=70000) - await asyncio.sleep(random.uniform(*render_wait)) # дать SSR отрендериться + # SERP рендерит карточки клиентской гидрацией через ~6-12с после domcontentloaded. + # Фиксированный sleep хрупок: при медленном ответе DOM ещё пуст → 0 ids (silent + # 0-coverage). Ждём появления card-ссылок ЯВНО; genuinely-пустой ценовой band → + # timeout → 0 offers (корректно). render_wait остаётся коротким settle поверх. + try: + await page.wait_for_selector("a[href*='/card/']", timeout=12000) + except Exception: + pass # пустой band или медленный рендер — читаем как есть (0 offers) + await asyncio.sleep(random.uniform(*render_wait)) # settle: дорисовать все 20 + title status = resp.status if resp else 0 title = "" try: