fix(tradein): avito _extract_total_count returns 0 on no-results page — stop empty-bracket split/rotate waste #1763

Merged
lekss361 merged 1 commit from fix/avito-empty-page-total-zero into main 2026-06-18 17:05:35 +00:00
Owner

Прод-инцидент (run 209, curl-режим)

avito curl-свип застрял на 14+ мин в ВЫСОКИХ ценовых брекетах низко-ценовых комнатностей (студии по 17М, которых нет), errors=1058. Причина: на пустой выборке avito отдаёт HTTP 200 + страница БЕЗ data-marker="page-title/count" (но с маркером «ничего не найдено» И ~50 ПОХОЖИХ объявлений-fallback). _extract_total_count не находил count → None → resilience (probe failed → splitting assume heavy, #1757) дробил пустой диапазон + ротировал IP (9с каждый) → застой.

Решение

_extract_total_count порядок: page-title/count (несёт только непустая выборка) → если нет, scan на ничего не найден (lowercase, ловит «ничего не найдено»/«Ничего не найдено») → return 0 → иначе None (реально битая/captcha).

Эффект:

  • Пустой брекет → total=0_walk_price_range instant return (без split/rotation/пагинации). Чинит застой.
  • + качество данных: НЕ скрапит 50 fallback-«похожих» (не подходят под ценовой фильтр — мусор) — total=0 пропускает пагинацию.
  • None остаётся только для реально битых страниц (captcha/firewall).

Изменения

  • scrapers/avito.py (+43) — _AVITO_NO_RESULTS_MARKERS = ("ничего не найден",); реордер _extract_total_count (count → no-results→0 → None).
  • tests/scrapers/test_avito_exhaustive.py (+32, 4 теста) — count→1178; no-count+маркер (с fallback item-id)→0; no-count+no-маркер→None; «Ничего не найдено»→0; count-wins-over-marker.

Тесты

Full suite: 2007 passed, 1 skipped, 0 failed.

Сопутствующий конфиг (применён в .env.runtime)

AVITO_PROXY_MAX_ROTATIONS=0 — на backconnect ручная ротация (changeip от старого прокси #500825) избыточна (backconnect авто-ротирует IP per-request) + жжёт 9с. После этого фикса + конфига curl-свип проходит пустые брекеты мгновенно.

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

Полный avito_full_load (curl) → должен пройти ВСЕ 7 комнатностей за минуты (пустые верхние брекеты → instant skip), 0 застоев, измерить итоговое покрытие active.

## Прод-инцидент (run 209, curl-режим) avito curl-свип застрял на 14+ мин в ВЫСОКИХ ценовых брекетах низко-ценовых комнатностей (студии по 17М, которых нет), errors=1058. Причина: на пустой выборке avito отдаёт **HTTP 200 + страница БЕЗ `data-marker="page-title/count"`** (но с маркером «ничего не найдено» И ~50 ПОХОЖИХ объявлений-fallback). `_extract_total_count` не находил count → **None** → resilience (`probe failed → splitting assume heavy`, #1757) дробил пустой диапазон + ротировал IP (9с каждый) → застой. ## Решение `_extract_total_count` порядок: `page-title/count` (несёт только непустая выборка) → если нет, **scan на `ничего не найден`** (lowercase, ловит «ничего не найдено»/«Ничего не найдено») → **return 0** → иначе None (реально битая/captcha). Эффект: - Пустой брекет → `total=0` → `_walk_price_range` instant return (без split/rotation/пагинации). **Чинит застой.** - **+ качество данных:** НЕ скрапит 50 fallback-«похожих» (не подходят под ценовой фильтр — мусор) — total=0 пропускает пагинацию. - `None` остаётся только для реально битых страниц (captcha/firewall). ## Изменения - `scrapers/avito.py` (+43) — `_AVITO_NO_RESULTS_MARKERS = ("ничего не найден",)`; реордер `_extract_total_count` (count → no-results→0 → None). - `tests/scrapers/test_avito_exhaustive.py` (+32, 4 теста) — count→1178; no-count+маркер (с fallback item-id)→0; no-count+no-маркер→None; «Ничего не найдено»→0; count-wins-over-marker. ## Тесты Full suite: **2007 passed, 1 skipped, 0 failed**. ## Сопутствующий конфиг (применён в .env.runtime) `AVITO_PROXY_MAX_ROTATIONS=0` — на backconnect ручная ротация (changeip от старого прокси #500825) избыточна (backconnect авто-ротирует IP per-request) + жжёт 9с. После этого фикса + конфига curl-свип проходит пустые брекеты мгновенно. ## Прод-смоук после merge+deploy Полный avito_full_load (curl) → должен пройти ВСЕ 7 комнатностей за минуты (пустые верхние брекеты → instant skip), 0 застоев, измерить итоговое покрытие active.
lekss361 added 1 commit 2026-06-18 17:03:44 +00:00
fix(tradein): avito _extract_total_count returns 0 on no-results page (stop empty-bracket split waste + fallback-listing scrape)
All checks were successful
CI / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
6454aa312d
lekss361 added the
bug
priority/p1
scope/backend
scrapers
status/review
labels 2026-06-18 17:03:53 +00:00
lekss361 merged commit 8d516d0781 into main 2026-06-18 17:05:35 +00:00
lekss361 deleted branch fix/avito-empty-page-total-zero 2026-06-18 17:05:35 +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#1763
No description provided.