Compare commits

..

No commits in common. "195f9f3697fc516f6d6307842752e2a553b1517c" and "7563f849db4da4de3418c93e0aab58b238467287" have entirely different histories.

7 changed files with 35 additions and 9 deletions

View file

@ -886,17 +886,21 @@ class Settings(BaseSettings):
"""
return self.scraper_proxy_url_env
# ── Ban-recovery budget knobs (changeip снят #2616 шаг 2) ────────────────
# Живая ротация IP — ASOCKS_API_TOKEN / app.services.proxy_rotation (#2611);
# `_rotate_ip`/`_rotate_proxy_ip` остались no-op после удаления changeip-ссылки.
# Обе ручки читаются: `*_proxy_max_rotations` гейтит бюджет попыток в
# ban-rotation (scraper_kit.orchestration.pipeline._max_rotations),
# `avito_proxy_rotate_settle_s` — верхняя граница asyncio.wait_for в
# app.tasks.avito_detail_backfill.
# #3212: proxy_rotate_attempts / proxy_rotate_attempt_timeout_s удалены —
# ретраи changeip-GET, которых больше нет; ни одного читателя не осталось.
# ── Ban-recovery budget knobs (changeip-механизм снят #2616 шаг 2) ────────
# Раньше эти поля тюнили retry/settle для GET-changeip mobileproxy
# (AVITO_PROXY_ROTATE_URL и т.д., см. историю выше) — сама ссылка удалена
# (закрытый аккаунт), поэтому IP-ротация сейчас всегда no-op (_rotate_ip /
# _rotate_proxy_ip возвращают False без сетевого похода). Поля оставлены:
# `*_proxy_max_rotations` продолжают гейтить бюджет попыток в ban-rotation
# state machine (scraper_kit.orchestration.pipeline._try_rotate_within_budget)
# — те же 0 попыток "успеха", что и раньше при мёртвом changeip, просто без
# затрат на HTTP; `avito_proxy_rotate_settle_s` — верхняя граница
# asyncio.wait_for в app.tasks.avito_detail_backfill (страховка от зависания).
# Живая ротация IP — ASOCKS_API_TOKEN / app.services.proxy_rotation (#2611).
avito_proxy_max_rotations: int = 4
avito_proxy_rotate_settle_s: float = 9.0
proxy_rotate_attempt_timeout_s: float = 8.0
proxy_rotate_attempts: int = 3
# ── ASocks pool-proxy rotation (#2600) ───────────────────────────────────
# Bearer-токен веб-кабинета ASocks для POST .../unlimited-proxy/{portId}/refresh-ip

View file

@ -175,6 +175,14 @@ class RealScraperConfig:
def avito_proxy_rotate_settle_s(self) -> float:
return _settings.avito_proxy_rotate_settle_s
@property
def proxy_rotate_attempts(self) -> int:
return _settings.proxy_rotate_attempts
@property
def proxy_rotate_attempt_timeout_s(self) -> float:
return _settings.proxy_rotate_attempt_timeout_s
@property
def cian_proxy_max_rotations(self) -> int:
return _settings.cian_proxy_max_rotations

View file

@ -155,6 +155,8 @@ def _config() -> SimpleNamespace:
avito_proxy_max_rotations=0,
avito_serp_ok_not_banned=True,
avito_proxy_rotate_settle_s=0.0,
proxy_rotate_attempts=1,
proxy_rotate_attempt_timeout_s=1.0,
avito_full_load_price_cap=1400,
avito_full_load_max_pages=100,
avito_full_load_concurrency=1,

View file

@ -99,6 +99,8 @@ def _config() -> SimpleNamespace:
avito_proxy_max_rotations=0,
avito_serp_ok_not_banned=True,
avito_proxy_rotate_settle_s=0.0,
proxy_rotate_attempts=1,
proxy_rotate_attempt_timeout_s=1.0,
cian_proxy_max_rotations=0,
yandex_proxy_max_rotations=0,
cian_full_load_per_fetch_timeout_s=0.0,

View file

@ -195,6 +195,8 @@ def _serp_config() -> SimpleNamespace:
avito_proxy_max_rotations=0,
avito_serp_ok_not_banned=True,
avito_proxy_rotate_settle_s=0.0,
proxy_rotate_attempts=1,
proxy_rotate_attempt_timeout_s=1.0,
scraper_skip_seen_today=False,
)

View file

@ -128,6 +128,8 @@ class _Scenario:
avito_proxy_max_rotations=self.avito_proxy_max_rotations,
avito_serp_ok_not_banned=self.avito_serp_ok_not_banned,
avito_proxy_rotate_settle_s=0.0,
proxy_rotate_attempts=1,
proxy_rotate_attempt_timeout_s=1.0,
cian_proxy_max_rotations=0,
yandex_proxy_max_rotations=0,
scraper_skip_seen_today=False,

View file

@ -157,6 +157,12 @@ class ScraperConfig(Protocol):
avito_serp_ok_not_banned: bool
# changeip settle-пауза (секунды) после ротации IP.
avito_proxy_rotate_settle_s: float
# Ретраи changeip-GET: N попыток по proxy_rotate_attempt_timeout_s каждая (#1950).
# changeip-ссылка снята (#2616 шаг 2) — эти два поля сейчас не читаются
# ban-rotation кодом (см. avito_proxy_max_rotations выше), оставлены как
# budget-верхняя-граница для app.tasks.avito_detail_backfill wait_for.
proxy_rotate_attempts: int
proxy_rotate_attempt_timeout_s: float
# Cian лимит ротаций (rotate_url снят #2616 шаг 2, см. avito_proxy_max_rotations).
cian_proxy_max_rotations: int
# Yandex лимит ротаций (аналогично).