Google AI Mode изменил то, как выглядит результат поиска. Вместо десяти синих ссылок поверхность с AI-ответом возвращает текстовый ответ на запрос с набором цитируемых источников под ним и более широкой полосой связанных ссылок сбоку. Для тех, кто отслеживает, что Google говорит по определённой теме, это новый и ценный набор данных: не просто то, кто ранжируется, но и сам ответ, привязанный к запросу, и страницы, которые Google выбрал для его подтверждения.
В этом руководстве показано, как надёжно парсить Google AI Mode. Вы создадите небольшой работающий скрипт на Python, который получает публичный результат AI Mode через Crawling API, рендерящий насыщенную JavaScript страницу за надёжным IP, затем извлекает AI-ответ, его источники и связанные ссылки в виде структурированного JSON. Получение данных и ротация IP обрабатываются за вас, поэтому вы тратите время на данные, а не на поддержку headless-браузера и пула прокси.
Что такое Google AI Mode и зачем его парсить
AI Mode, это слой генеративных ответов внутри Google Search. Вы попадаете в него, добавив параметр udm=50 к обычному URL поиска, что говорит Google вернуть AI-написанный ответ вместо классической страницы результатов. Ответ состоит из трёх частей, важных для парсинга: сам текст ответа, источники, которые Google прикрепляет к ответу, и более широкий набор ссылок по теме запроса.
Именно эта структура делает её ценной для сбора. Можно отслеживать, как ответ Google на запрос меняется со временем, видеть, какие домены он цитирует и как часто, и применять это в SEO-исследованиях или контентных процессах. Это та же категория задач, что и создание любого инструмента для данных поисковых систем, только полезной нагрузкой является ответ плюс его источники, а не ранжированный список.
Параметр udm выбирает вертикаль поиска Google. udm=50, это значение, активирующее AI Mode, так же как другие значения переключают на изображения или новости. Добавьте его к стандартному URL google.com/search вместе с запросом и регионом, и Google вернёт поверхность AI-ответа для этого запроса.
Что вы создадите
Короткий скрипт на Python, который принимает поисковый запрос, строит URL AI Mode, отправляет его через Crawling API с включённым JavaScript-рендерингом и разбирает отрендеренный результат в JSON-объект с тремя полями: текстом ответа, списком источников и списком связанных ссылок. Каждый фрагмент кода работает сразу после подстановки токена, и тот же код работает как при одном запросе, так и при цикле по сотням.
Почему обычный запрос здесь не работает
Если запросить URL AI Mode обычным HTTP-клиентом, вы получите ответ со статусом 200 и ни слова из ответа в теле. Два фактора работают против вас. Во-первых, AI Mode рендерится в браузере: ответ и его источники поступают после выполнения JavaScript страницы, поэтому исходный HTML является пустой оболочкой. Во-вторых, Google быстро блокирует автоматический трафик. IP датацентров и паттерны запросов, не характерные для реального посетителя, получают CAPTCHA или блокировку ещё до получения отрендеренного ответа.
Поэтому работающий парсер AI Mode требует двух вещей в одном запросе: браузера, который реально рендерит страницу, и IP-адреса, который Google воспринимает как реального пользователя. Можно собрать это самостоятельно, используя headless-браузер и пул ротируемых резидентских прокси, но поддерживать всё это в рабочем состоянии и есть основная часть работы. Crawling API объединяет оба требования в одном вызове: отправьте URL с JavaScript-токеном, API рендерит страницу за надёжным IP и возвращает готовый HTML для разбора.
Crawlbase предлагает два типа токенов. Обычный токен получает статический HTML; JavaScript (JS) токен сначала рендерит страницу в реальном браузере. AI Mode рендерится на стороне клиента, поэтому здесь нужен JS-токен. Использование обычного токена возвращает ту же пустую оболочку, что и обычный запрос, и извлекать из неё нечего.
Шаг 1: построение URL AI Mode
Точка входа конвейера, функция, превращающая запрос в корректный URL AI Mode. Устанавливается udm=50 для выбора AI Mode, запрос передаётся в q, а gl и hl добавляются для управления страной и языком, чтобы результаты оставались стабильными от запуска к запуску.
from urllib.parse import urlencode, quote_plus def build_ai_mode_url(query, gl="us", hl="en"): if not query or not query.strip(): raise ValueError("query must be non-empty") params = { "udm": "50", "q": query.strip(), "gl": gl, "hl": hl, } query_string = urlencode(params, quote_via=quote_plus) return f"https://www.google.com/search?{query_string}" print(build_ai_mode_url("best ai tools for developers"))
Передайте запрос и получите стабильный URL AI Mode. Отсюда весь остальной процесс представляет собой одну прямую линию: отправьте URL через Crawling API, затем нормализуйте отрендеренный результат в структурированные поля, которые ваша система сможет использовать.
Шаг 2: получение отрендеренной страницы через Crawling API
Имея URL, получите отрендеренную страницу. Передаются два важных для AI-поверхности параметра: ajax_wait указывает API ждать завершения загрузки асинхронного контента, а page_wait выдерживает фиксированное количество миллисекунд после загрузки, чтобы потоковый ответ и источники успели появиться до захвата страницы. Пять секунд, разумная отправная точка; увеличьте, если ответ возвращается скудным.
from crawlbase import CrawlingAPI api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"}) def fetch_html(target_url): options = {"ajax_wait": "true", "page_wait": 5000} response = api.get(target_url, options) return response["body"].decode("utf-8") url = build_ai_mode_url("best ai tools for developers") html = fetch_html(url) print(html[:500])
Запустите этот код и вы должны увидеть реальную разметку с блоком AI-ответа, а не пустую оболочку, которую возвращает обычный запрос. Это подтверждает работу рендеринга перед написанием первого селектора. Вам больше не нужно иметь дело с состоянием браузера или антибот-проверками; у вас есть готовый HTML для парсера.
AI Mode требует отрендеренную страницу за надёжным IP в одном вызове. Crawling API принимает JS-токен, запускает страницу в реальном браузере, ротирует резидентские IP на стороне сервера и возвращает готовый HTML, избавляя вас от необходимости управлять парком headless-браузеров и пулом прокси. Начните с публичного запроса на бесплатном тарифе.
Шаг 3: извлечение ответа, источников и ссылок
Имея отрендеренный HTML, загрузите его в парсер и извлеките три важных поля. Используйте BeautifulSoup для считывания текста ответа, затем обходите блоки источников и ссылок для сбора их URL и заголовков. Разметка AI Mode не является публичным контрактом, поэтому считайте приведённые ниже селекторы начальным шаблоном: проверьте живую страницу AI Mode в инструментах разработчика браузера и подтвердите их соответствие текущей структуре.
from bs4 import BeautifulSoup def extract_ai_mode(html): soup = BeautifulSoup(html, "html.parser") answer_block = soup.select_one('div[data-rl="ai-mode"], div.ai-response') response_text = answer_block.get_text(" ", strip=True) if answer_block else "" citations = [] for cite in soup.select('a.ai-citation, div.citation a[href]'): href = cite.get("href", "") if href.startswith("http"): citations.append({ "url": href, "title": cite.get_text(strip=True), }) links = [] for link in soup.select('div.related-links a[href^="http"]'): links.append({ "url": link["href"], "title": link.get_text(strip=True), }) return { "response_text": response_text, "citations": citations, "links": links, }
Каждое поле напрямую соответствует тому, как AI Mode представляет ответ. response_text, сгенерированный ответ, который можно хранить, сравнивать или отображать. citations, источники, которые Google прикрепил для подтверждения ответа, каждый с URL и заголовком. links, более широкий набор связанных результатов по запросу. Намеренно небольшая схема охватывает большинство дашбордов и конвейеров без привязки к разметке, которая меняется.
Google не публикует стабильные имена классов для AI Mode, и разметка меняется без предупреждения. Когда извлечение начинает возвращать пустые строки, проверьте живую страницу AI Mode и обновите селекторы. Это нормальное обслуживание для любого производственного парсера. Хранение короткого образца сырого HTML рядом с выводом позволяет легко понять, является ли проблема вашим парсером или изменением на стороне источника.
Шаг 4: соединяем всё вместе и сохраняем результат
Теперь объедините три шага в один работающий скрипт. Он строит URL, получает отрендеренную страницу, извлекает поля и записывает структурированный результат в JSON-файл для проверки или дальнейшей загрузки.
import json from urllib.parse import urlencode, quote_plus from crawlbase import CrawlingAPI from bs4 import BeautifulSoup api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"}) def build_ai_mode_url(query, gl="us", hl="en"): params = {"udm": "50", "q": query.strip(), "gl": gl, "hl": hl} return f"https://www.google.com/search?{urlencode(params, quote_via=quote_plus)}" def fetch_html(target_url): options = {"ajax_wait": "true", "page_wait": 5000} response = api.get(target_url, options) return response["body"].decode("utf-8") def extract_ai_mode(html): soup = BeautifulSoup(html, "html.parser") answer_block = soup.select_one('div[data-rl="ai-mode"], div.ai-response') response_text = answer_block.get_text(" ", strip=True) if answer_block else "" citations = [ {"url": c["href"], "title": c.get_text(strip=True)} for c in soup.select('a.ai-citation, div.citation a[href^="http"]') ] links = [ {"url": l["href"], "title": l.get_text(strip=True)} for l in soup.select('div.related-links a[href^="http"]') ] return {"response_text": response_text, "citations": citations, "links": links} def scrape_ai_mode(query, gl="us", hl="en"): url = build_ai_mode_url(query, gl, hl) html = fetch_html(url) data = extract_ai_mode(html) data["query"] = query return data if __name__ == "__main__": result = scrape_ai_mode("best ai tools for developers") with open("ai_mode.json", "w") as f: json.dump(result, f, indent=2) print(json.dumps(result, indent=2))
Запустите командой python scraper.py, и структурированный ответ будет записан в ai_mode.json и выведен в консоль. Функция scrape_ai_mode также является единственным местом для импорта, если вы хотите встроить это в собственное приложение: вызовите с запросом и получите тот же структурированный словарь обратно без дополнительного разбора.
Как выглядит результат
Результат, это единственный объект с текстом ответа и двумя списками. Сокращённый пример:
{ "query": "best ai tools for developers", "response_text": "Popular AI tools for developers include code assistants, ...", "citations": [ { "url": "https://example.com/ai-dev-tools", "title": "10 AI Tools for Developers" }, { "url": "https://example.org/coding-assistants", "title": "Best Coding Assistants" } ], "links": [ { "url": "https://example.net/dev-productivity", "title": "Developer Productivity Guide" } ] }
Такая структура достаточна для отслеживания ответа во времени, подсчёта доменов, которые Google цитирует чаще всего, или сравнения ответов по регионам посредством изменения gl и hl. Сохраняйте текст ответа вместе с временной меткой и получите простую историю изменений ответа Google на запрос.
Масштабирование на множество запросов
Один запрос, это демонстрация; реальная задача выполняется по списку. Структура остаётся той же: перебираете запросы, парсите каждый и собираете строки. При масштабировании главное, оставаться незаблокированным, поскольку Google отслеживает трафик, характерный для парсеров. Crawling API ротирует IP за вас при каждом вызове, поэтому приведённый ниже цикл не требует управления прокси.
queries = [ "best ai tools for developers", "how does web scraping work", "python vs javascript for automation", ] results = [] for q in queries: try: results.append(scrape_ai_mode(q)) except Exception as err: print(f"Skipped {q}: {err}") with open("ai_mode_batch.json", "w") as f: json.dump(results, f, indent=2)
Если вы предпочитаете маршрутизировать собственный трафик через ротируемый пул вместо полного использования Crawling API, Smart AI Proxy (также называемый AI Proxy) предоставляет ту же ротацию резидентских IP как сквозной прокси-эндпоинт. Общую стратегию обеспечения работоспособности при парсинге Google см. в статьях о том, как ротировать прокси при парсинге результатов поиска Google и как парсить сайты без блокировок.
Типичные проблемы и их решения
Парсинг поверхности Google, это не задача, которую можно настроить раз и забыть. Полезные данные меняются, и ваш парсер должен иметь запас гибкости. Наиболее распространённые проблемы просты:
-
Пустой текст ответа. Если
response_textвозвращается пустым, страница, вероятно, не завершила рендеринг. Увеличьтеpage_wait, убедитесь, что используете JS-токен, и проверьте селектор блока ответа на живой странице. - Ошибки аутентификации или кредита. Запрос, не прошедший рендеринг, обычно означает неверный токен или пустой баланс. Проверьте корректность JS-токена и наличие кредитов на аккаунте, и изучите поведение API при проверках трафика Google.
- Отсутствующие источники или ссылки. Google перемещает эти блоки. Когда они перестают совпадать, обновите селекторы источников и ссылок и храните образец сырого HTML, чтобы видеть, что именно изменилось.
Когда результаты внезапно падают или выглядят иначе, сравните недавний образец сырого HTML со старым. Это обычно сразу показывает, в чём проблема: в логике разбора или в изменениях на стороне отрендеренной страницы.
Законно ли парсить Google AI Mode?
Допустимость парсинга Google AI Mode зависит от условий использования Google, вашей юрисдикции и того, что вы делаете с данными. Условия Google ограничивают автоматический доступ к его сервисам, поэтому парсинг может нарушать их независимо от тщательности вашего инструментария. Код в этом руководстве этого не меняет; он лишь делает техническую часть рабочей. Прочитайте Условия использования Google и его robots.txt перед направлением трафика в производственном объёме и действуйте соответственно.
Несколько правил, которых стоит придерживаться. Собирайте только публичные результаты AI Mode, ответ и источники, которые любой может видеть без авторизации. Поддерживайте частоту запросов достаточно низкой, чтобы не нагружать системы Google, и соблюдайте ожидания скорости, сигнализируемые его robots.txt. Никогда не собирайте персональные или частные данные и не пытайтесь получить доступ к чему-либо за авторизацией. Если вы планируете коммерческое использование данных, получите разрешение или официальное соглашение о данных, а не считайте молчание согласием.
Данное руководство намеренно ограничено публичными результатами AI Mode, поскольку это граница, делающая работу обоснованной. Оно не охватывает данные за авторизацией или частные данные, информацию аккаунта или профиля, или попытки обхода аутентификации. Если вашему проекту нужно больше, чем публичная поверхность ответов, правильный шаг, официальное соглашение о данных Google, а не более изощрённый парсер.
Ключевые выводы
-
AI Mode, новый набор данных. URL с
udm=50возвращает AI-ответ плюс источники и связанные ссылки, а не ранжированный список, что позволяет собирать ответы, привязанные к запросам. - Обычный запрос возвращает пустую оболочку. AI Mode рендерится на стороне клиента, и Google блокирует ботов, поэтому необходим рендеринг страницы за надёжным IP перед разбором.
-
Один вызов обрабатывает оба требования. Crawling API с JS-токеном рендерит страницу и ротирует IP на стороне сервера;
ajax_waitиpage_waitуправляют временем ожидания ответа. -
Трёх полей достаточно. Нормализуйте результат в
response_text,citationsиlinks, и храните образец сырого HTML, чтобы отличить проблемы парсера от изменений на стороне источника. -
Оставайтесь в рамках публичных данных. Соблюдайте ToS и
robots.txtGoogle; никаких данных за авторизацией, личных данных или обхода аутентификации.
Часто задаваемые вопросы
Что такое udm=50 в URL поиска Google?
udm=50, это параметр поиска, активирующий Google AI Mode. Значение udm выбирает вертикаль поиска, и 50, это то, которое возвращает поверхность AI-ответа вместо классического списка ссылок. Добавьте его к стандартному URL google.com/search вместе с запросом, страной и языком, и Google вернёт результат AI Mode для этого запроса.
Почему обычный запрос не возвращает ответа из Google AI Mode?
Потому что AI Mode рендерится на стороне клиента. Ответ и источники поступают после выполнения JavaScript страницы, поэтому сырой HTTP-запрос возвращает статус 200 с пустой оболочкой. Google также быстро блокирует автоматический трафик. Чтобы получить реальный ответ, необходим рендеринг страницы за надёжным IP, этим занимается JS-токен Crawling API.
Нужен обычный токен или JS-токен?
JS-токен. Обычный токен получает статический HTML, который для AI Mode является той же пустой оболочкой, что и обычный запрос. JS-токен сначала рендерит страницу в реальном браузере, так что ответ, источники и ссылки присутствуют при считывании парсером.
Какие данные можно извлечь из результата Google AI Mode?
Три стабильных поля покрывают большинство потребностей: сгенерированный текст ответа, источники, которые Google прикрепил к ответу (каждый с URL и заголовком), и более широкий набор связанных ссылок по запросу. Небольшая схема делает конвейер устойчивым, поскольку вы не привязаны к разметке, которую Google меняет без предупреждения.
Мои селекторы возвращают пустые строки. Что изменилось?
Почти наверняка разметка Google. У AI Mode нет опубликованных стабильных имён классов, поэтому работавшие ранее селекторы могут перестать работать. Проверьте живую страницу AI Mode в инструментах разработчика браузера и обновите селекторы ответа, источников и ссылок. Хранение короткого образца сырого HTML рядом с выводом позволяет легко видеть, что изменилось.
Законно ли парсить Google AI Mode?
Это зависит от условий использования Google, вашей юрисдикции и вашей цели, а условия Google ограничивают автоматический доступ. Строго ограничивайтесь публичными результатами AI Mode, соблюдайте robots.txt и ожидания скорости, никогда не трогайте контент за авторизацией, личные данные или аутентификацию. Для коммерческого использования получите разрешение или официальное соглашение о данных, а не полагайтесь на парсер.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.

