Начало работы с Yandex Metrika API

В работе с любыми API первым шагом является получение токена. Затем нужно понять как формировать запросы. Плюс необходимо узнать какие форматы данных может возвращать API — обычно это JSON, CSV (TXT).

Вся документация Yandex Metrika API обычно очень быстро гуглится — https://yandex.ru/dev/metrika/.

Я пройдусь от получения токена до получения выгруженных данных из Yandex.Metrika.

Yandex Token Для яндекс метрики

Итак, в соответствии с инструкцией регистрируем приложение по ссылке https://oauth.yandex.ru/client/newСсылка может поменяться, так что если что гуглите.

Указываем название приложения, делаем описание.

В поле Callback URL вбиваем https://oauth.yandex.ru/verification_code

Указываете в разделе Yandex.Metrika, что выдать доступ для получения статистики.

Создаете приложение

Яндекс выдаст Вам ID и Пароль. Можете не запоминать их, всегда можно найти в списке созданных приложений — https://oauth.yandex.ru/

Берем ссылку

https://oauth.yandex.ru/authorize?response_type=token&client_id=<идентификатор приложения>

Подставляем <идентификатор приложения> — это полученный ID. Вбиваем в URL в браузере. У меня получилась такая вот ссылка:

https://oauth.yandex.ru/authorize?response_type=token&client_id=14b9e156de754901b9f321f53746092b

Дальше появляется запрос на предоставление доступа

Далее подтверждаем. Яндекс выдаст нам наш токен для доступа к статистике:

Наш токен

Запоминаем, никому не передаем, храним в укромном уголке на компьютере или в почте 🙂

AgAAAAAJ8KAaAAYl4OT0R-7vKU3IkJuf0A0lN5M

Ставим библиотеку tapi-yandex-metrika

https://github.com/pavelmaksimov/tapi-yandex-metrika

pip install pyOpenSSL
pip install tapi-yandex-metrika

Пример запроса (поменяйте TOKEN и IDS счетчика)

from tapi_yandex_metrika import YandexMetrikaStats

ACCESS_TOKEN = "AgAAAAAJ8KAaAAYl4OT0R-7vKU3IkJuf0A0lN5M"

# По умолчанию возвращаются только 10000 строк отчета, 
# если не указать другое кол-во в параметре limit.
# В отчете может быть больше строк, чем указано в limit 
# Тогда необходимо сделать несколько запросов для получения всего отчета.
# Чтоб сделать это автоматически вы можете указать 
# параметр receive_all_data=True при инициализации класса.

api = YandexMetrikaStats(
    access_token=ACCESS_TOKEN, 
    # Если True, будет скачивать все части отчета. По умолчанию False.
    receive_all_data=True
)
params = dict(
    ids="18197662",
    metrics="ym:s:visits,ym:s:bounces",
    dimensions="ym:s:date,ym:s:startOfMonth",
    sort="ym:s:date",
    limit=10
)
result = api.stats().get(params=params)
print(result().data)

Получение данных из Yandex.Metrika API с помощью библиотеки tapi_yandex_metrika и выгрузка данных в Excel через Pandas DataFrame

Ниже будет представлен пример получения данных из Yandex.Metrika API с последующим сохранением массива данных в Excel.

from tapi_yandex_metrika import YandexMetrikaStats
import json
import pandas as pd

ACCESS_TOKEN = "AgAAdsf4fffaAAYl4OT0R-7vKU3IkJuf0A0lN5M"
METRIC_IDS = "54333315"

# По умолчанию возвращаются только 10000 строк отчета, 
# если не указать другое кол-во в параметре limit.
# В отчете может быть больше строк, чем указано в limit 
# Тогда необходимо сделать несколько запросов для получения всего отчета.
# Чтоб сделать это автоматически вы можете указать 
# параметр receive_all_data=True при инициализации класса.

#Параметры запроса для библиотеки tapi_yandex_metrika
api = YandexMetrikaStats(
    access_token=ACCESS_TOKEN, 
    # Если True, будет скачивать все части отчета. По умолчанию False.
    receive_all_data=True
)

#Параметры запроса для библиотеки tapi_yandex_metrika
params = dict(
    ids = METRIC_IDS,
    metrics = "ym:s:users,ym:s:visits,ym:s:pageviews,ym:s:bounceRate,ym:s:pageDepth,ym:s:avgVisitDurationSeconds",
    dimensions = "ym:s:date,ym:s:<attribution>TrafficSource,ym:s:<attribution>SourceEngine,ym:s:gender",
    date1 = "2daysAgo",
    date2 = "yesterday",
    sort = "ym:s:date",
    accuracy="full",
    limit = 200
)
#Получаем данные из Yandex.Metrika API
result = api.stats().get(params=params)
result = result().data
result = result[0]['data']

#Создаем пустой dict (словать данных)
dict_data = {}

#Парсим исходный list формата Json в dictionary (словарь данных)
for i in range(0, len(result)-1):
    dict_data[i] = {
            'date':result[i]["dimensions"][0]["name"],
            'traffic-source':result[i]["dimensions"][1]["name"],
            'traffic-details':result[i]["dimensions"][2]["name"],
            'users':result[i]["metrics"][0],
            'visits':result[i]["metrics"][1],
            'pageviews':result[i]["metrics"][2],
            'bounceRate':result[i]["metrics"][3],
            'pageDepth':result[i]["metrics"][4],
            'avgVisitDurationSeconds':result[i]["metrics"][5]
          }

#Создаем DataFrame из dict (словаря данных или массива данных)
dict_keys = dict_data[0].keys()
df = pd.DataFrame.from_dict(dict_data, orient='index',columns=dict_keys)

