fix(scrapers): avito ban-triggered IP rotation (#1790) разблокирует houses-enrichment (#1789) + rating_score #1848

Merged
lekss361 merged 1 commit from fix/avito-ban-rotation-houses into main 2026-06-20 18:28:30 +00:00
Owner

Разблокировка avito houses-enrichment (#1789). Расследование показало: парсер НЕ сломан — на browser-HTML дом 572538 даёт 3 отзыва / 8 записей истории / тип=brick / год=1994 корректно, persist работает (06:36 прогон обогатил 2 дома + 5 отзывов end-to-end). Цепочку душит бан (#1790).

Корневая причина (эмпирически, живой пробинг прода)

  • avito-прокси MANUAL/FIXED (один exit-IP на разных соединениях), changeip РАБОТАЕТ (вернул new_ip, следующий запрос с нового IP).
  • avito_proxy_max_rotations=4 в прод env (бюджет есть), но enrichment-фазы pipeline на бан делали abort БЕЗ вызова changeip — rotation-логика была только в avito.py SERP-fetch, не в houses/detail-фазах. → avito_city_sweep банится и дохнет после ~2 домов; avito_full_load дома вообще не трогает. Итог: validated 2/13233.

Фикс 1 (#1790) — ban-triggered rotation в enrichment-фазах

scrape_pipeline.py: новая _rotate_proxy_ip(reason, rotations_done) (changeip → settle avito_proxy_rotate_settle_s=9с → лог old→new). В run_avito_pipeline (Step 4 houses / 5 detail / 5b house-detail) и run_avito_city_sweep (Phase 4/5/5b): при consecutive_blocks >= порог → если остались ротации (< avito_proxy_max_rotations) → changeip + reset counter + continue; иначе abort (как раньше). Bounded per-run. #1820 graceful сохранён (одиночный блок не роняет).

  • Оба режима: changeip меняет exit-IP всего proxy endpoint → и curl_cffi, и camoufox (тот же прокси) идут с нового IP на следующем fetch, без переподнятия браузера.
  • Цепочка enrichment уже рабочая → выживание через бан = дома обогащаются на масштабе.

Фикс 2 (#1789 minor) — rating_score переехал

avito_houses.py parse_houses_state: рейтинг ушёл из пустого housePage.ratingPreview в reviews.filterEntries[type=score].value (scoreFloat/scoreString/reviewCount/ratingStat). Fallback housePage→reviews.filterEntries. Новостройки не затронуты.

Тесты

8 новых (3 ban-rotation + 5 rating-fallback), ruff clean, 2108 passed (2 pre-existing fail вне затронутых файлов).

Деплой

Backend Python → recreate tradein-backend + tradein-scraper. Env-изменение НЕ требуется (AVITO_PROXY_MAX_ROTATIONS=4 уже в проде; фикс активируется кодом). NB: деплой на паузе пока идёт avito-скрап (recreate убьёт in-flight sweep) — мержить когда прогон завершится. Cross-ref #1789, #1790, Module_Tradein_Scrapers_Fetch_Arch.

Разблокировка avito houses-enrichment (#1789). Расследование показало: **парсер НЕ сломан** — на browser-HTML дом 572538 даёт 3 отзыва / 8 записей истории / тип=brick / год=1994 корректно, persist работает (06:36 прогон обогатил 2 дома + 5 отзывов end-to-end). Цепочку душит **бан** (#1790). ## Корневая причина (эмпирически, живой пробинг прода) - avito-прокси **MANUAL/FIXED** (один exit-IP на разных соединениях), changeip РАБОТАЕТ (вернул new_ip, следующий запрос с нового IP). - `avito_proxy_max_rotations=4` в прод env (бюджет есть), но **enrichment-фазы pipeline на бан делали `abort` БЕЗ вызова changeip** — rotation-логика была только в avito.py SERP-fetch, не в houses/detail-фазах. → `avito_city_sweep` банится и дохнет после ~2 домов; `avito_full_load` дома вообще не трогает. Итог: validated 2/13233. ## Фикс 1 (#1790) — ban-triggered rotation в enrichment-фазах `scrape_pipeline.py`: новая `_rotate_proxy_ip(reason, rotations_done)` (changeip → settle `avito_proxy_rotate_settle_s`=9с → лог old→new). В `run_avito_pipeline` (Step 4 houses / 5 detail / 5b house-detail) и `run_avito_city_sweep` (Phase 4/5/5b): при `consecutive_blocks >= порог` → если остались ротации (`< avito_proxy_max_rotations`) → changeip + reset counter + continue; иначе abort (как раньше). Bounded per-run. #1820 graceful сохранён (одиночный блок не роняет). - **Оба режима**: changeip меняет exit-IP всего proxy endpoint → и curl_cffi, и camoufox (тот же прокси) идут с нового IP на следующем fetch, без переподнятия браузера. - Цепочка enrichment уже рабочая → выживание через бан = дома обогащаются на масштабе. ## Фикс 2 (#1789 minor) — rating_score переехал `avito_houses.py` `parse_houses_state`: рейтинг ушёл из пустого `housePage.ratingPreview` в `reviews.filterEntries[type=score].value` (`scoreFloat`/`scoreString`/`reviewCount`/`ratingStat`). Fallback housePage→reviews.filterEntries. Новостройки не затронуты. ## Тесты 8 новых (3 ban-rotation + 5 rating-fallback), ruff clean, **2108 passed** (2 pre-existing fail вне затронутых файлов). ## Деплой Backend Python → recreate tradein-backend + tradein-scraper. **Env-изменение НЕ требуется** (`AVITO_PROXY_MAX_ROTATIONS=4` уже в проде; фикс активируется кодом). NB: деплой на паузе пока идёт avito-скрап (recreate убьёт in-flight sweep) — мержить когда прогон завершится. Cross-ref #1789, #1790, [[Module_Tradein_Scrapers_Fetch_Arch]].
lekss361 added 1 commit 2026-06-20 18:26:41 +00:00
fix(scrapers): avito ban-triggered IP rotation (#1790) — changeip on block, bounded
All checks were successful
CI / changes (pull_request) Successful in 6s
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
7f036a96af
- Добавлен `_rotate_proxy_ip()` в scrape_pipeline.py: вызывает changeip-URL
  (settings.avito_proxy_rotate_url) + settle-sleep
  (settings.avito_proxy_rotate_settle_s, default 9s), логирует old→new IP.
- В `run_avito_pipeline` (Steps 4/5/5b) и `run_avito_city_sweep` (Phase 4/5/5b):
  при достижении consecutive-block порога — сначала ротация IP, сброс счётчика,
  продолжение; только при исчерпании бюджета (enrich_rotations_done >=
  avito_proxy_max_rotations) — abort (bounded). #1820 graceful сохранён: один
  блок ниже порога ротацию не вызывает.
- Добавлено `avito_proxy_rotate_settle_s: float = 9.0` в config.py
  (ENV: AVITO_PROXY_ROTATE_SETTLE_S). avito_proxy_max_rotations был 4 (с #1731).
- Тесты: rotation_called / bounded_abort / single_block_no_rotation.
lekss361 merged commit 09656077c1 into main 2026-06-20 18:28:30 +00:00
lekss361 deleted branch fix/avito-ban-rotation-houses 2026-06-20 18:28:30 +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#1848
No description provided.