Google Ads, конкурентная среда, где вы платите за видимость, и платные результаты вверху страницы поиска точно показывают, какие конкуренты готовы делать ставки на каждый запрос. Эти рекламные позиции публичны: любой может выполнить поиск и прочитать заголовки, отображаемые URLs и текст объявлений, которые соперники показывают той же аудитории, на которую ориентируетесь вы. Собранные в масштабе по целевым ключевым словам, эти данные превращаются в рекламную аналитику, которой можно руководствоваться.

Это руководство покажет, как анализировать рекламу конкурентов в Google Ads: собирать платные результаты на Google SERP через Crawling API для списка ключевых слов, парсить заголовок, отображаемый URL и текст каждого объявления, а затем выяснять, кто из конкурентов делает ставки на какие запросы. Мы ограничим руководство публичными данными об объявлениях, которые видит любой пользователь, а раздел о правовых аспектах в конце написан не для галочки, поэтому прочитайте его прежде, чем направить это на реальные объёмы.

Что вы создадите

Скрипт на Python, который принимает список целевых ключевых слов, выполняет публичный поиск Google для каждого через Crawling API и извлекает структурированную запись для каждого платного объявления на странице. Встроенный парсер Google SERP в Crawling API возвращает уже разобранные объявления, поэтому для каждого вы получите следующие поля:

  • Position позиция объявления среди платных результатов, считая с начала.
  • Title заголовок объявления, жирный кликабельный текст, написанный рекламодателем.
  • Display URL видимый адрес назначения под заголовком, обозначающий бренд конкурента.
  • Description текст объявления: одна или две строки с сообщением и призывом к действию.
  • Site links дополнительные глубокие ссылки, которые некоторые рекламодатели прикрепляют под основным объявлением.

Затем вы сводите результаты по каждому ключевому слову в простое представление конкурентов: какие бренды показывают рекламу по каким ключевым словам и как часто.

Почему обычный запрос не работает в Google

Если вы отправите прямой HTTP-запрос по URL поиска Google из скрипта, вы редко получите ту страницу, которую видите в собственном браузере. Google рендерит большую часть SERP с помощью JavaScript и внимательно следит за автоматизированным трафиком. Запрос, не похожий на запрос от реального браузера, получит стену согласия, CAPTCHA или прямую блокировку задолго до того, как доберётся до разметки объявлений, а сами рекламные позиции персонализированы и рендерятся поздно, поэтому при сыром запросе на странице зачастую вообще нет объявлений.

Таким образом, работающий скрапер Google Ads должен объединять в одном запросе: IP, который платформа воспринимает как адрес реального посетителя, и браузер, который рендерит страницу. Можно собрать это самостоятельно из безголового браузера и пула ротируемых жилых прокси, но их поддержание занимает большую часть работы. Crawling API объединяет оба компонента в одном вызове: вы отправляете URL поиска, он получает данные с доверенного жилого IP, рендерит страницу, и парсер Google SERP возвращает объявления уже разобранными в структурированный JSON.

Почему здесь помогает парсер SERP

Разметка объявлений Google использует хэшированные, часто меняемые имена классов, поэтому написанные вручную CSS-селекторы часто ломаются. Парсер google-serp в Crawling API разбирает страницу на стороне сервера и возвращает чистый массив ads, так что вы читаете поля по имени вместо того, чтобы гоняться за именами классов, меняющимися при каждом деплое. Начать можно с лимита до 20 000 бесплатных запросов без карты.

Ключевые данные для извлечения

Перед кодом стоит чётко понять, что означает каждое поле, поскольку анализ не лучше собранных полей.

  • Заголовки и описания объявлений. Текст объявлений конкурентов показывает, какой месседж, по их мнению, работает. Ищите повторяющиеся формулировки, эмоциональные триггеры и призывы к действию, которые привлекают клики.
  • Целевые ключевые слова. Если объявление конкурента показывается по ключевому слову, значит, он на него ставит, это весомый сигнал о том, что запрос конвертирует для них.
  • Позиция и ранжирование объявлений. Рекламодатель, стабильно занимающий верхнюю платную позицию, либо агрессивно ставит, либо размещает высококачественные объявления, и то, и другое стоит понять.
  • Отображаемые и целевые URL. Отображаемый URL идентифицирует конкурента; целевая страница показывает, как они конвертируют трафик, от дизайна страницы до предложения.
  • Расширения объявлений. Дополнительные ссылки, уточнения и структурированные фрагменты делают объявление крупнее и привлекательнее. Отмечайте, кто их использует и как.

