fix(tradein): avito full-load probe resilience — browser 500/timeout splits/skips instead of crashing run #1757

Merged
lekss361 merged 1 commit from fix/avito-fullload-probe-resilience into main 2026-06-18 13:11:46 +00:00
Owner

Прод-инцидент

run_avito_full_load крашился целиком на ПЕРВОЙ browser-ошибке. Тяжёлая probe-страница (studii ?pmax=200000000 — полная выдача) таймаутит на Page.goto → browser отдаёт HTTP 500httpx.HTTPStatusError пробрасывается из probe до верха → run падает. studii идёт первой комнатностью → 0 собранных (run 199: умер за 5 мин, 0 uniq).

Прод-трейс:

File "scrape_pipeline.py", line 2455, in run_avito_full_load
    html = await self._browser.fetch(url)
httpx.HTTPStatusError: Server error '500 Internal Server Error' for url 'http://tradein-browser:3000/fetch'

Решение

Probe-fetch в _walk_price_range обёрнут в новый helper _probe_total (ловит httpx.HTTPStatusError/TimeoutException/HTTPError + generic → total=None; AvitoBlockedError/RateLimited re-raise для mark_banned). При total=None после rotate+retry:

  • bucket делим (hi-lo >= _AVITO_MIN_BRACKET) → принудительный SPLIT в обе половины (тяжёлая выдача станет загружаемой в узком ценовом диапазоне — спасает studii, не теряя её);
  • bucket узкий → skip + return (осознанная потеря хвоста, как cian-эталон).

Leaf-пагинация уже устойчива (asyncio.gather(return_exceptions=True)). run_avito_full_load уже имеет финальный mark_failed + partial через on_bucket — не менял.

Изменения

  • scrapers/avito.py (+108) — import httpx; _probe_total helper; _walk_price_range probe через него + split-on-heavy.
  • tests/scrapers/test_avito_exhaustive.py (+193, 4 теста) — 500 на широком → split не крах; TimeoutException так же; 500 на узком → skip+continue; AvitoBlockedError → propagates.

Тесты

Full suite: 1986 passed, 1 skipped, 0 failed. avito-exhaustive: 19 passed.

Прод-смоук после merge

Запустить avito_full_load → studii больше не валит run; в логах ожидается avito: probe failed ... — splitting (assume heavy). Сравнить avito vtorichka active рост (baseline ~1385).

## Прод-инцидент `run_avito_full_load` крашился целиком на ПЕРВОЙ browser-ошибке. Тяжёлая probe-страница (studii `?pmax=200000000` — полная выдача) таймаутит на `Page.goto` → browser отдаёт **HTTP 500** → `httpx.HTTPStatusError` пробрасывается из probe до верха → run падает. studii идёт первой комнатностью → **0 собранных** (run 199: умер за 5 мин, 0 uniq). Прод-трейс: ``` File "scrape_pipeline.py", line 2455, in run_avito_full_load html = await self._browser.fetch(url) httpx.HTTPStatusError: Server error '500 Internal Server Error' for url 'http://tradein-browser:3000/fetch' ``` ## Решение Probe-fetch в `_walk_price_range` обёрнут в новый helper `_probe_total` (ловит `httpx.HTTPStatusError`/`TimeoutException`/`HTTPError` + generic → `total=None`; **`AvitoBlockedError`/`RateLimited` re-raise** для `mark_banned`). При `total=None` после rotate+retry: - bucket делим (`hi-lo >= _AVITO_MIN_BRACKET`) → **принудительный SPLIT** в обе половины (тяжёлая выдача станет загружаемой в узком ценовом диапазоне — спасает studii, не теряя её); - bucket узкий → `skip + return` (осознанная потеря хвоста, как cian-эталон). Leaf-пагинация уже устойчива (`asyncio.gather(return_exceptions=True)`). `run_avito_full_load` уже имеет финальный `mark_failed` + partial через `on_bucket` — не менял. ## Изменения - `scrapers/avito.py` (+108) — `import httpx`; `_probe_total` helper; `_walk_price_range` probe через него + split-on-heavy. - `tests/scrapers/test_avito_exhaustive.py` (+193, 4 теста) — 500 на широком → split не крах; TimeoutException так же; 500 на узком → skip+continue; AvitoBlockedError → propagates. ## Тесты Full suite: **1986 passed, 1 skipped, 0 failed**. avito-exhaustive: 19 passed. ## Прод-смоук после merge Запустить avito_full_load → studii больше не валит run; в логах ожидается `avito: probe failed ... — splitting (assume heavy)`. Сравнить avito vtorichka active рост (baseline ~1385).
lekss361 added 1 commit 2026-06-18 13:05:00 +00:00
fix(tradein): avito full-load probe resilience — browser 500/timeout splits/skips instead of crashing run
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
cbeeb9c414
lekss361 added the
bug
priority/p1
scope/backend
scrapers
status/review
labels 2026-06-18 13:05:14 +00:00
lekss361 merged commit add002e8d7 into main 2026-06-18 13:11:46 +00:00
lekss361 deleted branch fix/avito-fullload-probe-resilience 2026-06-18 13:11:47 +00:00
Sign in to join this conversation.
No reviewers
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#1757
No description provided.