Парсинг AI-выдачи: ответ Алисы, AI Overview и Copilot через API

· парсинг · AI

Над обычными десятью ссылками поисковики всё чаще показывают блок нейросети: она читает найденные страницы и пишет по ним связный ответ со ссылками на источники. У Яндекса это «Быстрый ответ Алисы AI», у Google — AI Overview, у Bing — ответ Copilot. Для SEO это новая сущность в выдаче: у неё свой набор процитированных доменов, и он не совпадает с топ-10 под ним.

Собрать её вместе с органикой можно одним параметром — ai=1. Он работает во всех трёх поисковых методах: /api/yandex, /api/google и /api/bing.

Зачем вообще парсить AI-ответ

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

Есть и четвёртый сценарий, не про SEO: AI-ответ — это уже готовая выжимка по запросу, и её удобно забирать в свои пайплайны вместо того, чтобы гонять топ-10 через собственную модель.

Один параметр на три поисковика

Формат ответа общий, поэтому код, который читает aiAnswer, писать под каждый поисковик отдельно не нужно:

https://jsonseo.ru/api/yandex?key=ВАШ_КЛЮЧ&text=чем+ipv6+отличается+от+ipv4&lr=213&ai=1
https://jsonseo.ru/api/google?key=ВАШ_КЛЮЧ&q=чем+ipv6+отличается+от+ipv4&ai=1
https://jsonseo.ru/api/bing?key=ВАШ_КЛЮЧ&q=чем+ipv6+отличается+от+ipv4&ai=1

Рядом с results появляется aiAnswer:


"aiAnswer": {
    "markdown": "IPv6 отличается от IPv4 длиной адреса: 128 бит против 32. [`1`](https://example.ru/ipv6)",
    "sources": [
        {
            "id": 1,
            "url": "https://example.ru/ipv6",
            "domain": "example.ru",
            "title": "Чем IPv6 отличается от IPv4",
            "description": "Разбираем адресацию, заголовок пакета и NAT",
            "citations": 1
        }
    ],
    "followUps": ["Почему IPv6 внедряется так медленно?"]
}

Текст приходит в markdown, а сноски в нём — обычные ссылки, подпись каждой равна id источника. Так что «процитирован ли домен» считается по sources одной строкой, без разбора текста: у процитированного источника citations больше нуля, у показанного, но не упомянутого — ноль.

Ответ приходит целиком или не приходит вовсе. Про обрыв генерации на полуслове думать не нужно: мы дожидаемся конца, а если не дождались — отвечаем ошибкой, и об этом ниже.

Блок живёт над выдачей и только на первой странице, поэтому ai=1 вместе со смещением — page или родным p, start, first — возвращает ошибку, а не пустой ответ.

Чем поисковики всё-таки различаются

Форма одна, но наполняют её по-разному — это свойство самих выдач, а не парсера:

Поле Яндекс Google Bing
Сноски внутри текста есть нет есть
citations есть нет есть
description источника есть нет нет
followUps есть нет всегда пусто

Главное расхождение — верхняя строка. У Яндекса и Bing каждое утверждение подписано источником прямо в тексте, и по ним видно, на чём именно основан абзац. Google на этом формате источники вешает общим списком под обзором, без привязки к предложениям, — поэтому у него нет ни сносок, ни счётчика цитирований. Для мониторинга «процитирован ли домен» это неважно, а вот «на каком именно утверждении» по Google не ответить.

Заголовки источников Google к тому же обрезает многоточием прямо в выдаче — полного там нет ни у кого, и достать его неоткуда.

Почему свой парсер здесь ломается чаще обычного

Общие беды парсинга (капча, выгорающие подсети, реклама вперемешку с органикой) разобраны в статье про парсер выдачи Яндекса. У AI-блока к ним добавляются свои, и у каждого поисковика они свои.

Яндекс: текста в разметке нет. В отданной странице на месте ответа обычно заглушка: генерация запускается, только когда читатель раскроет блок, и тогда страница сама начинает опрашивать отдельную ручку, пока текст не допишется. Парсер, который просто скачал HTML и поискал в нём абзацы, найдёт пустоту и решит, что ответа нет. Дождаться генерации — это около пяти секунд и девять обращений к ручке против 0.8 секунды на саму выдачу.

Яндекс: текст приходит частями. Отдельная ловушка: ручка отвечает и на середине генерации, и ответ на этот момент выглядит совершенно нормальным — просто обрывается на полуслове. Понять, что он неполный, можно только по отдельному флагу в её ответе. Парсер, который забирает первый непустой текст, будет молча собирать огрызки.

Bing: карточку показывают не всякому. Штатному клиенту парсера Copilot почти никогда не отвечает — блок приходит свежему мобильному браузеру. Поменять клиента у самой выдачи нельзя, на нём держится пагинация, поэтому ответ приходится забирать отдельным запросом с другим профилем, но с того же IP: два разных адреса на один запрос выглядят для Bing как два разных пользователя.

Google: раскладка. Обзор едет в той же странице, что и выдача, — но только если попросить её в нужном виде. В облегчённой мобильной раскладке, которую обычно и просят парсеры, блока нет вовсе.

Все трое: селекторы по классам живут до ближайшего эксперимента. Оформление карточки сидит на A/B-флагах, а часть классов носит хеш сборки. Парсер на CSS-селекторах после раскатки очередного эксперимента не падает — он тихо начинает возвращать половину ответа.