Предварительные требования

Перед написанием кода нужно подготовить несколько вещей. Это не займёт много времени.

Базовые знания Python. Вы должны уметь писать и запускать скрипт на Python, а также устанавливать пакеты через pip. Если разбор JSON-вывода для вас в новинку, наше руководство по парсингу сайтов с Python охватывает основы, необходимые для этого туториала.

Python 3.8 или новее. Проверьте версию командой python --version. Если не установлен, скачайте с python.org или через дистрибутив вроде Anaconda.

Аккаунт Crawlbase и токен. Зарегистрируйтесь, откройте дашборд и скопируйте токен запроса. Вы получаете до 20 000 бесплатных запросов. Парсер SERP рендерит страницу, поэтому используйте обычный (JavaScript) токен запроса. Обращайтесь с токеном как с паролем: он аутентифицирует ваши запросы, поэтому не добавляйте его в систему контроля версий.

Настройка проекта

Установите официальную библиотеку Crawlbase для Python, которая оборачивает Crawling API и его парсер SERP в небольшой клиент.

bash
python --version

python -m venv ads_env
source ads_env/bin/activate

pip install crawlbase

В Windows активируйте окружение командой ads_env\Scripts\activate вместо строки с source. Пакет crawlbase предоставляет клиент CrawlingAPI, который отправляет запрос, применяет парсер Google SERP и возвращает разобранный ответ, так что вам не нужно самостоятельно писать парсинг HTML для объявлений.

Шаг 1: Получение SERP и извлечение объявлений

Начните с получения объявлений для одного ключевого слова. Напишите функцию scrape_google_ads(), которая строит URL поиска, отправляет его через Crawling API с парсером google-serp, проверяет статус и возвращает разобранный массив ads.

python
import json
from urllib.parse import quote
from crawlbase import CrawlingAPI

API_TOKEN = "YOUR_CRAWLBASE_TOKEN"  # replace with your token
crawling_api = CrawlingAPI({"token": API_TOKEN})

def scrape_google_ads(query):
    url = f"https://www.google.com/search?q={quote(query)}"
    options = {"scraper": "google-serp"}
    response = crawling_api.get(url, options)

    if response["headers"]["cb_status"] != "200":
        print(f"Failed to fetch '{query}'")
        return []

    parsed = json.loads(response["body"].decode("latin1"))
    return parsed.get("body", {}).get("ads", [])

if __name__ == "__main__":
    ads = scrape_google_ads("project management software")
    print(f"Found {len(ads)} ads")
    print(json.dumps(ads[:1], indent=2, ensure_ascii=False))

Парсер SERP возвращает JSON-конверт. Вы читаете два значения: response["headers"]["cb_status"], это статус базового запроса к Google, а response["body"], разобранная полезная нагрузка, которую вы декодируете и загружаете через json.loads. Проверка cb_status (legacy pc_status) означает, что блокировка или стена согласия проявляется как явная ошибка, а не подаёт пустую страницу в анализ. Объявления находятся в body.ads, уже разделённые на отдельные записи, поэтому одно ключевое слово вроде "project management software" возвращается как список для проверки. Запустите скрипт, и вы должны увидеть счётчик и первое объявление, что подтверждает работу получения и разбора перед масштабированием.

Crawlbase Crawling API

cb_status возвращает 200, а массив ads заполнен, поскольку запрос достиг Google как запрос от реального посетителя с полностью отрисованной страницей. Crawling API получает каждый SERP с ротируемого жилого IP, рендерит его как браузер, а его парсер Google SERP возвращает объявления уже разобранными, так что вам не нужно управлять парком безголовых браузеров, добывать пул прокси или писать селекторы для хэшированных имён классов Google. Начните с публичного URL поиска на бесплатном тарифе.

Шаг 2: Нормализация полей объявлений

Разобранные объявления дают всё необходимое, но стоит свести каждое из них в единообразную запись, чтобы шаг анализа не лез во вложенные ключи. Напишите небольшую функцию parse_ads(), которая извлекает из каждого объявления заголовок, отображаемый URL, описание, адрес назначения и дополнительные ссылки, и проставляет ключевое слово, по которому оно было получено.

python
def parse_ads(query, ads):
    records = []
    for ad in ads:
        site_links = [
            {
                "title": link.get("title"),
                "url": link.get("url"),
            }
            for link in ad.get("siteLinks", [])
        ]
        records.append({
            "keyword": query,
            "position": ad.get("position"),
            "title": ad.get("title"),
            "displayUrl": ad.get("displayUrl") or ad.get("url"),
            "description": ad.get("description"),
            "destination": ad.get("url"),
            "siteLinks": site_links,
        })
    return records

