SEO-специалисты и маркетологи часто мониторят поисковую выдачу и популярные запросы пользователей (так называемые «ключи»). Знание и понимание трендов позволяет грамотнее выстроить свою стратегию позиционирования на рынке: точнее формулировать названия текстов, разделов, категорий товаров, их мета-тегов, внутренних заголовков и подзаголовков, продумывать общий контент-план и т.д.
Но иногда понимание основного ключевого запроса может быть неполным. В этом случае на помощь приходят связанные поисковые фразы. Их поисковик Google подсказывает сам в специальном блоке с выдачей основных результатов.
Ниже материал о том, как парсить блок Google PAA (People Also Ask), в русском звучит как «Вопросы по теме».
Что такое «Вопросы по теме» и «Другие также ищут» в Google?
Поисковик Google уже давно использует «обогащение» поисковой выдачи различными дополнительными блоками (имеется ввиду любой вспомогательный контент помимо рекламы).
В частности, к таким дополнительным блокам можно отнести:
- Краткий блок со справочной информацией (чаще всего это выжимка из Википедии, но это же могут быть данные об источнике информации, краткое определение термина, информация о компании/бренде и т.п.).
- Тематические картинки и изображения (а также ссылка на раздел с похожими медиа-материалами).
- Блок новостей по теме.
- Блок с видеороликами по тому же поисковому запросу.
- Блоки связанных категорий: похожие места, другие известные личности и прочее.
- Блоки с товарами, онлайн-карты.
- И многое-многое другое.
Но если часть дополнительных данных показываются только при вводе определённых тематических запросов, то отдельные элементы присутствуют в поисковой выдаче всегда. Речь о блоках:
People also ask (Google PAA, «Вопросы по теме»). Представляет собой «гармошку» с разворачиваемым пунктами связанных тематических запросов. Всегда показывается в верхней части поисковой выдачи (после первого ответа, в некоторых типах тематических запросов — после особых тематических блоков). Обычно пункты детализируют и лучше раскрывают тему основного поискового запроса. Это своего рода готовая структура развёрнутого ответа.
Например, при поиске в Google по запросу "proxy" может отображаться блок People Also Ask с похожими вопросами, такими как: "What is a proxy used for?", "What was a proxy?", "Is proxy the same as VPN?", и "Are proxies illegal?" Структура и количество вопросов в этом блоке могут варьироваться в зависимости от запроса, но они всегда остаются релевантными теме поиска.
People also search for (Другие также ищут). Показывается в самом конце списка с результатами органического поиска. По факту это связанные поисковые запросы. Они нацелены не на раскрытие основной темы, а на похожие (тоже связанные по теме) запросы. Вдруг вам будет полезно то, что вводят другие пользователи, которые искали тот же запрос, что и вы.
Блок поисковой выдачи Google People Also Ask впервые был представлен в 2015 году. Он обеспечивает максимально полный и комплексный ответ по исходной теме (поисковому запросу пользователя). Изучив его, вы скорее всего даже не будете переходить на сайты, представленные в результатах органической выдачи (SERP). В блоке PAA уже есть всё, что нужно.
Парсинг Google People Also Ask получается максимально информативным для:
- Задач маркетинга — чтобы понять, что конкретно имеют ввиду пользователи, когда вводят в поиске тот или иной запрос. А более глубокое понимание аудитории — это всегда весомый плюс.
- Задач контент-мейкеров — вы фактически получаете готовую структуру материала (в том виде, как её понимает или представляет сам поисковик Google).
- SEO-задач — зная виденье поисковика по связанным запросам, можно лучше оптимизировать имеющийся контент и попасть в топ выдачи с хорошо структурированным и правильно продуманным ответом. На основе анализа данных из блока можно также расширить имеющееся семантическое ядро.
Аналогичные задачи может решать и изучение блока People also search for.
Как парсить Google People Also Ask?
Ранее мы уже рассказывали о том, как парсить Google SERP. Но если в исходном материале мы задействовали API Froxy SERP Scraper (подробнее об услуге в разделе с документацией), то в этом материале рассмотрим процесс пошагового создания своего собственного парсера на Python.
Python обеспечивает максимально удобный процесс написания кода и имеет массу готовых библиотек для парсинга, в том числе синтаксический анализатор Beautiful Soup и web-драйвера Playwright, Selenium и прочие — они нужны для управления Headless-браузерами и антидетектами по API.
Немного про особенности парсинга Google People Also Ask
- Во-первых, у Google нет API для обмена данными с поисковой выдачей. Программный интерфейс у Google имеется где угодно, но только не здесь. А это значит, что автоматизировать сбор данных можно только за счёт скрапинга.
- Во-вторых, Google активно борется с автоматическим трафиком. Правда, поисковик не блокирует соединения полностью (не банит IP-адреса и не заносит их в чёрные списки), вместо этого он защищает соединения с подозрительных IP с помощью капчи. В связи с этим, если вы не хотите тратить время и силы на решение загадок, то гораздо удобнее задействовать сеть ротируемых прокси с «чистыми» IP-адресами. Желательно на базе IP домашних пользователей (резидентные прокси) или мобильных гаджетов (мобильные прокси).
- В-третьих, поисковая выдача использует динамические элементы (на Ajax или JavaScript). Чтобы обойти проблему обработки динамических сайтов, нужно использовать headless-браузеры. Они же будут полезны для управления cookies и большим числом цифровых отпечатков (хотя с этой задачей лучше справляются антидетект-браузеры).
- В-четвёртых, вёрстка поисковой выдачи Google не является статичной. Если приведённые примеры классов и атрибутов DOM-структуры изменятся, скрипт парсинга Google People Also Ask перестанет работать. Чтобы восстановить его работоспособность, нужно будет самостоятельно изучить HTML-код страницы с поисковой выдачей и заменить значения классов и атрибутов на актуальные.
Ниже мы приведём пример простейшего скрипта, который подходит для бытовых задач. Вы же можете описать более сложную логику: с выгрузкой данных в нужном вам формате, с ротацией прокси, с распараллеливанием потоков и т.п. А это уже корпоративный сегмент и другие масштабы.
Начнём с азов — с настройки окружения.
Шаг 1. Установка Python и загрузка библиотек
«Базу» мы рассматривали, и не раз. Дистрибутив Python можно скачать с официального сайта или установить через встроенный пакетный менеджер (если вы работаете в Linux).
Так как мы используем Windows, мы скачали и установили exe-пакет.
Не забудьте при установке отметить галочкой параметр для автоматического прописания Python в переменные среды Path.
Если при вызове менеджера пакетов pip вы видите ошибки об отсутствии связанного апплета, пропишите путь до него вручную. Примерно, как на скрине ниже:
В нашем случае был добавлен командлет pip и путь до исполняемого файла: «C:\Program Files\Python313\python.exe». Если вы устанавливали Python только для конкретного пользователя, то скорее всего pip будет храниться по пути «C:\Users\ЛОГИН\AppData\Local\Programs\Python\Python313\python.exe».
Обратите внимание на версию среды 313 (3.13). Если ваша версия Python выше или ниже, путь будет с другими числами.
По аналогии добавляется путь до главного исполняемого файла python.exe (ну и командлет будет называться “python”, хотя вы можете обозвать его как угодно, главное не забыть как к нему обращаться при вводе команд в консоли).
Теперь устанавливаем библиотеку Beautiful Soup. Для этого открываем консоль Windows (Powershell) и вводим команду:
pip install beautifulsoup4
Если вы не смогли добавить pip к переменным средам, то введите такую команду:
python -m pip install beautifulsoup4
В других менеджерах пакетов может быть другой синтаксис.
Дождитесь, когда скрипт закончит все операции (параллельно будут загружены и другие модули).
Если вы будете работать с поисковой выдачей напрямую, то установите также библиотеку для работы с HTTP-запросами:
pip install requests
Если предполагается использование headless-браузера или антидетекта, то библиотека requests не нужна. Но вместо неё нужно установить web-драйвер.
Например, Selenium:
pip install selenium
Для Playwright алгоритм будет немного другим. Сначала ставится библиотека, а затем устанавливаются headless-браузеры:
pip install pytest-playwright
playwright install
Если вам не нужны все браузеры сразу, то можно установить только конкретные:
playwright install chrome firefox
Ниже мы будем пользоваться драйвером nodriver, он устанавливается командой:
pip install nodriver
Когда все необходимые библиотеки установлены, можно приступать к написанию своего скрипта парсинга Google People Also Ask.
Шаг 2. Изучение структуры HTML-страницы с поисковой выдачей Google
Откройте свой любимый браузер и перейдите новую вкладку. Откройте сайт Google.com и ведите в строке поиска любую фразу.
Google отобразит результаты поиска. Найдите блок People Also Ask («Вопросы по теме»).
Теперь наведите указатель мыши на первый элемент в списке и через контекстное меню (при нажатии на правой кнопке) выберите пункт «Посмотреть код» (этот пункт актуален для браузера Chrome, в других браузерах название пункта может отличаться).
Видим нечитаемые имена классов. В каждом новом экземпляре браузера и при каждом новом запросе названия будут отличаться. У нас получилось: class="L3Ezfd".
Теперь проверим, можно ли работать напрямую с выдачей и получать её HTML-код.
Создайте отдельный каталог для своих Python-скриптов. Например: «C:\scrape-google-people-also-ask».
Внутри каталога создайте новый текстовый файл и назовите его «scrape-google-people-also-ask».
Теперь замените расширение .txt на .py. Должно получиться так: «scrape-google-people-also-ask.py».
Откройте файл в любом текстовом редакторе и наполните его содержимым:
import requests
from bs4 import BeautifulSoup
# Импортируем библиотеку BeautifulSoup и requests
# Определяем простейшую функцию для парсинга Google SERP
def get_soup_from_google_search(query):
# Чтобы запросы подставлялись в строку как положено, вместо пробела должен быть символ плюса, поэтому заменяем пробелы на плюсы
query = query.replace(' ', '+')
# URL-адрес для ввода нашего поискового запроса, сам запрос передаём через переменную
url = f"https://www.google.com/search?q={query}"
# Представляемся актуальной версией браузера Chrome (скопируйте юзер-агент из своего браузера)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36"
}
# Отправляем GET-запрос к сайту Google.com
response = requests.get(url, headers=headers)
# Если всё нормально, то сайт вернёт код 200
if response.status_code == 200:
print("Server OK, there are no errors")
# Парсим содержимое с помощью BeautifulSoup
soup = BeautifulSoup(response.content, "html.parser")
print("Starting to scrape Google People Also Ask...")
print("Query: ", query)
return soup
else:
print(f"The server returned an error: {response.status_code}")
return None
# Тут определяем свой поисковый запрос, вы можете изменить его на любой другой
query = "how to scrape google people also ask"
# Отправляем запрос на парсинг
soup = get_soup_from_google_search(query)
# Возвращаем весь HTML-код страницы, чтобы посмотреть на него...
if soup:
print("Page HTML-code:")
html_content = soup
print(html_content)
Сохраните файл и запустите его из консоли:
cd C:\scrape-google-people-also-ask
python scrape-google-people-also-ask.py
Выводимый код будет нечитаемым, он не содержит HTML-тегов (кроме HEAD и BODY), в нём только JS-скрипты. А это значит, что без headless-браузера не обойтись.
Резидентные прокси
Лучшие прокси-серверы для доступа к ценным данным со всего мира.
Шаг 3. Простейший скрипт парсинга Google People Also Ask
Мы использовали web-драйвер nodriver. Но вы можете задействовать любой другой, в том числе оригинальный API для браузеров Chrome — протокол CDP (Chrome Devtool Protocol).
Вот так выглядит наш скрипт для сбора данных из блока Google People Also Ask:
# Импортируем библиотеки
import asyncio
import nodriver as hdlschrome
from bs4 import BeautifulSoup
import json
import re
# Создаём асинхронную функцию и передаём ей в обработку переменную с нашим поисковым запросом
async def scrape_google_people_also_ask(search_query):
try:
# Выводим в консоли лог о том, что запустили процесс парсинга
print(f"Search query: {search_query}")
# Заменяем в запросе пробелы на плюсы, того требует синтаксис URL поисковой системы Google
search_query_plus = search_query.replace(' ', '+')
# Запускаем экземпляр браузера - явно (без скрытия), то есть отключаем ему флаг Headless
browser = await hdlschrome.start(headless=False)
print("Starting browser")
# Передаём браузеру URL, который нужно открыть
page = await browser.get(f"https://www.google.com/search?q={search_query_plus}")
print("Open Search Page")
# Просим браузер выждать 5 секунд, при желании значение можно увеличить или уменьшить. Большой таймаут может быть оправдан для самых медленных подключений.
await asyncio.sleep(5)
print("Wait 5 sec...")
# Тут мы передаём результирующий HTML-код в переменную html_content, чтобы потом его распарсить
html_content = await page.evaluate('document.documentElement.outerHTML')
print(f"HTML-content extracted: {len(html_content)} symbols")
# Передаём HTML-код на обработку в библиотеку анализатора BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')
# Ищем блок с Google People Also Ask
# Для этого находим блок, у которого есть характерное название...
# И от него переходим ввверх по структуре, чтобы найти родительский DIV
# Через вертикальную черту можно перечислить альтернативные названия блока - для разных языков и регионов
print("BeautifulSoup parse block Google People Also Ask")
paa_main = soup.find(string=re.compile('People also ask|Вопросы по теме')).find_parent().find_parent().find_parent().find_parent().find_parent().find_parent()
# Наполняем структуру массива
paa_info = {
# Выводим только содержимое, без HTML-тегов
'Content': paa_main.get_text(),
}
print("Information retrieved successfully")
# Возвращаем данные
return paa_info
# Обрабатываем исключения и ошибки
except Exception as err:
print(f"An error occurred while parsing: {str(err)}")
return None
# Чтобы освободить ресурсы, останавливаем браузер
finally:
if 'browser' in locals():
browser.stop()
print("Closing the browser")
async def main():
# Вот тут вы можете переопределить поисковый запрос
search_query = "What is the color of night"
# Заменяем в запросе пробелы на символы подчёркивания, чтобы правильнее сохранялись названия файлов
search_query_minus = search_query.replace(' ', '_')
# Создаём асинхронный процесс и передаём функции парсинга переменную с запросом
paa_info = await scrape_google_people_also_ask(search_query)
# Если данные непустые, выводим в консоли результат парсинга
if paa_info:
print("\nPeople Also Ask:")
# Перебираем массив по ключам, на всякий случай заменяем символы подчёркивания на пробелы, чтобы смотрелось классно
for key, value in paa_info.items():
print(f"{key.replace('_', ' ').title()}: {value}")
# Сохраняем данные в JSON файл
with open(f"{search_query_minus}_query.json", 'w', encoding='utf-8') as f:
json.dump(paa_info, f, ensure_ascii=False, indent=4)
print(f"Information saved to file {search_query_minus}_query.json")
else:
print("Unable to parse information from Google People Also Ask.")
if __name__ == "__main__":
hdlschrome.loop().run_until_complete(main())
Это готовая реализация, поэтому читайте комментарии в коде и дорабатывайте скрипт под свои нужды.
Найденные данные для удобства сохраняются в папке со скриптом в виде JSON-файла (он будет иметь в названии ваш поисковый запрос).
Основная сложность парсинга Google People Also Ask — это перемещение по дереву HTML-элементов. Плюс Google активно защищается и показывает капчу. В связи с этим мы не рекомендуем использовать скрытый режим (он намеренно выключен в параметрах запуска браузера).
Тот же Selenium Google обнаруживает безошибочно и всегда выдаёт капчу. Скрипт парсинга отработает только тогда, когда вы вручную решите задачи (если они есть).
Обратите внимание! В странах ЕС Google дополнительно показывает окно согласия с обработкой cookies (в соответствии с политикой GDPR).
Так как Google определяет язык и другие региональные настройки на основе расположения, фраза «People also ask» может писаться по-разному. Сначала проверьте вывод вашего headless-браузера и актуализируйте перевод (он является опорной точкой для поиска нужных элементов). Мы указали фразу на двух языках.
Шаг 4. Подключение парсера через ротируемые прокси
Чтобы не решать каждый раз капчу, логично организовать подключение парсера через прокси.
Если вам нужно ротировать прокси на уровне новых вкладок, то необходимо использовать специальные дополнения от сторонних разработчиков, такие как NodriverProxy, по крайней мере для nodriver (это библиотека, которую мы использовали в примере с кодом).
Nodriver в чистом виде не умеет работать через прокси, поэтому либо нужно прописывать их на уровне браузера (по протоколу CDP), либо использовать другую библиотеку с веб-драйвером.
Например, в Selenium прокси могут подключаться на уровне параметров запуска экземпляра headless-браузера:
# Тут импортируются библиотеки, в том числе модуль Options
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
# тут вы можете указать свои реальные параметры подключения к прокси, замените то, что указано КАПСЛОКОМ
proxy_host = "PROXY_ADRESS"
proxy_port = " PROXY_PORT"
proxy_user = "YOUR_SERNAME"
proxy_pass = " YOUR_PASSWORD"
# Тут можно указать и другие опции и флаги запуска браузера…
options = Options()
proxy_server_url = f"https://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"
options.add_argument(f'--proxy-server={proxy_server_url}')
# Далее запускается браузер на основе указанных опций
driver = webdriver.Chrome(
service=ChromeService(ChromeDriverManager().install()),
options=options
)
# Далее логика вашего парсера
…
Заключение и рекомендации
Парсинг выдачи Google заметно усложнился, так как компания отошла от статичных HTML-страниц (теперь это сплошной JavaScript-код) и намеренно внедрила уникальные идентификаторы для CSS-классов и других атрибутов.
Чтобы справиться с новой разметкой придётся сильно попотеть. Но и этого мало. Поисковик активно защищает страницы капчей. Чтобы обойти блокировки со стороны Google, потребуются ротируемые прокси и специальные дополнения, способные скрыть факт использования headless-браузера.
Найти качественные резидентные и мобильные прокси можно у Froxy. Для удобного тестирования есть недорогой триал-пакет, прокси к скраперу подключаются всего один раз, дальнейшие действия по ротации настраиваются в личном кабинете.
Плюс у нас есть готовый SERP скрапер. Для него не нужно писать никаких скриптов, данные скачиваются в табличном виде или в формате JSON.