Симптом
Живой прогон (2 из 2, monthly и daily): top_popular и top_related скачиваются успешно — ⬇️ File download starting, Download completed, Tracked download, исключений нет, exit code 0 — но файл содержит только заголовок: 219 и 212 байт, 0 строк данных. dynamics (24 строки) и regions (755 строк) в тех же прогонах приходят полными.
Почему это баг, а не пустая выдача Вордстата
Проверено вручную через CDP, в обход нашего CLI, на той же фразе и том же регионе, на view=table/popular: TABLE_ROW_SELECTOR возвращает 200 реальных строк с данными («новогодние подарки» — 41446 и т.д., не заглушки).
То есть Вордстат данные имеет и отрисовывает, а в CSV они не попадают. Это расхождение между DOM и экспортом, а не отсутствие данных.
Что это опровергает
Ранее по коду утверждалось: предзагрузочный гейт document.querySelectorAll(TABLE_ROW_SELECTOR).length > 0 в collector.py применяется в том числе к top_popular, следовательно успешное прохождение гейта доказывает непустой экспорт.
Вывод неверен. Гейт действительно проходит — строки в DOM есть, это подтверждено и гейтом, и ручной проверкой. Но экспорт всё равно пуст. «Гейт прошёл» и «экспорт непустой» — независимые утверждения; из первого второе не следует.
Связь с существующими issue
Тот же класс, что #11 и #22 (DOM≠экспорт race), но здесь он воспроизведён живьём, а не выведен из документации: 2/2 прогона плюс ручная проверка через CDP.
Почему проходит молча
PR #25 сузил _is_untrustworthy_empty_export до одной DYNAMICS:
return view is WordstatView.DYNAMICS and not dataset.rows
Пустые top_popular/top_related после этого не вызывают ретрая и не считаются подозрительными. Отражаются только в empty_views манифеста (добавлено тем же PR #25), то есть прогон завершается с exit code 0 и Собрано 1 из 1, а пустота видна лишь при чтении manifest.json.
Сужение предиката в #25 было обосновано эмпирически («возвращает ли Вордстат вообще непустой файл для этого вида»). Настоящая находка — прямое опровержение этого основания для топовых представлений: непустой файл возможен, просто мы его не дожидаемся.
Что стоит проверить при исправлении
Ретрай в стиле empty_export_retry_seconds для топовых представлений — вероятный, но непроверенный путь. Прежде чем его реализовывать, стоит выяснить, чем именно момент готовности экспорта отличается от момента появления строк в DOM: гейт уже смотрит на строки и уже проходит, значит ретрай по тому же признаку может оказаться таким же вакуумным.
Отдельно: --keep-raw на таком прогоне даёт сохранённый пустой CSV — удобный артефакт для разбора.
Симптом
Живой прогон (2 из 2, monthly и daily):
top_popularиtop_relatedскачиваются успешно —⬇️ File download starting,Download completed,Tracked download, исключений нет, exit code 0 — но файл содержит только заголовок: 219 и 212 байт, 0 строк данных.dynamics(24 строки) иregions(755 строк) в тех же прогонах приходят полными.Почему это баг, а не пустая выдача Вордстата
Проверено вручную через CDP, в обход нашего CLI, на той же фразе и том же регионе, на
view=table/popular:TABLE_ROW_SELECTORвозвращает 200 реальных строк с данными («новогодние подарки» — 41446 и т.д., не заглушки).То есть Вордстат данные имеет и отрисовывает, а в CSV они не попадают. Это расхождение между DOM и экспортом, а не отсутствие данных.
Что это опровергает
Ранее по коду утверждалось: предзагрузочный гейт
document.querySelectorAll(TABLE_ROW_SELECTOR).length > 0вcollector.pyприменяется в том числе кtop_popular, следовательно успешное прохождение гейта доказывает непустой экспорт.Вывод неверен. Гейт действительно проходит — строки в DOM есть, это подтверждено и гейтом, и ручной проверкой. Но экспорт всё равно пуст. «Гейт прошёл» и «экспорт непустой» — независимые утверждения; из первого второе не следует.
Связь с существующими issue
Тот же класс, что #11 и #22 (DOM≠экспорт race), но здесь он воспроизведён живьём, а не выведен из документации: 2/2 прогона плюс ручная проверка через CDP.
Почему проходит молча
PR #25 сузил
_is_untrustworthy_empty_exportдо однойDYNAMICS:Пустые
top_popular/top_relatedпосле этого не вызывают ретрая и не считаются подозрительными. Отражаются только вempty_viewsманифеста (добавлено тем же PR #25), то есть прогон завершается с exit code 0 иСобрано 1 из 1, а пустота видна лишь при чтенииmanifest.json.Сужение предиката в #25 было обосновано эмпирически («возвращает ли Вордстат вообще непустой файл для этого вида»). Настоящая находка — прямое опровержение этого основания для топовых представлений: непустой файл возможен, просто мы его не дожидаемся.
Что стоит проверить при исправлении
Ретрай в стиле
empty_export_retry_secondsдля топовых представлений — вероятный, но непроверенный путь. Прежде чем его реализовывать, стоит выяснить, чем именно момент готовности экспорта отличается от момента появления строк в DOM: гейт уже смотрит на строки и уже проходит, значит ретрай по тому же признаку может оказаться таким же вакуумным.Отдельно:
--keep-rawна таком прогоне даёт сохранённый пустой CSV — удобный артефакт для разбора.