Каждая запись теперь содержит keyword, ключевое слово, по которому она получена, position, позицию объявления, title, заголовок, displayUrl, видимый бренд (с откатом на адрес назначения, если поле отображения отсутствует), description, текст объявления, реальный destination URL и сплющенный список siteLinks. Проставление ключевого слова на каждом объявлении делает возможным последующий анализ: оно позволяет группировать объявления по конкурентам по многим ключевым словам, не теряя информации о том, по какому запросу появилось каждое.

Display URL, ваш ключ конкурента

Отображаемый URL (или его зарегистрированный домен), наиболее надёжный способ идентифицировать, кто стоит за объявлением. Заголовки и текст варьируются от кампании к кампании, а доменное имя бренда стабильно, поэтому при подсчёте ставок по ключевым словам группируйте по displayUrl.

Шаг 3: Обход списка ключевых слов и анализ конкурентов

Теперь соберите всё воедино. Пройдитесь по целевым ключевым словам, спарсите и разберите объявления для каждого, соберите все записи, а затем сведите их в представление конкурентов. Добавьте в цикл небольшую паузу, чтобы не отправлять запросы один за другим без промедления.

python
import json
import time
from urllib.parse import quote, urlparse
from collections import defaultdict
from crawlbase import CrawlingAPI

API_TOKEN = "YOUR_CRAWLBASE_TOKEN"
crawling_api = CrawlingAPI({"token": API_TOKEN})

KEYWORDS = [
    "project management software",
    "crm for small business",
    "time tracking app",
]

def scrape_google_ads(query):
    url = f"https://www.google.com/search?q={quote(query)}"
    response = crawling_api.get(url, {"scraper": "google-serp"})
    if response["headers"]["cb_status"] != "200":
        print(f"Failed to fetch '{query}'")
        return []
    parsed = json.loads(response["body"].decode("latin1"))
    return parsed.get("body", {}).get("ads", [])

def parse_ads(query, ads):
    return [
        {
            "keyword": query,
            "position": ad.get("position"),
            "title": ad.get("title"),
            "displayUrl": ad.get("displayUrl") or ad.get("url"),
            "description": ad.get("description"),
            "destination": ad.get("url"),
        }
        for ad in ads
    ]

def domain_of(record):
    target = record["destination"] or record["displayUrl"] or ""
    return urlparse(target).netloc or target

def main():
    all_ads = []
    for keyword in KEYWORDS:
        ads = scrape_google_ads(keyword)
        all_ads.extend(parse_ads(keyword, ads))
        print(f"{keyword}: {len(ads)} ads")
        time.sleep(2)

    competitors = defaultdict(list)
    for record in all_ads:
        competitors[domain_of(record)].append(record["keyword"])

    report = {
        domain: {
            "adCount": len(keywords),
            "keywords": sorted(set(keywords)),
        }
        for domain, keywords in competitors.items()
    }

    with open("competitor_ads.json", "w", encoding="utf-8") as f:
        json.dump({"ads": all_ads, "competitors": report},
                  f, ensure_ascii=False, indent=2)
    print(f"Saved {len(all_ads)} ads from {len(report)} competitors")

if __name__ == "__main__":
    main()

Запустите полный скрипт командой python competitor_ads.py. Он парсит объявления для каждого ключевого слова в KEYWORDS, сводит их в записи, затем группирует каждую запись по домену конкурента с помощью defaultdict, формируя отчёт о том, сколько объявлений разместил каждый бренд и по каким ключевым словам. Вывод сохраняется в competitor_ads.json, содержащем как сырые записи объявлений, так и сводный вид по конкурентам. Добавьте больше запросов в KEYWORDS, и те же две функции обработают остальное; анализ растёт вместе со списком.

Как выглядят результаты

Вы получаете структурированный объект с разобранными объявлениями и сводкой по конкурентам, готовый к загрузке в таблицу, ноутбук или базу данных для более глубокого анализа.

json
{
  "ads": [
    {
      "keyword": "project management software",
      "position": 1,
      "title": "Project Management Tool | Plan, Track and Ship Faster",
      "displayUrl": "https://www.example-pm.com/",
      "description": "Run every project in one place. Free 14-day trial, no card required.",
      "destination": "https://www.example-pm.com/trial"
    }
  ],
  "competitors": {
    "www.example-pm.com": {
      "adCount": 2,
      "keywords": ["crm for small business", "project management software"]
    }
  }
}

