· SEO  · 3 мин. чтения

Автоматизация SEO с WordStat API

Как собирать семантическое ядро и анализировать тренды программно.

Как собирать семантическое ядро и анализировать тренды программно.

Ручной сбор ключевых слов из Яндекс.Вордстата — это часы копирования и вставки. API позволяет автоматизировать этот процесс и получить данные за секунды.

Задачи, которые решает API

  1. Сбор семантики — тысячи ключевых слов по seed-фразе
  2. Анализ частотности — сколько раз ищут каждую фразу
  3. Динамика запросов — как менялась популярность
  4. Региональный анализ — где больше спроса
  5. Сезонность — когда лучше продвигаться

Начало работы

Получите доступ

curl -X POST https://proxy.unoapi.ru/v1/wordstat/top \
  -H "Authorization: Bearer sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"phrase": "тест", "limit": 10}'

Python-клиент

import requests
from typing import List, Dict

class WordStatClient:
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://proxy.unoapi.ru/v1/wordstat"
    
    def _request(self, endpoint: str, data: dict) -> dict:
        response = requests.post(
            f"{self.base_url}/{endpoint}",
            headers={"Authorization": f"Bearer {self.api_key}"},
            json=data
        )
        response.raise_for_status()
        return response.json()
    
    def top(self, phrase: str, limit: int = 100) -> List[Dict]:
        """Топ связанных запросов с частотностью"""
        return self._request("top", {"phrase": phrase, "limit": limit})["topRequests"]
    
    def dynamics(self, phrase: str, period: str = "monthly") -> List[Dict]:
        """Динамика запроса по времени"""
        return self._request("dynamics", {"phrase": phrase, "period": period})["dynamics"]
    
    def regions(self, phrase: str) -> List[Dict]:
        """Распределение по регионам"""
        return self._request("regions", {"phrase": phrase})["regions"]

ws = WordStatClient("sk_xxx")

Сценарий 1: Сбор семантического ядра

def collect_semantic_core(seed_phrases: List[str], limit_per_seed: int = 100):
    """Собрать семантическое ядро по seed-фразам"""
    all_keywords = {}
    
    for seed in seed_phrases:
        keywords = ws.top(seed, limit=limit_per_seed)
        for kw in keywords:
            phrase = kw["phrase"]
            if phrase not in all_keywords:
                all_keywords[phrase] = kw["count"]
    
    # Сортируем по частотности
    sorted_kw = sorted(all_keywords.items(), key=lambda x: x[1], reverse=True)
    
    return sorted_kw

seeds = ["купить диван", "диван недорого", "угловой диван", "диван кровать"]
core = collect_semantic_core(seeds)

Сценарий 2: Анализ конкурентов

def analyze_competitor_keywords(competitor_name: str):
    """Какие запросы связаны с конкурентом"""
    
    # Брендовые запросы с частотностью
    brand_keywords = ws.top(competitor_name, limit=50)
    
    # Частотность бренда — берём из первого результата
    brand_frequency = brand_keywords[0]["count"] if brand_keywords else 0
    
    return {
        "brand": competitor_name,
        "monthly_searches": brand_frequency,
        "related_queries": brand_keywords[:10]
    }

competitors = ["skillbox", "geekbrains", "netology"]
for comp in competitors:
    analysis = analyze_competitor_keywords(comp)
    print(f"{comp}: {analysis['monthly_searches']} запросов/мес")

Сценарий 3: Поиск сезонных ниш

def find_seasonal_keywords(keywords: List[str]):
    """Найти ключевые слова с высокой сезонностью"""
    seasonal = []
    
    for kw in keywords:
        dynamics = ws.dynamics(kw, period="monthly")
        
        if len(dynamics) < 12:
            continue
        
        counts = [d["count"] for d in dynamics]
        max_count = max(counts)
        min_count = min(counts) or 1  # избегаем деления на 0
        
        seasonality_index = max_count / min_count
        
        if seasonality_index > 3:  # сильная сезонность
            peak_month = dynamics[counts.index(max_count)]["date"]
            seasonal.append({
                "keyword": kw,
                "seasonality_index": round(seasonality_index, 1),
                "peak_month": peak_month,
                "peak_searches": max_count
            })
    
    return sorted(seasonal, key=lambda x: x["seasonality_index"], reverse=True)

products = ["купить кондиционер", "купить обогреватель", "купить велосипед", "купить лыжи"]
seasonal = find_seasonal_keywords(products)

Сценарий 4: Региональный таргетинг

def find_best_regions(keyword: str):
    """Где больше всего ищут этот запрос"""
    regions = ws.regions(keyword)
    
    # Сортируем по affinity index (интерес выше среднего)
    high_interest = [r for r in regions if r["affinityIndex"] > 1.2]
    high_interest.sort(key=lambda x: x["affinityIndex"], reverse=True)
    
    return high_interest[:10]

regions = find_best_regions("купить дом за городом")

Экспорт в Excel

import pandas as pd

def export_to_excel(keywords: List[Dict], filename: str):
    """Экспорт семантического ядра в Excel"""
    df = pd.DataFrame(keywords)
    df.to_excel(filename, index=False)
    print(f"Сохранено в {filename}")

core = collect_semantic_core(["ремонт квартиры"])
export_to_excel([{"phrase": k, "count": v} for k, v in core], "semantic_core.xlsx")

Стоимость

WordStat API — один из самых доступных в UnoAPI:

ОперацияСтоимость
Частотность (1 фраза)0.1 ₽
Топ запросов (до 100)0.1 ₽
Динамика0.1 ₽
Регионы0.1 ₽

1000 ключевых слов ≈ 100 ₽

Советы

  • Кэширование: данные обновляются раз в сутки, кэш включён по умолчанию
  • Батчинг: группируйте запросы для экономии
  • Лимиты: до 60 запросов в минуту на ключ

Что дальше?

Назад в блог

Похожие статьи

Все статьи »