4 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
5f1a2ec585 |
perf(tradein/browser): якорная вкладка выдачи вместо переоткрытия origin на каждую карточку
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
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
CI Trade-In / browser-tests (pull_request) Successful in 1m26s
При reuse_context=true сайдкар на каждый fetch делал goto(origin), а потом goto(url) — то есть перед каждой карточкой заново грузил страницу выдачи в той же единственной вкладке. Смысл origin-прогрева (получить пропуск QRATOR в контексте) при этом достигался ровно один раз, на первой карточке: дальше контекст уже прогрет, а повторная навигация — чистая трата рукопожатия. Ручная проверка 29.08 показала, как ходит человек: вкладка с выдачей открыта всю сессию, объявления открываются из неё в новых вкладках. 91 карточка подряд, 0 отказов. Здесь то же самое: origin поднимается в отдельной долгоживущей вкладке (_anchor_pages), карточки идут своими вкладками, выдача не перезагружается. Замер на тестовом сайдкаре (узел 11, 12 карточек): якорь поднялся ровно один раз, 12/12 успех, медиана ~15 с против ~24 с и без роста времени к концу прогона (раньше последние карточки уходили в 34-52 с). Откат безопасный: не поднялась якорная вкладка — молча возвращаемся к прежнему поведению (goto(origin) перед карточкой). Без reuse_context поведение не меняется вовсе. Сброс контекста роняет и якорь. |
||
|
|
5391a36880 |
fix(tradein/domclick): недосчитанная QRATOR-страница уходила наверх как контент
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 12s
CI Trade-In / frontend-checks (pull_request) Has been skipped
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
CI Trade-In / browser-tests (pull_request) Successful in 1m15s
Домклик отдаёт рукопожатие без единого стабильного маркера (в отличие от Авито), поэтому _CHALLENGE_MARKERS (сняты с Авито, #3045) на нём никогда не матчились и ветка ожидания не включалась — недосчитанная страница уезжала наверх, парсер не находил __SSR_STATE__ и поднимал ложный блок. Это и был двухнедельный attempted=3, blocked=3, enriched=0 у domclick_detail_backfill. Для provider=="domclick" логика инвертирована: положительно опознаём только два крайних состояния — успех (__SSR_STATE__) и статический отказ площадки («403 | Домклик» / «похоже, ваш запрос выглядит необычно»); всё остальное (загрузчик рукопожатия, нерендеренная PoW-страница без каких-либо маркеров) трактуется как «рукопожатие ещё идёт» и уходит в существующий _wait_out_pow_challenge с кастомным is_pending. HTTP-статус для DomClick не используется как сигнал (401 приходит и у отказа, и у успеха, и у здорового рукопожатия) — решает только тело. Avito и прочие провайдеры идут по старой elif-ветке без изменений. _wait_out_pow_challenge получил опциональный параметр is_pending (дефолт _is_pow_challenge) — golden-parity для всех, кроме domclick. |
||
|
|
b9025de666 |
fix(tradein/domclick): площадка отдаёт одну карточку на процесс браузера, а мы держали один на весь прогон (#3205)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
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
CI Trade-In / browser-tests (pull_request) Successful in 1m5s
Замер на проде 2026-08-29. Три независимых запуска camoufox через прод-прокси, идём по карточкам до первого отказа — каждый раз одно и то же: карточка #1 даёт 200 и ~1 МБ с SSR-стейтом, карточка #2 даёт 401 и страницу отказа на 26 625 байт. A/B на восьми карточках: свой браузер на каждую — 4 из 4 успеха, один браузер на четыре — 1 из 4. Прямой выход с сервера и выход через прокси неразличимы (1 из 8 в обоих условиях), то есть дело не в IP. Свежего КОНТЕКСТА не хватает: в контрольном замере каждая карточка бралась через browser.new_page(), в новом изолированном контексте, — и всё равно отказ со второй. Признак живёт на уровне процесса, camoufox генерирует отпечаток при запуске, а не при создании контекста. Отсюда: reset_context (#3118) эту задачу не решает в принципе. Цена перезапуска — 0.6 с (3.5 с только первый, холодный). - PROVIDERS: добавлен "domclick" (+ host-detect). Раньше он проваливался в generic и делил браузер со счётчиком страниц с прочим трафиком — при пороге перезапуска 1 это было бы неверно. - BROWSER_RECYCLE_PAGES стал поставщик-зависимым (_resolve_recycle_pages + BROWSER_RECYCLE_PAGES_{PROVIDER}), по образцу BROWSER_BLOCK_IMAGES_{PROVIDER} из #3185. Код-дефолт domclick=1, остальным прежние 15 — у Авито и Циана узор другой и своего замера под него нет. Отдельно починены ~24 холостых охранника в тестах. Они делали monkeypatch.setattr(server, "BROWSER_RECYCLE_PAGES", 10_000), чтобы запретить перезапуск браузера; после перехода на словарь этот патч перестал на что-либо влиять, и набор оставался зелёным лишь потому, что ни один тест не делает 15 страниц подряд. Теперь патчится _RECYCLE_PAGES_BY_PROVIDER, а сама глобальная константа убрана, чтобы её не патчили снова. Проверено мутацией: при пороге 1 для всех провайдеров падают ровно три теста, которые этот дефолт и проверяют, остальные 155 удерживаются — значит охранники работают. |
||
| 5be64c6688 |
fix(tradein/scrapers): хранилище авторизованной сессии Яндекс.Недвижимости (#3195)
All checks were successful
Deploy Trade-In / changes (push) Successful in 11s
Deploy Trade-In / build-frontend (push) Has been skipped
Deploy Trade-In / build-browser (push) Successful in 2m18s
Deploy Trade-In / test (push) Successful in 4m4s
Deploy Trade-In / build-backend (push) Successful in 1m36s
Deploy Trade-In / deploy (push) Successful in 2m0s
Deploy Trade-In / deploy-status (push) Successful in 1s
Deploy Trade-In / perimeter-smoke (push) Successful in 11s
|