Вход Регистрация

Парсинг

Как парсить данные из Google Trends

Разбираем способы парсинга Google Trends: сторонние API, форки PyTrends и headless-браузеры. Готовый код на Python и советы по выбору прокси внутри статьи.

Команда Froxy 25 июн 2026 7 мин
Как парсить данные из Google Trends

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

Последний вариант могут облегчить готовые библиотеки, такие как pytrends (последний апдейт в 2023 году). Однако, профессиональные программисты всегда могут пойти своим путём и придумать что-то своё.

Типовой вызов данных с трендами по ключевому слову для библиотеки pytrends будет выглядеть так:

# Не забудьте установить всё необходимое:
# pip install pytrends requests lxml pandas

from pytrends.request import TrendReq

pytrends = TrendReq(
    hl='en-US',
    tz=360,
    timeout=(10,25),
    proxies=['https://127.0.0.1:8080',],
    retries=2,
    backoff_factor=0.1,
    requests_args={'verify':False}
)  # Сразу вариант обращения через прокси и опция игнорирования ошибок подключения по SSL

kw_list = ["Python", "Pizza", "Spaghetti"]  # Список ключевых слов, не более 5

pytrends.build_payload(
    kw_list,
    cat=31,
    timeframe='today 5-y',
    geo='US',
    gprop='news',
    sleep=60
)  # Параметры запроса: фрейм времени (последние 5 лет), категория (31 - «Программирование»),
  # территория («США»), группировка результатов (только «Новости») и задержка между обращениями (60 секунд)

data = pytrends.interest_over_time()  # возврат данных в формате pandas.DataFrame
print(data.head())  # вывод заголовков в консоль

Если этого ответа вам мало, продолжаем погружение в детали — поясняем как написать свой парсер Google Trends.

Что такое данные Google Trends и зачем их парсить

Google Trends — это официальный бесплатный сервис от Google, внутри которого можно изучить интересы целевой аудитории по отдельным ключевым словам и запросам с привязкой к конкретным регионам, времени и категориям. Группы запросов можно сравнивать друг с другом, а можно сравнить те же запросы сами с собой, но в разных локациях и за разные периоды времени.

Единственный недостаток — Google не показывает точное число запросов, соответственно статистика получается весьма условной. На выходе выдаётся оценка в процентах, она же индекс — от 0 до 100. Иногда присваиваются специальные статусы, например, Breakout («Сверхпопулярность»), которые наглядно выделяют особо завирусившиеся запросы.

Для понимания ситуации, складывающихся трендов и общих тенденций таких данных более чем достаточно.

Популярные запросы, связанные с основным, а также запросы, только набирающие популярность, можно скачать в виде CSV-файлов — технически это уже готовые табличные данные, которые можно брать в работу для анализа.

Но вручную очень сложно обработать большой объём данных, поэтому появляется потребность в автоматическом парсинге Google Трендов. Качественный парсер Google Trends:

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

Ниже о наиболее вероятных вариантах парсинга Google Trends.

Способ 0. Не стоит даже пытаться — анализ DOM-структуры

Анализ DOM-структуры

Почему прямой парсинг DOM — это плохая идея? Всё дело в том, что Google Trends защищает HTML-код и классы, используя уникальные идентификаторы, которые «подмешиваются» в результирующий код ещё при сборке его в браузере (это autogenerated Closure classes). От страницы к странице, как и от сессии к сессии, идентификаторы будут отличаться, что сводит на нет поиск повторяющихся элементов и не даёт извлекать конкретные данные.

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

<div jsaction="mouseenter:LAIBnf; mouseleave:vDJIge" class="MzJVtd" jscontroller="OLv9M"><span class="Z9Uqw">ЗДЕСЬ САМ ЗАПРОС</span></div>

Можно попытаться отталкиваться от HTML-тегов и их вложенности, но тогда даже малейшее изменение структуры будет «ломать» ваш парсер.

Ну и вишенка на торте — получить результирующий HTML-код можно только при наличии реального браузера. Для автоматизации можно использовать headless-браузеры или антидетекты.

Никакие Requests не спасут.

Способ 1. Готовые API для парсинга Google Trends

Готовые API для парсинга Google Trends