#Выгрузка данных из DataFrame в Excel
df.to_excel("Трафик.xlsx",
        sheet_name='data',
        index=False)

Получается вот такого вида Excel (некоторые значения удалил):

Пример выгрузки данных из API Яндекс Метрики с помощью библиотеки Requests

Пусть у нас будет файл params.json

{"ACCESS_TOKEN": "AOUHOHOI89h9uohaAAZB-rXh-t-olkj98yhIII",
"METRIC_IDS": {
    "site1.ru":"2342315",
    "site2.ru":"136443462",
    "site3.ru":"46465917"},
"PATH": "D:\PythonETL\Data\0_Raw_Data\YandexMetrika\"}

Далее рассмотрим пример выгрузки данных по трафику по дням за последний год — файл 1_Трафик.py

# Импортируем библиотеку requests 
import requests
import json
import pandas as pd
import sys 
from datetime import datetime
from dateutil.relativedelta import relativedelta

# Загружаем параметры из json
config_variables = json.load(open('params.json'))

# Устанавливаем переменные
locals().update(config_variables)

# Вычисляем дату начала и дату окончания
DayStart = datetime.today() + relativedelta(years=-1)
DayStart = DayStart.strftime('%Y-%m-%d')
DayEnd = datetime.today().strftime('%Y-%m-%d')

# Адрес api метода для запроса get 
url_param = "https://api-metrika.yandex.net/stat/v1/data"

def get_data_to_excel(api_param,header_params,file_name):
        # Отправляем get request (запрос GET)
        response = requests.get(
            url_param,
            params=api_param,
            headers=header_params
        )

        # Преобразуем response с помощью json()
        result = response.json()
        result = result['data']

        # Создаем пустой dict (словать данных)
        dict_data = {}

        # Парсим исходный list формата Json в dictionary (словарь данных)
        for i in range(0, len(result)-1):
                dict_data[i] = {
                                'date':result[i]["dimensions"][0]["name"],
                                'traffic-source':result[i]["dimensions"][1]["name"],
                                'traffic-details':result[i]["dimensions"][2]["name"],
                                'users':result[i]["metrics"][0],
                                'visits':result[i]["metrics"][1],
                                'pageviews':result[i]["metrics"][2],
                                'bounceRate':result[i]["metrics"][3],
                                'pageDepth':result[i]["metrics"][4],
                                'avgVisitDurationSeconds':result[i]["metrics"][5]
                          }

        #Создаем DataFrame из dict (словаря данных или массива данных)
        dict_keys = dict_data[0].keys()
        df = pd.DataFrame.from_dict(dict_data, orient='index',columns=dict_keys)

        #Выгрузка данных из DataFrame в Excel
        df.to_excel(file_name,sheet_name='data',index=False)

for (site_name,metric_id) in METRIC_IDS.items():
        print("site_name: " + site_name)
        
        # Задаем параметры для API
        api_param = {
            "ids":metric_id,
            "metrics":"ym:s:users,ym:s:visits,ym:s:pageviews,ym:s:bounceRate,ym:s:pageDepth,ym:s:avgVisitDurationSeconds",
            "dimensions":"ym:s:date,ym:s:<attribution>TrafficSource,ym:s:<attribution>SourceEngine",
            "date1":DayStart,
            "date2":DayEnd,
            "sort":"ym:s:date",
            "accuracy":"full",
            "limit":100000
            }

        # Задаем параметры header_params
        header_params = {
            'GET': '/management/v1/counters HTTP/1.1',
            'Host': 'api-metrika.yandex.net',
            'Authorization': 'OAuth ' + ACCESS_TOKEN,
            'Content-Type': 'application/x-yametrika+json'
            }

        # Название файла Excel
        file_name = PATH + metric_id +"_Трафик.xlsx"

        # Вызываем функцию
        get_data_to_excel(api_param,header_params,file_name)

И для запуска из-под Windows создаем батник — 0_Run_All_Scripts.cmd. В этот файл друг за дружкой можно вписать несколько скриптов и затем cmd файл внести в Windows Sheduler для выгрузки по расписанию.

chcp 1251
"C:\Users\User\AppData\Local\Programs\Python\Python37-32\python.exe" "D:\PythonETL\Scripts
chcp 1251
"C:\Users\User\AppData\Local\Programs\Python\Python37-32\python.exe" "D:\PythonETL\Scripts\0_Extract\YandexMetrika\1_Трафик.py"
_Extract\YandexMetrika_Трафик.py"
5 4 голоса
Рейтинг статьи
Шамаев Иван

от Шамаев Иван

Разработчик аналитических решений QlikView/Qlik Sense/Power BI; Python Data Scientist; Разработчик интеграционных решений на PHP, Python, JavaScript.

Подписаться
Уведомить о
guest
7 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Артём
Артём
8 месяцев назад

выгрузить получилось, а как дальше работать с полученными данными, не подскажите?

Николай
Николай
5 месяцев назад
Ответить на  Шамаев Иван

Добрый день.
Подскажите пожалуйста информацию по полной выгрузке данных.
Например, у меня в запросе 2900000 строк. Python их вроде бы выгружает (загрузка идет). Но в том же excel у меня выгружаются 100 строк. Прописывал receive_all_data=True, что с ним, что без него — все равно выгрузки идут с какими то лимитами.

Евгений
5 месяцев назад

Здравтвуйте! Спасибо за данную информацию. Сам никак не мог разобраться как выгрузить данные из Яндекс Метрики с закрытого счетчика.

Уточните, пожалуйста, а как файл записатьв то место, которое мне нужно?

7
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x
Открыть диалог
Нужна помощь?