Yandex metrika api - Сбор поисковых запросов
-
На днях встала задача как вытащить все поисковые запросы из метрики по сайту, начал думать… В принципе можно скачать эксельник в отчетах метрики, но она либо не даст сделать сразу за большой период либо начнет тормозить то еще чего - одним словом Яндекс))
Вообщем решил покопаться в API яши и о чудо это можно легко реализовать при помощи кода. Так как с недавнего времени я постепенно начинаю плотно работать с языком Python решил написать скрипт на нем.
И так что нам понадобится создать само приложение в яндекс - https://oauth.yandex.ru/client/new
А в запрашиваемых данных выбрать Яндекс.Метрика - получение статистики.

После нам требуется получить токен, его можно получить программно, но проще взять его по url так как они выдаются и действую почти год или даже больше. Для этого берем из нашего приложения где мы создали выше
ClientId, и подставляем в ссылку:
https://oauth.yandex.ru/authorize?response_type=token&client_id=ВАШ_CLIENT_ID
После даем разрешение, видим токен и копируем его.Теперь перейдем к самому коду:
import csv from datetime import datetime, timedelta import requests # --- НАШИ ДАННЫЕ --- TOKEN = "Наш токен" COUNTER_ID = "№ метрики" # ------------------- def get_yesterday(): return (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d") def main(): url = "https://api-metrika.yandex.net/stat/v1/data" params = { "id": COUNTER_ID, "date1": "2021-01-01", "date2": get_yesterday(), "dimensions": "ym:s:searchPhrase", "metrics": "ym:s:visits", "accuracy": "medium", "limit": 100000, } headers = {"Authorization": f"OAuth {TOKEN}"} try: response = requests.get(url, params=params, headers=headers) if response.status_code != 200: print(f"❌ Ошибка API: {response.status_code}") print(response.text) return result = response.json() data = result.get("data", []) filename = f"metrika_{get_yesterday()}.csv" with open(filename, "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["Search_phrase"]) for row in data: phrase = row["dimensions"][0]["name"] # Записываем, даже если фраза None (будет пустая ячейка) writer.writerow([phrase]) except Exception as e: print(f"Критическая ошибка: {e}") if __name__ == "__main__": main()А теперь объясню как это работает, посмотрим внимательно на
paramsтам есть двеdate1иdate2. Первая - это с какой мы начинаем, а вторая на какой заканчиваем. Я сделал доп функцию которая возвращает вчерашнюю дату (практично так как сегодняшние данные еще в процессе сбора).Более подробно о параметрах можно найти в документации и самим потестировать различные данные - https://yandex.ru/dev/metrika/ru/stat/presets/preset_sources
После параметров делаем запрос и передаем аргументы -
response = requests.get(url, params=params, headers=headers). полученные данных преобразоываем в json, используем встроенную либуcsvпроходимся циклом по каждому ответу и записываем в файлик с новой строки - готово! Теперь мы можем делать с запросами что угодно.Кстати между делом если кому-то интересно я пишу довольно короткий (по сравнению с учебниками) курс по Python. Подробнее тут - https://forum.exlends.com/topic/508/obuchenie-yazyku-programmirovaniya-python/6
© 2024 - 2025 ExLends, Inc. Все права защищены.