fix(scrapers): avito_full_load краш (source_id-reconcile) + cian/yandex ban-ротация #1921

Merged
lekss361 merged 2 commits from fix/scraper-resilience-upsert-rotation into main 2026-06-26 16:19:07 +00:00
Owner

Два «тихих убийцы недели» из аудита «Мера».

Коммит 1 (197068c5) — avito_full_load краш UniqueViolation

Корень (краш run 398 сегодня 13:47): save_listings делает INSERT ON CONFLICT (dedup_hash). Когда контент существующего ad дрейфит → новый dedup_hash → SELECT по dedup пуст → INSERT → коллизия по (source,source_id) (listings_source_source_id_uq) → UniqueViolationвесь прогон падает.
Фикс: INSERT обёрнут в per-lot db.begin_nested() SAVEPOINT; при IntegrityError на non-null source_id → rollback + UPDATE by (source,source_id) с новым dedup_hash+контентом. NULL source_id (yandex) — старый путь. Один битый lot не роняет прогон. +7 тестов.

Коммит 2 (c1cdf396) — cian/yandex ban/stuck-ротация (зеркало avito #1790/#1848)

Корень: _rotate_proxy_ip был только avito. cian банится, yandex упирался в stuck-прокси — без ротации.
Эмпирика (живой пробинг): cian-прокси auto-rotate (changeip+retry на block помогает), yandex manual+stuck (changeip оживляет, проверено).
Фикс: _rotate_proxy_ip теперь source-aware ({source}_proxy_rotate_url + {source}_proxy_max_rotations, avito-fallback). Wire в cian detail-loop + yandex address-enrich loop (на ≥3 consecutive fail → changeip(source)+retry, bounded). Avito-путь не сломан. +cian_proxy_max_rotations=4, yandex_proxy_max_rotations=4. +7 тестов.

Проверка

ruff clean, 14 новых тестов pass, 838 в keyword-suite, 0 регрессий.

Деплой

recreate tradein-backend + tradein-scraper. Аддитивно, без миграций. Env уже имеет rotate_url для cian/yandex. Cross-ref #1790, #1848, #1871, аудит скрейперов сессии.

Два «тихих убийцы недели» из аудита «Мера». ## Коммит 1 (`197068c5`) — avito_full_load краш UniqueViolation Корень (краш run 398 сегодня 13:47): `save_listings` делает `INSERT ON CONFLICT (dedup_hash)`. Когда контент существующего ad дрейфит → новый `dedup_hash` → SELECT по dedup пуст → INSERT → коллизия по `(source,source_id)` (`listings_source_source_id_uq`) → `UniqueViolation` → **весь прогон падает**. Фикс: INSERT обёрнут в per-lot `db.begin_nested()` SAVEPOINT; при `IntegrityError` на non-null `source_id` → rollback + UPDATE by `(source,source_id)` с новым `dedup_hash`+контентом. NULL source_id (yandex) — старый путь. Один битый lot не роняет прогон. +7 тестов. ## Коммит 2 (`c1cdf396`) — cian/yandex ban/stuck-ротация (зеркало avito #1790/#1848) Корень: `_rotate_proxy_ip` был только avito. cian банится, yandex упирался в stuck-прокси — без ротации. Эмпирика (живой пробинг): cian-прокси auto-rotate (changeip+retry на block помогает), yandex manual+stuck (changeip оживляет, проверено). Фикс: `_rotate_proxy_ip` теперь `source`-aware (`{source}_proxy_rotate_url` + `{source}_proxy_max_rotations`, avito-fallback). Wire в cian detail-loop + yandex address-enrich loop (на ≥3 consecutive fail → changeip(source)+retry, bounded). Avito-путь не сломан. +`cian_proxy_max_rotations=4`, `yandex_proxy_max_rotations=4`. +7 тестов. ## Проверка ruff clean, 14 новых тестов pass, 838 в keyword-suite, 0 регрессий. ## Деплой recreate tradein-backend + tradein-scraper. Аддитивно, без миграций. Env уже имеет rotate_url для cian/yandex. Cross-ref #1790, #1848, #1871, аудит скрейперов сессии.
lekss361 added 2 commits 2026-06-26 16:11:14 +00:00
fix(scrapers): ban/stuck-ротация для cian+yandex (provider-aware _rotate_proxy_ip)
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
c1cdf3969c
lekss361 merged commit 74ea6659ea into main 2026-06-26 16:19:07 +00:00
lekss361 deleted branch fix/scraper-resilience-upsert-rotation 2026-06-26 16:19:07 +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#1921
No description provided.