Яндекс: сноски нумерованы не так, как кажется. Готовая строка ответа ссылается на источники внутренними номерами документов, и они не совпадают с номерами самих источников. На одной живой странице по запросу про IPv6 в тексте стояли сноски 1, 2, 5, 6, 7, 8, 9, 16, а процитированы были источники 1, 2, 3, 6, 8, 9, 13, 16 — без какого-либо постоянного сдвига. Если взять эту строку как есть, каждая вторая ссылка на источник будет вести не туда.

Сколько стоит

Одинаково у всех трёх: AI-ответ считается как ещё одна страница выдачи, 0.01 ₽ сверх обычной цены запроса. Важнее другое правило — если блока в выдаче нет, надбавка не списывается. Просить его вслепую безопасно: ответ есть далеко не по каждому запросу, а навигационные, погода и курсы валют не получают его вовсе, и такие запросы обходятся в обычные 0.01 ₽ за страницу.

Запрос Есть ли AI-ответ Цена
pages=1, без ai не запрашивали 0.01 ₽
pages=1&ai=1 нет 0.01 ₽
pages=1&ai=1 есть 0.02 ₽
pages=10&ai=1 есть 0.11 ₽
pages=1&ai=1 есть, но получить не удалось 0 ₽, ошибка 503

Последняя строка — отдельное правило, и оно стоит объяснения. Если ответ у поисковика есть, а до нас он не доехал, мы не отдаём выдачу «хотя бы без него»: запрос заканчивается ошибкой, и не списывается ничего, включая страницы. Так честнее ровно из-за того, как этим параметром пользуются. За AI-ответом приходят с pages=1: нужен ответ, а страница идёт прицепом. Отдать такому запросу одну страницу — это счёт за то, чего не просили, и снаружи он неотличим от «у поисковика ответа нет».

Платить стоит не деньгами, а временем: у Яндекса и Bing ответ забирается отдельно, поэтому запрос занимает секунды вместо долей секунды. У Google обзор едет вместе с выдачей, и на время он почти не влияет. Если гоняете большое ядро, закладывайте это в таймауты и не ставьте ai=1 там, где ответ вам не нужен.

Что с этим делать на практике

Мониторинг цитируемости. Берёте те же запросы, по которым снимаете позиции, добавляете ai=1 и раз в неделю пишете в таблицу два числа: есть ли ответ по запросу и попал ли в sources ваш домен. Получается вторая кривая рядом с позициями — и она движется отдельно от них. По трём поисковикам сразу это особенно наглядно: цитируют везде разных.

Разбор конкурентов. Соберите sources по кластеру запросов и посчитайте домены. Список получится короче топ-10 и заметно устойчивее: в ответ попадают страницы, которые отвечают на вопрос текстом, а не карточками и листингами.

Расширение семантики. В followUps у Яндекса лежат уточняющие вопросы, которые он сам предлагает под ответом. Это готовые формулировки для подзаголовков и FAQ, причём взятые не из частотности, а из того, что модель считает следующим логичным шагом. Как складывать их с Вордстатом, разобрано в статье про сбор семантического ядра.

Всё это удобно делать не только скриптом: те же данные доступны модели через наш MCP-сервер, если вы работаете из Claude Code или другого клиента.

Чего ждать не стоит

AI-ответ не детерминирован. Два запроса подряд по одной и той же фразе могут дать разный текст и частично разный список источников — это свойство генерации, а не парсинга. Поэтому сравнивать имеет смысл не тексты, а факты: был ли блок, какие домены процитированы, сколько раз. По той же причине не стройте алертов на изменение формулировки — сработает каждый день.

И ещё: наличие блока меняется от региона и устройства. Замеряя цитируемость, фиксируйте регион и устройство так же строго, как при проверке позиций по регионам, иначе получите шум вместо динамики.

Частые вопросы

Как получить AI-ответ поисковика через API?

Добавьте ai=1 к обычному запросу на /api/yandex, /api/google или /api/bing. Ответ придёт полем aiAnswer рядом с органикой: текст в markdown и список источников.

Сколько стоит парсинг AI-выдачи?

0.01 ₽ — как ещё одна страница выдачи, сверх стоимости самого запроса, одинаково у всех трёх поисковиков. Если по запросу ответа нет, надбавка не списывается. Если ответ есть, но получить его не удалось, запрос заканчивается ошибкой и не списывается вовсе, включая страницы.

Что будет, если ответ не получится собрать?

Вы получите ошибку 503, а деньги за запрос не спишутся — ни за ответ, ни за страницы выдачи. Мы не отдаём выдачу вместо ответа: тот, кто ставит ai=1, приходит за ответом, а страница у него обычно идёт прицепом. Достаточно повторить запрос, а если выдачи хватает — убрать ai.

Почему по моему запросу нет AI-ответа?

Так и должно быть по многим запросам. Блок показывают в основном на информационных вопросах; навигационные («вконтакте вход»), витальные и запросы с быстрым фактическим ответом вроде погоды его не получают. Ещё блок зависит от региона и устройства, и три поисковика показывают его по разным запросам — совпадения тут скорее исключение.

Можно ли получить AI-ответ в XML?

Нет. XML-формат повторяет схему Яндекс XML, и такого блока в ней не предусмотрено. Параметр ai на XML-адресах отклоняется с ошибкой, чтобы не списывать за него деньги впустую — ответ отдаётся только в JSON.

Это тот же ответ, что видит обычный пользователь?

Да, это тот же блок из той же выдачи, с теми же источниками. Мы дожидаемся генерации ровно так же, как это делает браузер, когда читатель раскрывает блок, и отдаём текст только целиком.


Читайте дальше