fix(tradein): фильтр выдачи Яндекса мёртв — slug ЖК ищем по странице объекта (#2860) #2923
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
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#2923
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2860-yandex-slug-resolver"
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?
Разобрал по порядку, который задан в задаче.
1. «Почему прогон стал недельным» — он не ломался
interval_days: 7— недельный по конфигу. Разрыв 03.08 → 10.08, который выгляделпропуском, это и есть штатное расписание. Отдельный вопрос — правильна ли недельная
частота при очереди в 397 домов и лимите 5 за прогон, но это решение, а не поломка.
2. На чём спотыкается разрешение адресов
Прогнал резолвер тем же трактом, каким ходит обход — через браузерный сайдкар прода
(
docker exec tradein-scraper), а не своим curl'ом:Фетч работает. Дальше разобрал сам HTML:
Фильтр
?siteId=Яндексом больше не применяется. Отдаётся общий список новостроек.Проверил на втором id (2671892) — та же страница, те же 35 ЖК, запрошенного снова нет.
То есть предположение в коде —
markup drift?— неверно: парсер исправен, умерластратегия. Вопросительный знак убран вместе с догадкой (это ровно тот случай, когда
«диагностика со знаком вопроса» дальше читается как факт).
3. Было ли иначе
Последний прогон с
succeeded > 0— 1489 от 15.07, и даже он давалsucceeded: 1приfailed_resolve: 4. Витрина стоит на 34 строках с 15.07.02:51. С 16.07 — четырнадцатьпрогонов подряд по нулям.
Как чиню
В URL Яндекса авторитетен id, slug — косметика. Страница с плейсхолдером вместо slug
доезжает до нужного ЖК (проверено на проде 19.08):
Плейсхолдер отфильтрован из результата: страница ссылается сама на себя запрошенным
адресом, и без фильтра мы бы «разрешили» slug в тот, что сами и придумали — то есть
записали бы выдумку как факт.
Regex теперь привязан к конкретному id. Общий
_JK_SLUG_REматчил ЛЮБУЮ пару slug-id ина общем списке давал 128 совпадений — привязка к id и есть разница между «нашли ЖК» и
«нашли какой-то ЖК».
Статус прогона
processed > 0приsucceeded == 0больше неdone, аfailedс названной причиной.Счётчик и раньше был честный — не хватало вывода из него (#2674: «механизм
исполняется, счётчик честный, вывод не делает никто»).
Счётчик не подгоняю — как и просит задача: если дома не разрешаются, честный исход
назвать прогон неуспешным.
Проверка
Тесты двусторонние, против кода из main:
pytestрезолвер + статус + существующий sweep — 25 passedruff check— cleanЧего этот PR НЕ чинит
Очередь упирается в те же пять домов. 396 из 397 ожидающих не имеют slug, выборка —
ORDER BY h.id LIMIT 5, а неудача ничего не помечает. Поэтому каждую неделю берутсябуквально одни и те же пять домов (6706, 6741, 6757, 6774, 6785). Пока резолвер был
сломан, это не было видно; после этой правки голова очереди сдвинется, но любой
неразрешимый дом снова заблокирует её навсегда. Нужен
last_attempt_at/backoff —это миграция, завожу отдельно.
При лимите 5 и недельном интервале разбор 397 домов займёт полтора года — второй довод
к тому же разговору о расписании.
Refs #2860