Wordstat без браузера: парсинг через Yandex Cloud API
У меня значительная часть работы — семантика и работа с ключами: частоты, уточнённые формы, расширение ядра по «Популярным» в Яндекс Вордстате. Руками это неприемлимо, тем более на больших объёмах.
Раньше использовал пресет от А-парсера по пробиву вордстата, но Яндекс поменял endpoint и теперь пресет нужно править — решил не ждать техподдержку и реализовал своё решение.
Я собрал небольшой Python-скрипт под официальный Cloud Search API (topRequests): без браузера, с очередью, прогрессом и нормальной остановкой по квоте.
→ github.com/google-dad/wordstat-parser-api
Зачем мне это в SEO-процессе
Типовые задачи, где Wordstat всё ещё нужен:
- оценить спрос по списку ключей (базовая / точная / уточнённая);
- расширить ядро: снять «Популярные» по seed и отфильтровать мусор;
- прогнать большой список ночью и утром забрать Excel, а не сидеть у экрана.
Раньше я упирался в парсинг интерфейса. Сейчас для меня важнее стабильный контракт API, понятные ошибки (401/403/429/400) и возможность продолжить с того же места.
Сколько стоит пробив на 1000 запросов
Когда объём растёт, сравниваю не только удобство, но и цену за единицу работы — один seed, одна частота или один сбор «Популярных». Ниже — ориентиры по трём вариантам, которые я реально рассматривал.
| Сервис | Модель оплаты | ₽ за 1000 запросов | Лимиты | Что считается за «1 запрос» |
|---|---|---|---|---|
| Мой скрипт (Yandex Cloud API) | Pay-as-you-go + грант 4000 ₽ / 2 мес при старте | ~20 ₽ | ~100 запросов/час по умолчанию (квота через ТП) | 1 вызов topRequests = 1 API-запрос; до 2000 фраз в ответе |
| XMLRiver (Wordstat) | Предоплата на баланс | 25 ₽ (базовый); от 12 ₽ при тарифе с предоплатой 50 000 ₽ | Без жёсткой «подписки»; баланс | 1 «страница» Wordstat = частота seed + до 2000 уточняющих |
| Word Keeper Micro | 749 ₽ / мес | ~30 ₽ (749 ÷ 25) | 25 000 лимитов / мес | 1 поданная фраза на парсинг = 1 лимит |
API Яндекса платный: ~0,02 ₽ за вызов ≈ 20 ₽ за 1000. Но при регистрации в Yandex Cloud и привязке карты на момент августа 2026 дают стартовый грант 4000 ₽ на 2 месяца — это примерно ~200 000 API-вызовов (4000 ÷ 0,02). Для первого прогона семантики часто хватает без расходов «из своего кармана», пока не исчерпан баланс. Условия гранта Яндекс может менять — перед стартом сверяю в консоли биллинга.

Рис. 5. Биллинг: стартовый грант 4000 ₽, остаток и срок действия (август 2026)
На скрине — ~301 ₽ потребления за 30 дней и остаток гранта: первый прогон семантики укладывается в бесплатный баланс, а не в «свои» деньги.
На объёме 25 000 операций (как у тарифа Word Keeper Micro):
| На 25 000 операций | Примерная сумма |
|---|---|
| Yandex API (скрипт) | ~500 ₽ (25 × 20 ₽), если квота позволяет |
| XMLRiver (базовый) | ~625 ₽ (25 × 25 ₽) |
| Word Keeper Micro | 749 ₽ фикс / мес |
Вывод: самый дешёвый ли мой скрипт
Среди сравниваемых за 1 API-вызов — да: ~20 ₽ / 1000, дешевле базового XMLRiver (25 ₽) и Word Keeper Micro (~30 ₽). С учётом гранта 4000 ₽ первые месяцы фактически 0 ₽ своих денег, пока не кончится баланс.
В абсолютном смысле на рынке — не всегда: XMLRiver при крупной предоплате — от 12 ₽ / 1000; при режиме b+e+p в моём скрипте ≈ 60 ₽ / 1000 фраз (три вызова на seed).
Word Keeper — не про минимальную цену за запрос, а про абонентку, UI и готовые инструменты без настройки Cloud и Python.
Единицы учёта у всех разные — сравнение условное. Отдельно помню про квоту ~100/час у Yandex: по деньгам выгодно, по скорости массового прогона без увеличения квоты — нет.
Цены — на момент публикации; перед массовым прогоном сверяю прайсы: Yandex Search API, XMLRiver, Word Keeper.
Что умеет скрипт
Два режима из одного wordstat_api.py:
- Частоты — читает
input/queries.txt, пишет строки вoutput/wordstat_report.xlsx. - Сбор фраз — топ «Популярные» (до 2000 на seed), минус-слова из
input/stop_words.txt, результат вoutput/wordstat_words.txt.
Для частот можно выбрать типы мультивыбором:
b— базовая;e— точная ("фраза");p— уточнённая ("!слово !словo").
По умолчанию — только базовая. Это сознательно: каждый тип = отдельный запрос к API, а квота Wordstat в Search API по умолчанию около 100 запросов в час. Три типа на фразу съедают лимит втрое быстрее.

Рис. 1. Консоль: меню режимов и выбор b / e / p

Рис. 2. Фрагмент wordstat_report.xlsx

