feat(tradein/scrapers): full_load пропускает листинги обновлённые сегодня при повторном прогоне #1828

Merged
lekss361 merged 1 commit from feat/tradein-skip-seen-today into main 2026-06-20 09:16:34 +00:00
Owner

Зачем

Повторный прогон full_load в рамках одного дня заново upsert'ил уже свежие листинги → лишние записи + холостые срабатывания price-change триггера (record_listing_price_change). Добавляем same-day skip.

Что (tradein-mvp/backend/)

1. save_listings (app/services/scrapers/base.py) — новый keyword-only параметр skip_seen_today: bool = False (backward-compat, прочие вызовы не затронуты).

  • Per-lot prior SELECT расширен: SELECT card_hash, last_seen_at FROM listings WHERE dedup_hash.
  • Если skip_seen_today И строка уже существует И last_seen_at = сегодня по Europe/Moscow → лот пропускается (continue, без upsert и без snapshot), счётчик skipped. Лог: ins=N upd=M skipped_seen_today=K. Возврат (inserted, updated) не изменён.

2. Settings (app/core/config.py): scraper_skip_seen_today: bool = True (ENV SCRAPER_SKIP_SEEN_TODAY; False = всегда обновлять).

3. Wire — только 3 full_load (scrape_pipeline.py): run_avito_full_load / run_cian_full_load / run_yandex_full_load в on_bucket-save передают skip_seen_today=settings.scraper_skip_seen_today.
НЕ затронуты city_sweep / detail_backfill / newbuilding_sweep / domclick — там обновление каждый раз нужно (detail-обогащение).

Поведение (самогейтирующееся)

Первый full_load дня: last_seen=вчера → не сегодня → обрабатывается (last_seen→сегодня). Повторный в тот же день: last_seen=сегодня → пропуск. Новые листинги (нет строки) всегда вставляются. Флаг False → старое поведение.

Тесты

  • 5 новых unit-тестов в tests/test_base_save_listings.py (skip при last_seen=сегодня, обработка при вчера/новый, флаг False = старое, нет snapshot при skip).
  • Проверено напрямую (stub DATABASE_URL): затронутые области зелёные — save_listings + scraper_settings + scheduler_main + sweep_imv_phase + pdf_security = 122 passed. Единственный реальный pre-existing fail — test_cian_valuation cache (не относится).
  • ruff green.

NB: save_listings — shared, поэтому менялся только аддитивно (default-False параметр); существующее поведение всех прочих вызовов сохранено.

## Зачем Повторный прогон `full_load` в рамках одного дня заново upsert'ил уже свежие листинги → лишние записи + холостые срабатывания price-change триггера (`record_listing_price_change`). Добавляем same-day skip. ## Что (`tradein-mvp/backend/`) **1. `save_listings` (`app/services/scrapers/base.py`)** — новый keyword-only параметр `skip_seen_today: bool = False` (backward-compat, прочие вызовы не затронуты). - Per-lot prior SELECT расширен: `SELECT card_hash, last_seen_at FROM listings WHERE dedup_hash`. - Если `skip_seen_today` И строка уже существует И `last_seen_at` = сегодня по **Europe/Moscow** → лот пропускается (`continue`, без upsert и без snapshot), счётчик `skipped`. Лог: `ins=N upd=M skipped_seen_today=K`. Возврат `(inserted, updated)` не изменён. **2. Settings** (`app/core/config.py`): `scraper_skip_seen_today: bool = True` (ENV `SCRAPER_SKIP_SEEN_TODAY`; False = всегда обновлять). **3. Wire — только 3 full_load** (`scrape_pipeline.py`): `run_avito_full_load` / `run_cian_full_load` / `run_yandex_full_load` в on_bucket-save передают `skip_seen_today=settings.scraper_skip_seen_today`. **НЕ затронуты** `city_sweep` / `detail_backfill` / `newbuilding_sweep` / `domclick` — там обновление каждый раз нужно (detail-обогащение). ## Поведение (самогейтирующееся) Первый full_load дня: `last_seen=вчера` → не сегодня → обрабатывается (last_seen→сегодня). Повторный в тот же день: `last_seen=сегодня` → пропуск. Новые листинги (нет строки) всегда вставляются. Флаг `False` → старое поведение. ## Тесты - 5 новых unit-тестов в `tests/test_base_save_listings.py` (skip при last_seen=сегодня, обработка при вчера/новый, флаг False = старое, нет snapshot при skip). - Проверено напрямую (stub DATABASE_URL): затронутые области зелёные — `save_listings` + `scraper_settings` + `scheduler_main` + `sweep_imv_phase` + `pdf_security` = **122 passed**. Единственный реальный pre-existing fail — `test_cian_valuation` cache (не относится). - ruff green. NB: `save_listings` — shared, поэтому менялся только аддитивно (default-False параметр); существующее поведение всех прочих вызовов сохранено.
lekss361 added 1 commit 2026-06-20 09:16:05 +00:00
feat(tradein/scrapers): full_load пропускает листинги обновлённые сегодня при повторном прогоне (skip_seen_today)
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
533299ea47
lekss361 merged commit a425f2f200 into main 2026-06-20 09:16:34 +00:00
lekss361 deleted branch feat/tradein-skip-seen-today 2026-06-20 09:16:34 +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#1828
No description provided.