Самый очевидный ход — если Google не даёт доступа к официальному API, поискать готовые реализации. Такие сервисы есть. Вот несколько примеров:

  • SerpApi — 250 запросов в месяц бесплатно, премиум-подписки от 25 $/месяц, возвращает форматированный JSON.
  • Apify — универсальный облачный парсер с большим количеством готовых скриптов, в наличии поддержка парсинга Google Trends. Выгрузка данных в JSON, CSV, Excel, XML или HTML. На вход принимает поисковые запросы или готовые конструкции фильтров. Базовая подписка — от 26 $/месяц + стоимость пакетов запросов (от 0,3 $ за 1000 транзакций).
  • ScraperAPI — тоже универсальный парсер, в наличии готовая реализация Google Trends скрейпера, ответы отдаются в JSON, а также с разметкой Markdown или в текстовом виде (для LLM). Подписки — от 44 $/месяц с пакетами сгорающих запросов.

Аналогичных облачных парсеров масса. Логика работы здесь достаточно простая: они выступают в роли посредников и в реальности парсят страницы сами, а вам возвращают только готовые форматированные данные, с нужной вам разметкой или просто в одном из популярных форматов, например, в JSON.

Варианты подключения к таким сервисам стоит изучать в их документации. Почти всегда используется API-ключ для аутентификации пользователя — чтобы никто другой не использовал ваш пакет предоплаченных запросов.

У нас тоже есть облачные парсеры — Froxy Scrapers, но пока без поддержки Google Trends. В качестве рабочего варианта можно рассмотреть универсальный HTML-парсер.

Способ 2. Парсинг Google Trends с помощью PyTrends или его форков

Парсинг Google Trends с помощью PyTrends или его форков

Несмотря на то, что библиотека обновлялась последний раз в 2023 году, её принципы остаются вполне «работоспособными». Дело в том, что PyTrends парсит не DOM-структуру (выше мы уже рассказали почему это не сработает), а обращается напрямую к внутреннему API Google Trends — эндпоинтам. Они отдают чистые данные без UI-компонентов. А уже специальные фреймворки отображают их на страницах.

Схема работы PyTrends примерно такая:

  1. Обратиться к сервису Google Trends.
  2. Получить токен/widget config через /api/explore — это основной эндпоинт для работы с данными.
  3. Использовать этот token для запроса данных.
  4. Получить «сырые» данные в JSON-формате.
  5. Преобразовать при необходимости в нужный формат.

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

  • Либо будет показываться капча (Google Trends работают в связке с невидимой капчей reCAPTCHA v3).
  • Либо будет отдаваться ошибка 429 «Too Many Requests».
  • Либо ответ эндпоинта вообще будет пустым.

Материал по теме: reCAPTCHA и hCaptcha: гайд для скрапинга.

Варианты контрмер для защиты от проблем:

  • Использовать качественные резидентные или мобильные прокси. Никаких VPS / датацентровых или бесплатных. Проси должны быть максимально трастовыми.
  • Следить за частотой обращений — чем реже, тем лучше. По отзывам разработчиков парсеров Google Trends речь о небольшом количестве «быстрых» запросов при первом подключении, а затем о задержках около 1 минуты, если внутренний лимит достигнут. К слову, в PyTrends есть встроенная защита — задержки в случае ошибок увеличиваются экспоненциально, по формуле {backoff factor} * (2 ^ ({number of total retries} - 1)).
  • Можно поискать более современные форки PyTrends, в которых актуализированы алгоритмы извлечения токена, адреса эндпоинтов и разметка ответов. Например, pytrends-modern активно обновляется, поддерживает работу через Selenium и Camoufox с авторизацией в аккаунте, асинхронные запросы и ручную настройку cookies.
  • А ещё лучше обеспечить связку PyTrends с headless-браузером и качественными прокси для парсинга. Браузер будет отвечать за получение токена и прохождение проверки на «человечность» (с невидимой капчей и правдоподобным браузерным отпечатком), прокси будут отвечать за обход блокировок за слишком частые обращения с одного IP-адреса, а PyTrends — за получение форматированных данных о трендах и запросах.

Читайте также: Гайд по успешному парсингу без блокировок.

Резидентные прокси

Идеальные прокси-серверы для доступа к ценным данным из 200+ локаций по всему миру.

