Moneymaker

SEO

Wordstat без браузера: парсинг через Yandex Cloud API

28 АВГ 2026 · 8 МИН ЧТЕНИЯ

wordstatyandex-cloudpythonseosemanticsautomation

У меня значительная часть работы — семантика и работа с ключами: частоты, уточнённые формы, расширение ядра по «Популярным» в Яндекс Вордстате. Руками это неприемлимо, тем более на больших объёмах.

Раньше использовал пресет от А-парсера по пробиву вордстата, но Яндекс поменял 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). Для первого прогона семантики часто хватает без расходов «из своего кармана», пока не исчерпан баланс. Условия гранта Яндекс может менять — перед стартом сверяю в консоли биллинга.

Стартовый грант 4000 ₽ в консоли биллинга Yandex Cloud

Рис. 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:

  1. Частоты — читает input/queries.txt, пишет строки в output/wordstat_report.xlsx.
  2. Сбор фраз — топ «Популярные» (до 2000 на seed), минус-слова из input/stop_words.txt, результат в output/wordstat_words.txt.

Для частот можно выбрать типы мультивыбором:

  • b — базовая;
  • e — точная ("фраза");
  • p — уточнённая ("!слово !словo").

По умолчанию — только базовая. Это сознательно: каждый тип = отдельный запрос к API, а квота Wordstat в Search API по умолчанию около 100 запросов в час. Три типа на фразу съедают лимит втрое быстрее.

Консоль Wordstat API — выбор режима и типов частот b/e/p

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

Excel-отчёт wordstat_report.xlsx с базовыми частотами

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

Файл wordstat_words.txt после сбора популярных фраз

Рис. 3. Кусок wordstat_words.txt после сбора «Популярных»


Прогресс и квота

Успешно обработанный seed сразу пишется в output/ и удаляется из input/queries.txt. Повторный запуск продолжает с оставшихся строк; Excel и файл слов дописываются, а не перезаписываются.

При серии 429 скрипт останавливается после 10 подряд — прогресс уже сохранён, можно вернуться позже. Между запросами пауза ~0,25 с.

Практический workflow:

  1. Seed-лист → режим сбора фраз → большой wordstat_words.txt.
  2. Чищу список, кладу в queries.txt.
  3. Режим частот с --freq-types b — максимум фраз на часовую квоту.
  4. Точную/уточнённую гоняю точечно (be / bep) по отфильтрованному ядру.

Лимиты API

По умолчанию для Wordstat в Cloud Search API:

Ограничение Значение
Запросов в час 100
Запросов в секунду до 10

Один вызов topRequests = 1 единица квоты (независимо от numPhrases). В консоли «Квоты» отдельной строки Wordstat может не быть — лимит всё равно действует через HTTP 429.

Ответ поддержки Yandex Cloud — квота Wordstat 5000 запросов в час

Рис. 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. Аккаунт и биллинг

  1. Регистрация в Yandex Cloud Console.
  2. Привязка платёжного аккаунта / карты (биллинг часто обязателен даже для тестовых вызовов).

2. Каталог (folder)

  1. В консоли создаю каталог (не «ресурс»).
  2. Копирую ID из URL:
https://console.yandex.cloud/folders/b1xxxxxxxxxxxxxxxxxxxx/dashboard
                                      ↑ это folder_id

Или: страница каталога → ОбзорИдентификатор.

3. Сервисный аккаунт и роль

  1. Каталог → IAMСервисные аккаунты → создать.
  2. Назначаю роль на каталог: search-api.webSearch.user.

4. API-ключ

  1. Открываю сервисный аккаунт → API-ключиСоздать API-key.
  2. В Область действия (Scope) выбираю: yc.search-api.execute.
  3. Сохраняю секрет (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.


Ссылки

Ключ держите вне git. На скринах статьи и репозитория секреты не показываю.

Связанное

Связанные Tools

Wordstat Parser API — Python CLI для Yandex Cloud Search API — частоты ключей и сбор «Популярных» без браузера.