Сбор данных из поисковой выдачи (SERP) – одна из ключевых задач SEO‑аналитика, маркетолога и владельца сайта. Часто платные сервисы (SE Ranking, Ahrefs, SerpApi и др.) позволяют получить готовые отчёты, но они могут быть дорогими, а иногда достаточно собрать небольшую выборку самостоятельно. В этой статье мы разберём, как собрать данные о выдаче Google и Яндекса без привлечения платных сервисов, используя только бесплатные инструменты и открытый код.
Содержание
- Зачем нужен сбор SERP‑данных?
- Юридические и технические ограничения
- Бесплатные способы получения данных из Google
- Бесплатные способы получения данных из Яндекса
- Инструменты и готовые скрипты
- Пошаговый пример: Python‑скрипт для Google
- Экспорт и дальнейший анализ
- Лучшие практики и типичные ошибки
Зачем нужен сбор SERP‑данных?
Анализ позиции сайта в поиске позволяет оценить эффективность SEO‑кампаний, понять, какие запросы приносят трафик, и сравнить себя с конкурентами. Кроме того, данные SERP помогают:
- Отслеживать появление новых расширенных сниппетов (карточки, быстрые ответы, блоки «Похожие запросы»).
- Проводить конкурентный анализ – увидеть, какие страницы занимают топ‑10 у соперников.
- Определять тренды в поиске (смена запросов, появление новых функций).
- Автоматизировать отчётность для клиентов и руководства.
Юридические и технические ограничения
Прежде чем начинать парсинг, следует помнить о нескольких важных моментах:
- Robots.txt – указывает, какие части сайта разрешено сканировать автоматическими средствами. Нарушение может привести к блокировке IP.
- Большинство поисковиков (Google, Яндекс) активно борются с автоматическим скрейпингом: CAPTCHA, ограничение количества запросов, временные блокировки.
- Использование API (Custom Search API, Yandex XML) – легальный способ получения данных, но часто имеет бесплатный лимит (например, 100 запросов в день).
- Соблюдайте политику использования сервисов, чтобы не нарушать условия предоставления услуг.
Бесплатные способы получения данных из Google
Google Custom Search JSON API
Google предоставляет Custom Search API с бесплатным лимитом 100 запросов в сутки. Для его использования необходимо:
- Создать проект в Google Cloud Console.
- Включить «Custom Search API» и получить API‑ключ.
- Создать поисковый движок (CSE) и указать
searchengineid. - Отправлять GET‑запросы вида
https://www.googleapis.com/customsearch/v1?key=API_KEY&cx=SEARCH_ENGINE_ID&q=ключевое+слово.
Ответ приходит в формате JSON, где доступны URL страниц, позиция, сниппет и тип результатов (органический, рекламный, картинка).
Scraping через requests + BeautifulSoup
Для небольших выборок можно «обмануть» Google, используя:
- Случайные User‑Agent строки.
- Прокси‑серверы (могут быть бесплатными, но менее надёжными).
- Паузы между запросами (от 2 до 10 секунд).
<div class="g">
<div class="rc">
<h3 class="LC20lb">Заголовок страницы</h3>
<a href="https://example.com">https://example.com</a>
<span class="st">Сниппет текста</span>
</div>
</div>
С помощью BeautifulSoup можно извлечь нужные элементы и сформировать CSV‑файл.
Google Sheets + IMPORTXML
Если не хочется писать код, можно воспользоваться функцией IMPORTXML в Google Таблицах:
=IMPORTXML("https://www.google.com/search?q=ключевое+слово", "//div[@class='g']//h3")
Однако Google часто меняет структуру страниц, поэтому формула может «сломаться».
Бесплатные онлайн‑инструменты
Существуют сервисы с ограниченным бесплатным доступом (например, SerpApi – 100 запросов в месяц бесплатно). Их удобно использовать для тестов и небольших проектов.
Бесплатные способы получения данных из Яндекса
Yandex XML API
Яндекс предоставляет XML API с бесплатным лимитом 1 000 запросов в сутки. Требуется:
- Зарегистрировать приложение в Yandex.Webmaster и получить user‑key.
- Сформировать запрос:
https://yandex.com/search/xml?user=USER_KEY&key=API_KEY&query=ключевое+слово&lr=213(lr– код региона). - Ответ приходит в XML, из которого легко вытаскивать URL, позицию, текст сниппета.
Scraping через Selenium
Если нужен доступ к мобильной выдаче или к «жёстким» блокировкам, используйте Selenium с драйвером Chrome/Firefox. Примерный алгоритм:
- Запуск браузера в headless‑режиме.
- Установка случайного user‑agent и cookies (можно предварительно зайти в Яндекс и сохранить их).
- Ожидание загрузки элементов с помощью
WebDriverWait.
Google Sheets + IMPORTXML для Яндекса
Аналогично Google, в таблицах можно попытаться импортировать данные из https://yandex.ru/search/?text=ключевое+слово, но Яндекс чаще блокирует запросы из Google Таблиц.
Бесплатные CLI‑утилиты
Существует несколько открытых проектов, которые позволяют получать SERP‑данные через командную строку:
- Google Search Scraper (GitHub) – Python‑скрипт с поддержкой прокси.
- Yandex Search Parser (GitHub) – парсер, возвращающий JSON.
Инструменты и готовые скрипты
Ниже перечислены самые популярные бесплатные решения, которые можно сразу использовать или модифицировать под свои нужды.
| Инструмент | Поддерживаемые поисковики | Язык/платформа | Бесплатный лимит | Ссылка |
|---|---|---|---|---|
| Google Custom Search API | REST/JSON | 100 запросов/день | docs | |
| Yandex XML API | Yandex | REST/XML | 1 000 запросов/сутки | docs |
| SerpApi (Free tier) | Google, Yandex, Bing | REST/JSON | 100 запросов/мес. | serpapi.com |
| Selenium + ChromeDriver | Оба | Python/JS/Java | — (зависит от вашего IP) | selenium.dev |
| requests + BeautifulSoup | Оба | Python | — (зависит от вашего IP) | bs4 |
Пошаговый пример: Python‑скрипт для сбора Google SERP
Требования
- Python ≥ 3.7
- Библиотеки:
requests,beautifulsoup4,csv
Код скрипта
#!/usr/bin/env python3
import requests, random, time, csv
from bs4 import BeautifulSoup
USER_AGENTS = [ "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Safari/605.1.15",]
HEADERS = {"Accept-Language": "ru-RU,ru;q=0.9"}
"""Получаем HTML страницы Google Search."""
params = {
"q": query,
"hl": "ru",
"start": start, # 0, 10, 20 … – пагинация
"num": "10"
}
headers = HEADERS.copy
headers["User-Agent"] = random.choice(USER_AGENTS)
response = requests.get("https://www.google.com/search", params=params, headers=headers, timeout=10)
response.raise_for_status
return response.text
"""Извлекаем URL, заголовок и сниппет из HTML.""" results = []
for idx, block in enumerate(soup.select('div.g'), start=1):
title_tag = block.select_one('h3')
if not title_tag:
continue
link_tag = block.find_parent('a')
url = link_tag['href'] if link_tag else ''
snippet = block.select_one('span.st')
snippet_text = snippet.get_text(separator=" ") if snippet else ''
results.append({
"position": idx,
"title": title_tag.get_text,
"url": url,
"snippet": snippet_text
})
return results
def save_to_csv(data, filename="google_serp.csv"):
with open(filename, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["position", "title", "url", "snippet"])
writer.writeheader
for row in data:
writer.writerow(row)
def main:
queries = [
"купить ноутбук",
"как вырастить помидоры"
]
all_results = []
for q in queries:
print(f"Обрабатываем запрос: {q}") results = parse_results(html)
for r in results:
r["query"] = q
all_results.extend(results)
time.sleep(random.uniform(2, 5)) # пауза, чтобы не спровоцировать блокировку
save_to_csv(all_results)
print("Готово! Данные сохранены в google_serp.csv")
if __name__ == "__main__":
main
Как работает скрипт
- Формирует запрос к
https://www.google.com/searchс нужными параметрами (q,hl=ru,start). - Меняет User‑Agent на случайный, чтобы имитировать обычный браузер.
- Сохраняет все результаты в CSV‑файл, пригодный для дальнейшего анализа в Excel, Google Sheets и т.д.
Экспорт и дальнейший анализ
После получения CSV‑файла вы можете:
- Импортировать данные в Google Data Studio или Power BI для визуализации.
- Сопоставить позиции с Google Analytics (источник/медиа) и понять, какие запросы приносят реальный трафик.
- Сравнить результаты с Google Search Console (показывает реальные клики/импрессии).
- Создать отчёт в Excel с условным форматированием: зелёный – топ‑3, жёлтый – топ‑10, красный – ниже 30.
Лучшие практики и типичные ошибки
Лучшие практики
- Уважайте лимиты. Если используете официальные API, не превышайте бесплатные квоты – иначе ваш ключ будет заблокирован.
- Ротация IP. При парсинге без API используйте прокси‑пулы (например, free-proxy-list) и меняйте IP каждые 50‑100 запросов.
- Случайные задержки. Добавляйте
time.sleep(random.uniform(2, 7))между запросами. - Логируйте ошибки. Записывайте коды ответов (429 – Too Many Requests, 503 – Service Unavailable) и реагируйте соответственно.
Типичные ошибки
- Попытка собрать > 500 запросов в день без прокси – почти наверняка закончится блокировкой.
- Парсинг «lite‑версии» Яндекса без учёта регионального параметра
lr– получите результаты из Москвы вместо нужного города. - Игнорирование CAPTCHA. При появлении формы ввода капчи скрипт должен приостановиться и запросить ручное решение.
- Неправильный CSS‑селектор – Google часто меняет структуру, поэтому парсер перестаёт работать. Регулярно проверяйте актуальность селекторов.
Сбор данных о поисковой выдаче без платных сервисов полностью реализуем с помощью бесплатных API (Google Custom Search, Yandex XML) и открытых инструментов (Python, Selenium, импорт в Google Sheets). Главное – соблюдать правила использования, не перегружать сервера поисковиков и правильно обрабатывать полученные данные.
Если вам требуется лишь небольшая выборка (до 100 запросов в день) – Google Custom Search API и Yandex XML API станут отличным решением. Для более масштабных задач используйте скрипты с ротацией прокси и тайм‑аутами, а полученные CSV‑файлы легко интегрировать в любые BI‑инструменты.
Помните: качественная аналитика начинается с чистых и корректных данных. Инвестируйте время в правильную настройку парсера, и ваш SEO‑арсенал будет работать без лишних расходов.