Блок competitors, это и есть аналитика: он с первого взгляда показывает, какие бренды делают ставки на какие из ваших запросов и по скольким из отслеживаемых ключевых слов каждый из них появляется. Конкурент, присутствующий по нескольким ключевым словам, инвестирует широко; тот, кто удерживает верхнюю позицию по вашему самому ценному запросу, заслуживает более пристального изучения, его текста объявления и целевой страницы.

Масштабирование по ключевым словам и локациям

Один небольшой список ключевых слов, это демо; реальная задача предполагает отслеживание десятков запросов, нередко по регионам, с повторными запусками по расписанию для обнаружения новых участников. Структура остаётся прежней: строите каждый URL поиска, получаете его через Crawling API с парсером SERP и разбираете объявления. Несколько дополнений делают это production-ready.

  • Локализуйте SERP. Рекламные аукционы различаются по странам, поэтому добавляйте &gl=us и &hl=en (или другую страну и язык) к URL поиска, чтобы получать объявления, которые увидит пользователь в этом рынке.
  • Регулируйте цикл. Оставляйте короткую паузу между запросами вместо того, чтобы отправлять их вплотную. Распределяйте большой список ключевых слов, а не нагружайте Google в плотном цикле.
  • Планируйте повторные запуски. Текст объявлений и ставки меняются еженедельно, поэтому еженедельный запуск превращает разовый снимок в тенденцию, которую можно отслеживать со временем.

Crawlbase обрабатывает до 20 запросов в секунду по умолчанию, чего достаточно для регулируемого трекера ключевых слов, а любой ответ 5XX от API не тарифицируется, так что повторный запрос заблокированного URL ничего не стоит. Если вы предпочитаете маршрутизировать собственный трафик через ротируемый пул, Smart AI Proxy предоставляет ту же жилую ротацию в качестве drop-in эндпоинта. Для сценария парсинга и обхода блокировок применительно к Google конкретно смотрите статьи о том, как ротировать прокси при парсинге результатов поиска Google и как обходить CAPTCHA при парсинге Google.

Комбинируйте парсинг с официальным источником прозрачности

Парсинг живого SERP показывает, что сейчас работает по вашим конкретным ключевым словам, данные, которые иначе не получить. Чтобы дополнить картину, используйте его вместе с бесплатным инструментом Google, Google Ads Transparency Center. Он позволяет найти рекламодателя и посмотреть, какие объявления он размещает в сети Google, какие форматы использует и на какие регионы ориентируется. Это официальный источник, и именно здесь стоит детально изучить рекламные материалы известного конкурента.

Оба подхода дополняют друг друга: парсите список ключевых слов, чтобы узнать, кто конкурирует по каждому запросу и как их текст выглядит в контексте, а затем открывайте Transparency Center по брендам, которые имеют значение, чтобы увидеть более широкий след их кампаний. Помимо собственного инструмента Google, платные платформы вроде SEMrush, SpyFu и Ahrefs оценивают рекламные расходы и историческое покрытие ключевых слов, что полезно для анализа тенденций, но менее точно, чем самостоятельное чтение живого SERP.

Допустимость парсинга данных Google Ads зависит от условий использования сервиса, вашей юрисдикции и того, как вы применяете данные. Условия Google ограничивают автоматизированный доступ к своему поисковому сервису, поэтому парсинг может нарушать их независимо от аккуратности вашего инструментария. Сами рекламные позиции публичны, любой может их увидеть, выполнив тот же поиск, но «публичный» не означает «без ограничений». Ни один из приведённых здесь кодов не меняет условий Google; он лишь делает техническую часть рабочей. Ознакомьтесь с условиями Google и его файлом robots.txt и рассматривайте оба документа как границу того, что вы собираете.

Несколько правил, которых стоит придерживаться. Собирайте только публичные данные об объявлениях: заголовки, отображаемые URLs, описания, позиции и дополнительные ссылки, которые любой пользователь видит на странице результатов без аккаунта. Держите объём запросов на уровне, при котором вы не нагружаете серверы Google, и проводите сбор равномерно, а не в максимально плотном режиме. Не парсите ничего за авторизацией, не собирайте персональные данные и не публикуйте защищённые авторским правом рекламные материалы конкурентов как свои. Вы собираете конкурентную аналитику для формирования своей стратегии, а не создаёте зеркало чужих кампаний.

