Сбор семантики: мультиагентная система с Bukvarix и XMLRiver | AiManual
AiManual Logo Ai / Manual.
26 Мар 2026 Гайд

Автоматический сбор семантики: мультиагентная система с Bukvarix и XMLRiver (пакетный режим, ретраи)

Автоматизация сбора семантики: мультиагентная система с Bukvarix и XMLRiver. Пакетный режим, ретраи, многопоточность. Актуально на 2026 год.

Ручной сбор семантики умер. Давайте его похороним

Каждый раз, когда SEO-специалист открывает Excel и начинает копировать запросы из Wordstat, где-то в мире плачет один маленький DevOps. Данные устаревают быстрее, чем вы успеваете их обработать. Частотности вчерашние, конкуренты уже обновили семантику, а вы все еще бьетесь с капчей.

Проблема не в том, что сервисы плохие. Проблема в том, что вы используете их вручную. Bukvarix и XMLRiver (а на 26.03.2026 это все еще основные игроки на рынке данных по русскоязычным запросам) имеют мощные API. Но лимиты, баны, таймауты сводят на всю эффективность.

Факт: Данные Wordstat устаревают каждые 2-3 дня. Если вы собираете семантику раз в неделю, вы работаете с историческим архивом, а не с реальной картиной поиска.

Два источника — одна правда. Или нет?

Bukvarix дает частотности по Wordstat. XMLRiver — те же данные, но через свой прокси-слой. Цифры часто различаются. Иногда на 10-15%. Кому верить?

Ответ: никому. Верить нужно агрегированным данным. Наша система будет запрашивать оба источника, сравнивать показатели и вычислять медианное значение. Если один источник временно недоступен — работает второй. Это не просто резервирование, это перекрестная проверка.

  • Bukvarix API v3.1 (2026): Прямой доступ к данным Яндекса. Высокая точность, но жесткие лимиты на количество запросов в минуту.
  • XMLRiver Proxy API: Обертка над Wordstat с ротацией прокси. Меньше шансов получить бан, но данные могут быть с небольшой задержкой.

Идея в том, чтобы создать систему агентов. Один агент работает с Bukvarix, второй — с XMLRiver. Они не конкурируют, а дополняют друг друга. Как в том старом анекдоте про двух шпионов.

Пакетный режим: как съесть слона целиком

Обращаться к API для каждого ключевого слова по отдельности — это как ехать из Москвы в Питер на самокате. Можно, но зачем?

Оба сервиса поддерживают пакетную обработку. Вы отправляете массив из 100-500 запросов одним запросом. Это сокращает количество HTTP-вызовов, уменьшает нагрузку и укладывается в лимиты.

Но здесь есть подвох. Если в пакете один "битый" запрос (например, с недопустимыми символами), весь пакет может быть отклонен. Поэтому нужна предварительная очистка и валидация.

# Пример формирования пакета для Bukvarix API (актуально на март 2026)
import json

def prepare_batch(queries):
    """Очищает и группирует запросы для пакетной отправки."""
    batch = []
    for q in queries:
        # Удаляем лишние пробелы, ограничиваем длину
        clean_q = ' '.join(q.strip().split()[:7])  # Не более 7 слов
        if 3 <= len(clean_q) <= 100:  # Валидная длина
            batch.append(clean_q)
        if len(batch) >= 200:  # Не превышаем лимит сервиса
            yield batch
            batch = []
    if batch:
        yield batch

Ретраи — это не неудача, а стратегия

API может ответить ошибкой 429 (Too Many Requests), 502 (Bad Gateway) или просто замолчать. Наивный скрипт в этот момент падает и теряет все собранные данные.

Умная система должна упасть, отряхнуться и попробовать снова. Но не бесконечно. Стандартный паттерн — экспоненциальная задержка (exponential backoff).

Первый ретрай через 2 секунды, второй через 4, третий через 8. После 5 неудачных попыток запрос отправляется в очередь "неудачников" для последующего разбора. Часто помогает просто сменить IP-адрес (спасибо XMLRiver за встроенную ротацию прокси).

💡
Не используйте фиксированные задержки между ретраями. Случайная добавка (jitter) в 10-20% предотвратит синхронизацию ваших запросов с другими пользователями API и эффект "гребенки" отказов.

Многопоточность без головной боли