Рис. 3. Кусок wordstat_words.txt после сбора «Популярных»
Прогресс и квота
Успешно обработанный seed сразу пишется в output/ и удаляется из input/queries.txt. Повторный запуск продолжает с оставшихся строк; Excel и файл слов дописываются, а не перезаписываются.
При серии 429 скрипт останавливается после 10 подряд — прогресс уже сохранён, можно вернуться позже. Между запросами пауза ~0,25 с.
Практический workflow:
- Seed-лист → режим сбора фраз → большой
wordstat_words.txt. - Чищу список, кладу в
queries.txt. - Режим частот с
--freq-types b— максимум фраз на часовую квоту. - Точную/уточнённую гоняю точечно (
be/bep) по отфильтрованному ядру.
Лимиты API
По умолчанию для Wordstat в Cloud Search API:
| Ограничение | Значение |
|---|---|
| Запросов в час | 100 |
| Запросов в секунду | до 10 |
Один вызов topRequests = 1 единица квоты (независимо от numPhrases). В консоли «Квоты» отдельной строки Wordstat может не быть — лимит всё равно действует через HTTP 429.

Рис. 6. Обращение в ТП: повышение квоты «количество запросов в час на получение статистики» до 5000
Строки Wordstat в разделе «Квоты» может не быть, но через поддержку лимит реально поднимают — на скрине ответ от 26.08.2026 с квотой 5000 запросов/час.
Увеличение — через поддержку Yandex Cloud: обращение с ID облака, каталога, платёжного аккаунта и желаемой квотой (например 5000/час). Секретный ключ в обращение не прикладываю — достаточно описать авторизацию (API-ключ, scope yc.search-api.execute, роль search-api.webSearch.user).
Как получить API-ключ
Скрипт использует Yandex Cloud Search API v2, не OAuth Wordstat и не браузер. Нужны два значения:
| Параметр | Пример | Куда |
|---|---|---|
api_key |
AQVN... |
секретный ключ |
folder_id |
b1... |
ID каталога в Cloud |
Оба кладу в data/credentials.txt (шаблон — data/credentials.example.txt). Файл в .gitignore — в GitHub не коммитить.
1. Аккаунт и биллинг
- Регистрация в Yandex Cloud Console.
- Привязка платёжного аккаунта / карты (биллинг часто обязателен даже для тестовых вызовов).
2. Каталог (folder)
- В консоли создаю каталог (не «ресурс»).
- Копирую ID из URL:
https://console.yandex.cloud/folders/b1xxxxxxxxxxxxxxxxxxxx/dashboard
↑ это folder_id
Или: страница каталога → Обзор → Идентификатор.
3. Сервисный аккаунт и роль
- Каталог → IAM → Сервисные аккаунты → создать.
- Назначаю роль на каталог:
search-api.webSearch.user.
4. API-ключ
- Открываю сервисный аккаунт → API-ключи → Создать API-key.
- В Область действия (Scope) выбираю:
yc.search-api.execute. - Сохраняю секрет (
AQVN...) сразу — показывают один раз.
Делается в console.yandex.cloud, не обязательно в AI Studio.
5. Файл credentials
api_key=AQVN_ВАШ_СЕКРЕТНЫЙ_КЛЮЧ
folder_id=b1_ВАШ_FOLDER_ID
6. Проверка ключа (PowerShell)
Перед массовым прогоном проверяю один запрос:
chcp 65001 | Out-Null
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$apiKey = "AQVN...."
$folderId = "b1...."
$uri = "https://searchapi.api.cloud.yandex.net/v2/wordstat/topRequests"
$body = @{ phrase = "seo оптимизация"; numPhrases = 5; folderId = $folderId } | ConvertTo-Json
$bytes = [System.Text.Encoding]::UTF8.GetBytes($body)
Invoke-RestMethod -Uri $uri -Method POST `
-Headers @{ Authorization = "Api-Key $apiKey" } `
-ContentType "application/json; charset=utf-8" `
-Body $bytes
Успех: в ответе totalCount и results.
| Код | Обычно значит |
|---|---|
| 401 | неверный api_key |
| 403 | нет роли / scope / биллинга |
| 400 | неверный или пустой folder_id |
| 429 | превышен лимит (~100/час) |
Установка и запуск
python -m venv .venv
# Windows
.venv\Scripts\activate
# Linux/macOS
source .venv/bin/activate
pip install -r requirements.txt
Запросы — в input/queries.txt, минус-слова — в input/stop_words.txt.
python wordstat_api.py
Без меню:
python wordstat_api.py --mode 1 --freq-types b
python wordstat_api.py --phrases
--freq-types: b / e / p или base,exact,precise. Без флага — только базовая.
Грязные фразы: кавычки, «Ох!» и 400 Invalid query
В семантике часто встречаются названия в кавычках (Студия "Ракурс" дорамы) или Ох!. В «голом» seed API легко отвечает HTTP 400 Invalid query.
Скрипт нормализует строку: снимает кавычки и !, плюс &, /, | и т.п. Операторы точной/уточнённой частоты навешиваются отдельно — в seed их тащить не нужно.
Если после нормализации запрос пустой или API вернул 400, seed уходит в output/invalid_queries.txt и снимается с очереди.
Кому подойдёт — и когда нет
Подойдёт, если вы:
- работаете списками и файлами, а не разовыми кликами;
- готовы один раз настроить Cloud и ключ;
- планируете батчи с учётом часовой квоты.
Не замена веб-Вордстату «на глаз»: регионы, ассоциации, визуальная аналитика в UI — пока что не реализовано. Скрипт закрывает узкую задачу: массово снять totalCount и топ фраз через API.
Ссылки
- Инструмент на сайте: Wordstat Parser API
- Репозиторий: github.com/google-dad/wordstat-parser-api
- Консоль Yandex Cloud
- Справка Wordstat API
- Управление API-ключами
Ключ держите вне git. На скринах статьи и репозитория секреты не показываю.
Связанное
Связанные Tools
Wordstat Parser API — Python CLI для Yandex Cloud Search API — частоты ключей и сбор «Популярных» без браузера.