В 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, внутри которого можно изучить интересы целевой аудитории по отдельным ключевым словам и запросам с привязкой к конкретным регионам, времени и категориям. Группы запросов можно сравнивать друг с другом, а можно сравнить те же запросы сами с собой, но в разных локациях и за разные периоды времени.
Единственный недостаток — Google не показывает точное число запросов, соответственно статистика получается весьма условной. На выходе выдаётся оценка в процентах, она же индекс — от 0 до 100. Иногда присваиваются специальные статусы, например, Breakout («Сверхпопулярность»), которые наглядно выделяют особо завирусившиеся запросы.
Для понимания ситуации, складывающихся трендов и общих тенденций таких данных более чем достаточно.
Популярные запросы, связанные с основным, а также запросы, только набирающие популярность, можно скачать в виде CSV-файлов — технически это уже готовые табличные данные, которые можно брать в работу для анализа.
Но вручную очень сложно обработать большой объём данных, поэтому появляется потребность в автоматическом парсинге Google Трендов. Качественный парсер Google Trends:
Ниже о наиболее вероятных вариантах парсинга Google Trends.
Почему прямой парсинг 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 не спасут.
Самый очевидный ход — если Google не даёт доступа к официальному API, поискать готовые реализации. Такие сервисы есть. Вот несколько примеров:
Аналогичных облачных парсеров масса. Логика работы здесь достаточно простая: они выступают в роли посредников и в реальности парсят страницы сами, а вам возвращают только готовые форматированные данные, с нужной вам разметкой или просто в одном из популярных форматов, например, в JSON.
Варианты подключения к таким сервисам стоит изучать в их документации. Почти всегда используется API-ключ для аутентификации пользователя — чтобы никто другой не использовал ваш пакет предоплаченных запросов.
У нас тоже есть облачные парсеры — Froxy Scrapers, но пока без поддержки Google Trends. В качестве рабочего варианта можно рассмотреть универсальный HTML-парсер.
Несмотря на то, что библиотека обновлялась последний раз в 2023 году, её принципы остаются вполне «работоспособными». Дело в том, что PyTrends парсит не DOM-структуру (выше мы уже рассказали почему это не сработает), а обращается напрямую к внутреннему API Google Trends — эндпоинтам. Они отдают чистые данные без UI-компонентов. А уже специальные фреймворки отображают их на страницах.
Схема работы PyTrends примерно такая:
Однако, из-за того, что Google периодически меняет свои эндпоинты и рьяно следит за блокировками любых автоматизаций, можно быстро столкнуться с баном:
Материал по теме: reCAPTCHA и hCaptcha: гайд для скрапинга.
Варианты контрмер для защиты от проблем:
Читайте также: Гайд по успешному парсингу без блокировок.
Идеальные прокси-серверы для доступа к ценным данным из 200+ локаций по всему миру.
Пример парсера Google Trends на Python. Он:
Итак, сам код:
# Не забудьте установить необходимые библиотеки - 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 для парсинга есть официальный API, пусть и в режиме закрытого тестирования, то получается, что компания не против того, чтобы делиться данными о статистике запросов со своими пользователями. Плюс данные по популярным фразам предлагается скачивать в CSV-формате, а часть информации видно даже без авторизации. Единственное неудобство — рост нагрузки на инфраструктуру Google. Как раз из-за этого компания активно защищается от инструментов автоматизации и ботов: показывает капчу, блокирует доступ для конкретных IP.
Если вы будете следить за оптимальной частотой обращений к сервису и не будете создавать чрезмерной нагрузки, то всё будет хорошо. Никах законов и правил вы не нарушаете, по крайней мере, если ваши цели исследовательские и вы не нарушаете авторских прав / законов об интеллектуальной собственности.
Частота обращений к сервису никак и нигде не закреплена. Её можно определить только опытным путём. Но тут стоит помнить, что в любой момент времени механизмы защиты Google Trends могут обновиться. Соответственно, та частота обращений, которая работала раньше, может перестать работать.
На текущий момент подтверждённой статистики по нагрузке нет. Если вы не хотите получить бан, то начинайте с задержек в одну минуту, а затем постепенно снижайте её в поиске «золотой середины». Стоит также учитывать, что какой-то объём «новых» запросов может обрабатываться быстрее. А уже после его исчерпания срабатывает защита. В документации PyTrends упоминается лимит в 1400 запросов в первые 4 часа. Но он может быть сильно устаревшим — это данные из далёкого 2023-го.
Конечно, вы можете использовать любой язык программирования. Просто для Python в наличии готовые реализации библиотек, такие как Pytrends и Pytrends Modern. Но вы можете изучить их принципы работы и портировать код на любой другой язык. А если вы ещё опубликуете свои библиотеки, сообщество будет вам благодарно.
Механизмы защиты Google усложнились. Самый первый инструмент — качественные прокси. А уже поверх них можно организовать естественный браузерный профиль и подумать об эмуляции поведения пользователя, в том числе с рандомизацией задержек между запросами. Невидимая капча может работать как WAF (web-firewall) — она умеет анализировать массу параметров пользователя и оценивать «человечность» его поведения.
Качественные прокси-серверы для веб-парсинга можно приобрести у нас. Froxy — это миллионы резидентных и мобильных прокси с максимальным трастом и автоматической ротацией.