Пул потоков или асинхронность? Если вы не собираетесь обрабатывать миллионы запросов в день, пул потоков — простой и надежный вариант. Для Python есть concurrent.futures.ThreadPoolExecutor.

Важно ограничить количество одновременных потоков. Слишком много — и вы получите бан за DDoS-атаку. Слишком мало — и система будет работать медленнее, чем вы вручную.

Эмпирическое правило: не больше 5-10 параллельных потоков на один источник данных. И отслеживайте общую частоту запросов в минуту, чтобы не превысить квоту.

from concurrent.futures import ThreadPoolExecutor, as_completed
import requests

def fetch_batch_from_bukvarix(batch, api_key):
    # ... логика запроса к Bukvarix ...
    pass

def process_all_queries(queries, max_workers=5):
    results = {}
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        future_to_batch = {}
        for batch in prepare_batch(queries):
            future = executor.submit(fetch_batch_from_bukvarix, batch, API_KEY)
            future_to_batch[future] = batch
        
        for future in as_completed(future_to_batch):
            batch = future_to_batch[future]
            try:
                data = future.result()
                results.update(data)
            except Exception as exc:
                print(f"Батч {batch} вызвал ошибку: {exc}")
                # Отправляем в очередь на повторную обработку
                retry_queue.extend(batch)
    return results

Собираем систему по кусочкам

1 Получаем и очищаем семенное ядро

Начните не с тысячи запросов, а с 20-30 самых важных. Это ваше семенное ядро. Возьмите их из поисковых подсказок, конкурентов или, если у вас уже есть какая-то база, актуализируйте ее. Инструменты вроде File Brain могут помочь извлечь ключевые фразы из ваших документов.

2 Настраиваем агентов для Bukvarix и XMLRiver

Создайте два независимых класса или модуля. Каждый должен уметь: аутентифицироваться в API, формировать пакетные запросы, парсить ответы, обрабатывать ошибки. Храните ключи и конфигурацию в переменных окружения, а не в коде.

3 Запускаем сбор в параллельных потоках

Используйте пул потоков, как показано выше. Разделите список запросов на две части (или больше) и отправьте каждому агенту свою очередь. Собирайте результаты в общую структуру данных, защищенную от состояний гонки (используйте threading.Lock или просто слейте данные после завершения всех потоков).

4 Агрегируем и сохраняем данные

У вас есть два числа частотности для каждого запроса. Вычислите среднее или медиану. Сохраните все в JSON или базу данных (SQLite достаточно). Обязательно добавьте метку времени сбора. Эти данные потом можно будет использовать для гибридного поиска в ваших внутренних системах.

5 Настраиваем планировщик (cron)

Сбор семантики — не разовая акция. Настройте cron-задачу на ежедневный или раз в два дня запуск вашего скрипта. Но помните: если вы собираете одни и те же запросы слишком часто, сервисы могут вас заподозрить в злоупотреблении.

Где спрятаны грабли? Ошибки, которые сломают ваш пайплайн

  • Тихие ошибки парсинга: API может изменить формат ответа без изменения версии. Ваш код должен падать громко и явно при неожиданной структуре JSON, а не молча записывать нули.
  • Игнорирование заголовков Rate-Limit: Внимательно читайте заголовки ответа, такие как X-RateLimit-Remaining. Они подскажут, когда нужно притормозить.
  • Хранение сырых паролей в скриптах: Используйте .env файлы или секреты в вашем CI/CD. Никаких хардкодов.
  • Отсутствие логов: Пишите, что происходит, в файл. Сколько запросов обработано, сколько упало, сколько времени заняло. Иначе отладка превратится в гадание.

Прогноз: К концу 2026 года основные API для сбора семантики окончательно перейдут на модель, основанную на токенах и обязательной аутентификации через OAuth 2.0. Прямые ключи API уйдут в прошлое. Заранее проектируйте систему с плагинами для аутентификации.

Эта система — не просто скрипт. Это ваш личный робот-семантолог. Он работает пока вы спите, едите или читаете статьи про RAG-чатботы. Он не устает и не ошибается из-за человеческого фактора. Ему все равно, обновился ли Wordstat или нет.

Начните с малого. Автоматизируйте сбор для одного проекта. Увидите, как время на рутину сократится с часов до минут. А потом сможете масштабировать этот подход на десятки тысяч запросов. Главное — не бояться, что что-то сломается. Сломается. И это нормально. Именно для этого мы и пишем ретраи.

Подписаться на канал