Попробовать триал $1.99, 100Mb

Пример парсера Google Trends на Python. Он:

  1. Читает список поисковых фраз из keywords.txt. Это простой список, каждая новая фраза указывается с новой строки.
  2. Затем создаётся browser-сессия через pytrends-modern — запускается headless Chromium или Camoufox, который подключается к прокси с авторизацией. Здесь вы можете подставить прокси Froxy. Они подключаются один раз, а логика ротации настраивается в личном кабинете.
  3. Создаётся браузерный профиль — он же цифровой отпечаток.
  4. Включается «человеческое» поведение, которое снижает вероятность блокировок и показа капчи.
  5. Браузер загружается с поддержкой cookies и локальной памяти. Именно здесь хранится токен, без которого не обратиться к эндпоинтам.
  6. После инициализации браузер открывает Google Trends и получает рабочую пользовательскую сессию.
  7. Далее pytrends-modern использует уже не обычные HTTP-запросы, а browser-backed сессию. То есть запросы к: /trends/api/explore и /trends/api/widgetdata/*. Они выполняются как будто их отправляет реальный Chromium.
  8. Для каждой поисковой фразы формируется payload и отправляется запрос в Google Trends.
  9. Из эндпоинтов извлекаются: популярные запросы, набирающие популярность и связанные поисковые фразы.
  10. Между запросами добавляются случайные задержки.
  11. Все результаты приводятся к единой структуре и объединяются в один DataFrame, который сохраняется в CSV.

Итак, сам код:

# Не забудьте установить необходимые библиотеки - pip install pandas pytrends-modern[browser]

import random
import time
from pathlib import Path
import pandas as pd
from pytrends_modern import TrendReq, BrowserConfig

# =========================================================
# CONFIG
# =========================================================
KEYWORDS_FILE = "keywords.txt"
OUTPUT_DIR = Path("output")
OUTPUT_FILE = OUTPUT_DIR / "trends.csv"
HEADLESS = False
LANG = "en-US"
TIMEZONE = 360
MIN_DELAY = 4
MAX_DELAY = 9
RETRIES = 3

# =========================================================
# PROXY
# =========================================================
# pytrends-modern использует обычный proxy URL
PROXY_SERVER = (
    "http://proxy_user:proxy_password@proxy-host:port"
)

# =========================================================
# LOAD KEYWORDS
# =========================================================
def load_keywords():
    with open(KEYWORDS_FILE, "r", encoding="utf-8") as f:
        return [
            line.strip()
            for line in f
            if line.strip()
        ]

# =========================================================
# CREATE CLIENT
# =========================================================
def create_client():
    os_choice = random.choice([
        "windows",
        "macos",
        "linux"
    ])
    browser_config = BrowserConfig(
        # browser
        headless=HEADLESS,
        # delays
        min_delay=MIN_DELAY,
        max_delay=MAX_DELAY,
        # fingerprint rotation
        os=os_choice,
        # browser behavior
        humanize=True,
        # persistent browser profile
        persistent_context=True,
        # proxy
        proxy_server=PROXY_SERVER,
    )
    pytrends = TrendReq(
        hl=LANG,
        tz=TIMEZONE,
        retries=RETRIES,
        browser_config=browser_config,
    )
    return pytrends

# =========================================================
# FETCH RELATED QUERIES
# =========================================================
def fetch_related_queries(pytrends, keyword):
    print(f"[+] Fetching keyword: {keyword}")
    try:
        pytrends.build_payload(
            kw_list=[keyword],
            timeframe="today 12-m",
            geo=""
        )
        related = pytrends.related_queries()
        keyword_data = related.get(keyword)
        if not keyword_data:
            return []
        rows = []
        # top + rising
        for trend_type in ["top", "rising"]:
            df = keyword_data.get(trend_type)
            if df is None:
                continue
            for _, row in df.iterrows():
                rows.append({
                    "source_keyword": keyword,
                    "related_keyword": row.get("query"),
                    "value": row.get("value"),
                    "trend_type": trend_type,
                })
        return rows
    except Exception as e:
        print(f"[!] Error for '{keyword}': {e}")
        return []

# =========================================================
# MAIN
# =========================================================
def main():
    OUTPUT_DIR.mkdir(exist_ok=True)
    keywords = load_keywords()
    if not keywords:
        print("[!] No keywords found")
        return
    print("[+] Initializing pytrends-modern...")
    pytrends = create_client()
    all_rows = []
    for keyword in keywords:
        rows = fetch_related_queries(
            pytrends,
            keyword
        )
        all_rows.extend(rows)
        sleep_time = random.uniform(
            MIN_DELAY,
            MAX_DELAY
        )
        print(f"[+] Sleep: {sleep_time:.2f}s")
        time.sleep(sleep_time)
    if not all_rows:
        print("[!] No data collected")
        return
    df = pd.DataFrame(all_rows)
    df.to_csv(
        OUTPUT_FILE,
        index=False,
        encoding="utf-8-sig"
    )
    print(f"[+] Saved: {OUTPUT_FILE}")
    print(f"[+] Rows: {len(df)}")

if __name__ == "__main__":
    main()

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

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

Законно ли парсить Google Trends?

Если учесть, что у Google Trends для парсинга есть официальный API, пусть и в режиме закрытого тестирования, то получается, что компания не против того, чтобы делиться данными о статистике запросов со своими пользователями. Плюс данные по популярным фразам предлагается скачивать в CSV-формате, а часть информации видно даже без авторизации. Единственное неудобство — рост нагрузки на инфраструктуру Google. Как раз из-за этого компания активно защищается от инструментов автоматизации и ботов: показывает капчу, блокирует доступ для конкретных IP.

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

Как часто можно обновлять данные?

Частота обращений к сервису никак и нигде не закреплена. Её можно определить только опытным путём. Но тут стоит помнить, что в любой момент времени механизмы защиты Google Trends могут обновиться. Соответственно, та частота обращений, которая работала раньше, может перестать работать.

На текущий момент подтверждённой статистики по нагрузке нет. Если вы не хотите получить бан, то начинайте с задержек в одну минуту, а затем постепенно снижайте её в поиске «золотой середины». Стоит также учитывать, что какой-то объём «новых» запросов может обрабатываться быстрее. А уже после его исчерпания срабатывает защита. В документации PyTrends упоминается лимит в 1400 запросов в первые 4 часа. Но он может быть сильно устаревшим — это данные из далёкого 2023-го.

Можно ли парсить Google Trends без Python?

Конечно, вы можете использовать любой язык программирования. Просто для Python в наличии готовые реализации библиотек, такие как Pytrends и Pytrends Modern. Но вы можете изучить их принципы работы и портировать код на любой другой язык. А если вы ещё опубликуете свои библиотеки, сообщество будет вам благодарно.

Как лучше всего избежать блокировки?

Механизмы защиты Google усложнились. Самый первый инструмент — качественные прокси. А уже поверх них можно организовать естественный браузерный профиль и подумать об эмуляции поведения пользователя, в том числе с рандомизацией задержек между запросами. Невидимая капча может работать как WAF (web-firewall) — она умеет анализировать массу параметров пользователя и оценивать «человечность» его поведения.

Качественные прокси-серверы для веб-парсинга можно приобрести у нас. Froxy — это миллионы резидентных и мобильных прокси с максимальным трастом и автоматической ротацией.

Получайте уведомления о новых функциях и обновлениях Froxy

Узнайте первыми о новых функциях Froxy, чтобы оставаться в курсе событий происходящих на рынке цифровых технологий и получать новости о новых функциях Froxy.

Статьи по Теме

Как предотвратить остановку парсера на Python из-за обновлений сайта

Парсинг

Как предотвратить остановку парсера на Python из-за обновлений сайта

Даже малейшие изменения HTML ломают парсеры. В статье практические приёмы, которые помогут сделать ваш Python-код для скрапинга стабильным и надёжным.

Команда Froxy 16 окт 2025 11 мин
Кеширование в Python при скрапинге: сокращение количества запросов и ускорение сбора данных

Парсинг

Кеширование в Python при скрапинге: сокращение количества запросов и ускорение сбора данных

Механизмы кэширования Python и методы сохранения состояния сейчас играют главную роль. В этом гайде — как использовать кэширование в Python для...

Команда Froxy 9 дек 2025 10 мин