refactor(tradein/scraper-kit): avito providers on shared _base.py (#2361) #2375
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2375
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/tradein-scraper-kit-f4a-avito"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что мигрировано
avito/{serp,detail}.py->build_browser_fetcher()/build_document_session()изscraper_kit.providers._base(Foundation #2358):serp.py:BrowserFetcher(source="avito", endpoint=...)в__aenter__->build_browser_fetcher(config, "avito");_build_cffi_session()(25s timeout, document headers, scraper_proxy_url) ->build_document_session().detail.py:_build_detail_session()(тот же document-headers dict, 25s timeout) ->build_document_session(proxy_url=..., timeout=25).Kwarg-by-kwarg diff подтверждает идентичное поведение (proxy resolution, timeout=25, impersonate=chrome120, DOCUMENT_HEADERS verbatim).
Caveat: use_pool (проверено explicit)
serp.py.__aenter__раньше конструировалBrowserFetcherбезproxy_provider/use_pool(implicitNone/False). После миграцииuse_poolчитаетconfig.use_proxy_pool_browserвместо hardcodedFalse— НОproxy_providerостаётсяNone(defaultbuild_browser_fetcher), аBrowserFetcher._use_poolгейтитсяand self._proxy_provider is not None(browser_fetcher.py:215). Приproxy_provider=Noneэффективныйuse_poolвсегдаFalseнезависимо от конфига. Verified: behavior-preserving, не тихая смена прод-поведения. (config.use_proxy_pool_browserdefault — тожеFalse.)imv.py: НЕ мигрирован (единственное отклонение от issue-скоупа)
Own-session curl_cffi construction (
headers=_DOC_HEADERS, тот же дублированный dict) технически подходит под миграцию, ноbuild_document_session()резолвитAsyncSessionчерез module-level импорт в_base.py(bind один раз при первом импорте), аtests/scrapers/test_avito_imv_kit_parity.py(#2334) патчитcurl_cffi.requests.AsyncSessionчерезunittest.mock— это работает только с локальным call-time импортом внутри функции (как было). Миграция роняет 2 реальных зелёных теста (test_kit_evaluate_via_imv_{with,without}_config_uses_proxy) — не шум. Прод-поведение идентично в обоих вариантах, но задача явно запрещает weaken/skip parity-тесты — оставлено как есть + inline-комментарий с находкой.Follow-up для F4b-d (cian/yandex/domclick): тот же паттерн теста (
unittest.mock.patch("curl_cffi.requests.AsyncSession")на module-level импорт) сломает миграцию любого provider'а с аналогичным test-mock таргетом. Стоит завести lightweight follow-up issue против_base.py'sAsyncSessionimport style или против теста.Code review (verdict: approve)
Ревьюер сам перепроверил все 6 пунктов (kwarg-diff, use_pool investigation, scope
git show --stat, targeted parity tests 45/45 +-k avito450/450, full suite, ruff). Minor findings (не блокирующие):serp.pyruff-format drift (4 hunks) — pre-existing наmainдо этого PR, не тронуто.test_search_api.py::test_search_cache_hit(401 vs 200) — pre-existing флейк #2208, не связан с этим диффом.Tests
-k avito: 450/450 passed (после rebase на актуальный main — перепроверено)ruff checkclean на всех 3 файлах;ruff format --checkdrift наserp.pyподтверждён pre-existing (идентичен на unmodified main)Closes #2361
Мигрирует avito/{serp,detail}.py на build_browser_fetcher()/ build_document_session() из scraper_kit.providers._base (Foundation #2358): - serp.py: BrowserFetcher(source="avito", endpoint=...) в __aenter__ -> build_browser_fetcher(config, "avito"); _build_cffi_session() (25s timeout, document headers, scraper_proxy_url) -> build_document_session(). - detail.py: _build_detail_session() (тот же document-headers dict, 25s timeout) -> build_document_session(proxy_url=..., timeout=25). Caveat (#2361, проверено explicit): serp.py __aenter__ раньше конструировал BrowserFetcher БЕЗ proxy_provider/use_pool (implicit None/False). После миграции use_pool читает config.use_proxy_pool_browser вместо hardcoded False - НО proxy_provider остаётся None (build_browser_fetcher default), а BrowserFetcher._use_pool гейтится `and self._proxy_provider is not None` (browser_fetcher.py:215) - при proxy_provider=None use_pool всегда эффективно False независимо от config. Verified: behavior-preserving, не тихая смена прод-поведения. imv.py: НЕ мигрирован (единственное отклонение от issue). Own-session curl_cffi construction (headers=_DOC_HEADERS - тот же дублированный dict) технически подходит под миграцию, но build_document_session() резолвит AsyncSession через module-level импорт _base.py (biндится один раз при первом импорте _base), а tests/scrapers/test_avito_imv_kit_parity.py (#2334) патчит curl_cffi.requests.AsyncSession через unittest.mock - это работает только с локальным call-time импортом (как было). Миграция роняет 2 реальных теста (test_kit_evaluate_via_imv_{with,without}_config_ uses_proxy) - не шум, зелёные на main. Прод-поведение идентично в обоих вариантах, но задача явно запрещает weaken/skip parity-тесты - оставлено как есть + inline-комментарий с находкой. Follow-up для будущих групп (cian/yandex/domclick F4b-d): тот же паттерн теста сломает миграцию любого provider с аналогичным unittest.mock.patch("curl_cffi.requests.AsyncSession"). Tests: full backend suite 3278 passed, 1 known pre-existing flake (test_search_api.py::test_search_cache_hit, #2208), 6 skipped. Все avito kit_parity/golden_parity тесты + test_scraper_kit_pipeline_parity2.py (cross-provider) зелёные.