Там, где существует официальный источник, предпочитайте его. Ads Transparency Center Google, санкционированный способ изучить текущие объявления конкретного рекламодателя, и это правильный путь, когда вам нужна глубина по конкретному конкуренту, а не живой срез вашего списка ключевых слов. Это руководство намеренно ограничено публичными, видимыми результатами рекламы, поскольку именно эта область делает работу защищённой. Если вашему проекту нужно больше, официальное соглашение о данных или одна из лицензированных платформ рекламной аналитики, правильный путь, а не более изощрённый скрапер.

Итоги

Ключевые выводы

  • Рекламные позиции, публичный сигнал. Платные результаты по вашим ключевым словам показывают, кто из конкурентов делает ставки, что говорит и куда направляет трафик, в масштабе это превращается в рекламную аналитику.
  • Парсер SERP выполняет разбор. Отправьте каждый URL поиска через Crawling API с парсером google-serp и читайте объявления из body.ads вместо написания селекторов для хэшированных имён классов Google.
  • Проставляйте ключевое слово на каждом объявлении. Перенос ключевого слова в каждую запись позволяет группировать объявления по домену конкурента и видеть, кто ставит по каким запросам.
  • Группируйте по отображаемому URL. Доменное имя бренда, стабильный ключ для подсчёта конкурентов; заголовки и текст варьируются, домен, нет.
  • Комбинируйте парсинг с Transparency Center. Парсите живой SERP для охвата ключевых слов, затем используйте официальный Ads Transparency Center Google для глубокого анализа конкретного рекламодателя и оставайтесь только на публичных данных.

Часто задаваемые вопросы

Почему обычный запрос возвращает страницу Google без объявлений?

Google рендерит большую часть SERP, включая рекламные позиции, с помощью JavaScript, персонализирует её для каждого запроса и блокирует трафик, не похожий на запросы от реального браузера. Прямой HTTP-запрос нередко получает стену согласия, CAPTCHA или страницу без объявлений. Запрос через Crawling API, использующий ротируемые жилые IP и рендеринг страницы, делает запрос похожим на запрос обычного посетителя, поэтому объявления действительно присутствуют, а парсер SERP возвращает их уже разобранными.

Какие поля объявлений можно извлечь из Google SERP?

Парсер Google SERP возвращает массив ads, в котором каждое объявление содержит позицию, заголовок, отображаемый URL, описание (текст), URL назначения и дополнительные ссылки. В этом туториале они сводятся в одну запись на объявление с проставленным ключевым словом, чего достаточно для анализа текста, позиций и ставок конкурентов по запросам.

Как найти конкурентов, делающих ставки по ключевому слову?

Выполните поиск по каждому целевому ключевому слову, соберите объявления и сгруппируйте записи по домену конкурента (полученному из отображаемого URL или URL назначения). Бренд, появляющийся по ключевому слову, делает на него ставки. Сведите эти группы по всему списку ключевых слов, и вы получите представление охвата для каждого конкурента, это основа анализа в данном руководстве.

Используйте оба. Transparency Center, официальный инструмент Google для просмотра объявлений, которые размещает конкретный рекламодатель в сети, поэтому он идеален для детального изучения рекламных материалов известного конкурента. Парсинг живого SERP по собственному списку ключевых слов показывает, кто конкурирует по каждому запросу прямо сейчас и как их текст выглядит в контексте, этого Transparency Center напрямую не даёт. Они отвечают на разные вопросы.

Используйте ротируемые жилые IP, чтобы запросы исходили со многих реальных пользовательских адресов, рендерите страницу, чтобы объявления загружались, и регулируйте запросы, а не отправляйте их вплотную. Crawling API обрабатывает ротацию и рендеринг за вас; если вы строите собственный стек, именно эти части требуют правильной реализации. Чтение статуса каждого ответа также позволяет отступить, как только Google начинает возвращать запросы на верификацию.

Можно ли отслеживать изменения объявлений во времени?

Да. Поскольку каждый запуск записывает структурированный снимок с ключом по ключевому слову и домену конкурента, планирование еженедельного запуска и сравнение снимков показывает новых участников, ушедших рекламодателей и изменения в тексте или позиции. Более широкое применение этого вида конкурентных данных описано в нашем руководстве об использовании веб-парсинга для ценовой аналитики.

Начать создавать

Обходите любой сайт в масштабе, без борьбы с инфраструктурой.

Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.

Самообслуживание · Звонок отдела продаж не требуется · Доступны корпоративные объёмы краулинга