Получаем данные из «Яндекс.Метрики» в электронные таблицы и BI: пошаговая инструкция

Стандартный интерфейс «Яндекс.Метрики» позволяет анализировать данные о посетителях сайта и их поведении достаточно подробно. Тем не менее, для решения задач глубокой аналитики (про это я рассказывал здесь) стандартного функционала может оказаться недостаточно. 

К тому же многим аналитикам привычнее и зачастую нужнее проводить аналитику в электронных таблицах (Excel, Google Sheet) или BI. Да, можно выгружать отчеты из «Метрики» сначала в Excel-файлы. Но на таком полуручном режиме оперативной и эффективной аналитики особо не построишь.

Меня зовут Андрей Устьянцев, я ведущий аналитик направления Big Data в Лиге Цифровой Экономики. В этой статье я пошагово распишу, как получать данные из «Яндекс.Метрики» в электронные таблицы (Excel, Google Sheet) и BI в автоматическом режиме. 

Дисклеймер

Если используемый вами BI-инструмент позволяет писать пользовательские скрипты на Python для извлечения данных (например, PowerBI), смело используйте эту возможность и примеры кода, описанные в статье. Ну, и дальше можно не читать.

Если говорить про электронные таблицы (Excel, Google Sheet), то на момент написания этого материала готового интерфейса для подключения к «Яндекс.Метрике» не было, как и возможности исполнять код на Python внутри электронных таблиц для извлечения или вставки данных из «произвольных» источников.

А если для вас актуально получение данных из «Метрики» — читайте дальше. Поделюсь своим подходом, как я загружаю данные из «Яндекс.Метрики» в электронные таблицы и BI для глубокой Web-аналитики в своих проектах.

Создаем сервис доступа к данным «Яндекс.Метрики»

1. Создаем на виртуальном хостинге сайт на Python

Совет: не обязательно покупать свой собственный домен с «красивым» именем! Есть хостинг-провайдеры, которые предоставляют технические домены третьего уровня при аренде виртуального хостинга. 

Для решения текущей задачи не обязательно иметь «красивый» домен второго уровня (типа «аналитика.рф»), вполне подойдет и домен с именем вида “analitika.techdomen.ru”).

2. В качестве кода основного приложения сайта воспользуемся скриптом на Python для получения данных об источниках трафика на сайт по дням (код подробно описан здесь).

Рассмотрим подробнее код приложения сайта.

import requests  def application(env, start_response):     try:         API_URL = 'https://api-metrika.yandex.ru/stat/v1/data/bytime.csv'         API_token = 'y0_AgAAAAACO_AIAAk7QAUm2oFFORLi5yKWs6_H8gQAYmrU'         params = {                    'date1': '6daysAgo',         'date2': 'today',         'id': 779344,         'metrics': 'ym:s:visits,ym:s:users',         'dimensions': 'ym:s:TrafficSource',         'group' : 'day',         'filters' : "ym:s:isRobot=='No'",         'limit': 100         }                  r = requests.get(API_URL, params = params, headers={'Authorization':API_token})                  content=r.text                  start_response('200 OK', [('Content-Type','text/html')])         return [content.encode('utf-8')]     except Exception as S:         content=str(S)                  start_response('200 OK', [('Content-Type','text/html')])         return [content.encode('utf-8')]

Строка 1 — подключаем библиотеку requests (если она не установлена, запускаем на виртуальном хостинге терминал и выполняем команду pip install requests).

Строка 3 — основная функция, которая исполняется при открытии сайта. Исполняемый код на Python необходимо размещать в теле этой функции. Уточню, что хостинг-провайдер, которым я пользуюсь, при создании сайта на Python сразу создает типовой файл-приложения с «базовым» Python-кодом, так что мне остается только внести свой код в функцию application.

Строки 5-19 — получаем данные из «Яндекс.Метрики» (подробно этот код разобран в статье).

Строка 21 — преобразуем полученный ответ от «Яндекс.Метрики» в строковый формат.

Строка 23 — сообщаем Web-серверу:

‘200 OK’ означает код ответа «200» (общепринятый код успешности исполнения запроса);

‘Content-Type’,’text/html’ означает, что возвращаемые данные — это текст.

Строка 24 — вернуть полученные от «Метрики» данные в виде текста.

Строки 25-29 — обработка ошибок, которые могут возникнуть при исполнении кода. При ошибке будет возвращен собственно текст возникшей ошибки. 

Убедимся, что все работает корректно. Перейдем в браузер и введем в адресной строке адрес нашего сайта:

Вуаля — отображаются данные, полученные из «Яндекс.Метрики». 

Загружаем данные «Яндекс.Метрики» в Excel

Если у вас Excel версии 2010, 2013

Сначала нужно дополнительно установить компонент PowerQuery.

На момент написания материала скачать и установить его можно было по ссылке с официального сайта.

После этого в Excel:

1. Выбираем вкладку «PowerQuery».

2. Затем — «Из Интернета».

3. Вводим адрес нашего сайта.

4. Жмем кнопку «Ок».

Если в правой части окна в предпросмотре у вас не отобразятся данные, а будет картинка по примеру как ниже, без паники!

Нажмите кнопку «Отмена», затем снова нажмите в панели инструментов кнопку «Из Интернета» и в адресной строке добавьте к адресу вашего сайта через слэш любой набор символов, обязательно заканчивающихся «.csv».

Примечание: внешне это выглядит как обращение не к всему сайту, а к конкретной странице (хотя мы еe и не создавали). Ниже поясню, как с этим быть.

В следующем окне в области предпросмотра должны отобразиться данные сразу в виде таблицы.

5. Нажмите кнопку «Загрузить». 

Готово — данные из «Яндекс.Метрики» загружены в Excel.

Дальше — «обычная» работа с данными из внешних источников в Excel: преобразовывайте полученные данные в PowerQuery, стройте сводные таблицы, диаграммы, настраивайте дополнительные вычислительные показатели — полная свобода аналитического творчества.

Если у вас Excel версии 2016 и выше

Ничего специально доустанавливать не надо — PowerQuery уже включен в состав Excel. Разница лишь в интерфейсе панели инструментов.

Действовать дальше нужно так:

1. Открываем вкладку «Данные».

2. Жмем кнопку «Из интернета».

3. Вводим адрес сайта с «.csv».

Загружаем в BI-систему на примере PowerBI Desktop

В панели инструментов выбираем «Получить данные» (1 на скриншоте ниже), затем — «Интернет» (2 на скриншоте).

В появившемся окне также вводим адрес вашего сайта. Дальнейшие действия аналогичны тем, которые нужно выполнять при загрузке данных в Excel.

Загружаем в GoogleSheet

Используем функцию importdata(). Первый параметр — адрес нашего сайта или страницы (в кавычках), второй — разделитель столбцов (у нас это запятая).

Усовершенствуем сервис доступа к данным

Получаем разные данные из «Яндекс.Метрики» 

Допишем код приложения сайта, чтобы можно было получать различные данные из «Метрики».

Определимся для себя, что при обращении к нашему сайту, например, к странице с именем «daily.csv» по URL-адресу вида «https://analitika.techdomen.ru/daily.csv» должны возвращаться данные об источниках трафика на сайт в динамике, как сейчас. 

А при обращении к странице «prolist.csv» по URL-адресу вида «https://analitika.techdomen.ru/prolist.csv» должны возвращаться сводные данные для глубокой аналитики лендинга (технология, описанная в этой статье).

Рассмотрим код подробнее.

import requests  API_token = 'y0_AgAAAAACO_AIAAk7FQAAAADd2oFFORLi5yKWs6_H8gQAYmrU'  def daily():     API_URL = 'https://api-metrika.yandex.ru/stat/v1/data/bytime.csv'          params = {            'date1': '6daysAgo',     'date2': 'today',     'id': 77344,     'metrics': 'ym:s:visits,ym:s:users',     'dimensions': 'ym:s:TrafficSource',     'group' : 'day',     'filters' : "ym:s:isRobot=='No'",     'limit': 1000     }          r = requests.get(API_URL, params = params, headers={'Authorization':API_token})          t = r.text          t.encode('utf-8')           return t  def prolist():          API_URL = 'https://api-metrika.yandex.ru/stat/v1/data.csv'     params = {             'date1': '2023-02-01',             'date2': '2023-04-04',             'id': 77944,             'metrics': 'ym:s:visits,ym:s:users',             'dimensions': 'ym:s:goal,ym:s:<attribution>TrafficSource,ym:s:<attribution>SourceEngine,ym:s:from,ym:s:deviceCategory',             'filters' : "ym:s:isRobot=='No'",             'limit': 1000     }          r = requests.get(API_URL, params = params, headers={'Authorization':API_token})      t = r.text          t.encode('utf-8')           return t  def application(env, start_response):     try:         if env['PATH_INFO'] == '/daily.csv':             content=daily()         elif env['PATH_INFO'] == '/prolist.csv':             content=prolist()         else:             raise ValueError('Вызов неизвестного URL')                  start_response('200 OK', [('Content-Type','text/html')])         return [content.encode('utf-8')]     except Exception as S:         content=str(S)                  start_response('200 OK', [('Content-Type','text/html')])         return [content.encode('utf-8')]

Строка 3 — сохраним API-ключ для обращения к «Яндекс.Метрике» в переменную.

Строки 5-26 — функция daily(), которая будет возвращать данные «Метрики» об источниках трафика на сайт в динамике.

Строки 28-47 — функция prolist(), которая будет возвращать данные «Яндекс.Метрики» о достижении целей для формирования воронки пролиста лендинга или сайта.

Отмечу, что в строках 32 и 33 для примера указано, что необходимы данные за период с 01.02.2023 по 04.04.2023, но вы можете исправить на относительные даты. Кроме того, в строке 36 можно добавить дополнительные группировки, например UTM-метки. Подробнее о том, как сформировать запрос к API «Яндекс.Метрики», смотрите в материале

Строка 49 — рассмотрим, что изменилось в коде приложения сайта (в функции application).

В качестве параметра эта функция принимает «env» — строка, точнее словарь, содержащая значения переменных окружения Web-сервера и параметры, с которыми произошло обращение к нашему сайту.

Строки 51-54 — анализируем значения в переменной окружения “PATH_INFO”, которая содержит имя страницы, к которой произошло обращение:

Строки 51-52 — если обращение к странице «daily.csv» — вызвать функцию daily() и вернуть результат этой функции (то есть данные «Яндекс.Метрики» об источниках трафика на сайт в динамике). 

Строки 53-54 — если обращение к странице «prolist.csv» — вызвать функцию prolist() и вернуть данные о достижении целей «Яндекс.Метрики».

Логика, думаю, понятна. Таким образом можно писать пользовательские функции для извлечения нужных данных из «Метрики» и связывать их с именами страниц по аналогии.

Строки 54-56 — я называю «заглушкой» — это обработка ситуации, если кто-то обратится к странице вашего сайта, для которой нет «связанной» функции.

Важно! Теперь для получения данных в электронную таблицу или BI-систему необходимо обращаться не просто к сайту по адресу вида «https://analitika.techdomen.ru», а обязательно указывать страницу!

Так, для получения данных о достижениях целей «Яндекс.Метрики» в качестве URL-адреса источника данных необходимо будет обязательно указать адрес вида «https://analitika.techdomen.ru/prolist.csv».

Должны появиться выглядящие следующим образом данные:

Сделаем код более универсальным 

Это нужно, чтобы получать данные из любого счетчика «Яндекс.Метрики» за любой период времени, не меняя код приложения сайта на Python.

Важно! Речь идет о получении доступа о посетителях сайтов только из счетчиков «Метрики», к которым у вас есть доступ и к которым открыт публичный доступ к статистике. 

В рассматриваемых примерах кода зафиксированы («прибиты гвоздями») номер счетчика «Яндекс.Метрики» (id) и диапазон дат, за который извлекаются данные (date1, date2). 

Усовершенствуем код — сделаем так, чтобы номер счетчика и диапазон дат передавались в виде параметров при обращении к сайту. Для получения данных надо будет указывать URL-адрес в виде «https://analitika.techdomen.ru/daily.csv?ids=XXXXXX&date_from=YYYYYY&date_to=ZZZZZZ», где:

“ids”, “date_from” и “date_to” — обозначения параметров;

“ХХХХ” — номер счетчика «Яндекс.Метрики»;

“YYYYYY” — дата, начиная с которой необходимо получить данные;

“ZZZZZZ” — дата, до которой необходимо выгрузить данные.

Обе даты необходимо передавать в виде точной даты (например, «2023-07-20» соответствует 20.07.2023) или обозначениями, «понятными» «Метрике». Например, «today» соответствует текущей дате, «6daysAgo» — 6 дней назад, считая от текущей даты. Подробно об обозначениях дат или периодов времени можете почитать здесь.

Допишем код.

import requests from urllib.parse import parse_qsl  API_token = 'y0_AgAAAAACO_AIk7FQAAAADd0kEPGUm2oFFOWs6_H8gQAYmrU'  def daily(ids_p,date_from_p,date_to_p):     API_URL = 'https://api-metrika.yandex.ru/stat/v1/data/bytime.csv'          params = {            'date1': date_from_p,     'date2': date_to_p,     'id': ids_p,     'metrics': 'ym:s:visits,ym:s:users',     'dimensions': 'ym:s:TrafficSource',     'group' : 'day',     'filters' : "ym:s:isRobot=='No'",     'limit': 1000     }          r = requests.get(API_URL, params = params, headers={'Authorization':API_token})          t = r.text          t.encode('utf-8')           return t  def prolist(ids_p,date_from_p,date_to_p):          API_URL = 'https://api-metrika.yandex.ru/stat/v1/data.csv'     params = {             'date1': date_from_p,             'date2': date_to_p,             'id': ids_p,             'metrics': 'ym:s:visits,ym:s:users',             'dimensions': 'ym:s:goal,ym:s:<attribution>TrafficSource,ym:s:<attribution>SourceEngine,ym:s:from,ym:s:deviceCategory',             'filters' : "ym:s:isRobot=='No'",             'limit': 1000     }          r = requests.get(API_URL, params = params, headers={'Authorization':API_token})      t = r.text          t.encode('utf-8')           return t  def application(env, start_response):     try:         ids=-1         date_from=''         date_to=''                  query_string=env['QUERY_STRING']                  x=parse_qsl(query_string,encoding='utf-8')                  for y in x:             if y[0] == 'ids': ids=y[1]             if y[0] == 'date_from': date_from=y[1]             if y[0] == 'date_to': date_to=y[1]                  if ids == -1: ids=77963         if date_from == '': date_from='6daysAgo'         if date_to == '': date_to='today'                  if env['PATH_INFO'] == '/daily.csv':             content=daily(ids,date_from,date_to)         elif env['PATH_INFO'] == '/prolist.csv':             content=prolist(ids,date_from,date_to)         else:             raise ValueError('Вызов неизвестного URL')                  start_response('200 OK', [('Content-Type','text/html')])         return [content.encode('utf-8')]     except Exception as S:         content=str(S)                  start_response('200 OK', [('Content-Type','text/html')])         return [content.encode('utf-8')]

Строка 2 — подключаем библиотеку parse_qsl для быстрой работы с параметрами, передаваемыми через URL-строку. Если она не установлена, запускаем на виртуальном хостинге терминал и выполняем команду pip install parse.

Строки 6 и 29 — укажем три параметра для каждой функции:

ids_p — номер счетчика «Яндекс.Метрики»;

date_from_p — дата, начиная с которой необходимо получить данные;

date_to_p — дата, до которой необходимо выгрузить данные.

В строках 11-13 и 33-35 вместо ранее фиксированных значений укажем соответствующие параметры функции.

В строках 52-54 создадим переменные, которым присвоим значения по-умолчанию (ниже прокомментирую, зачем).

Строка 56 — получаем строку параметров URL, полученную при обращении к нашему сайту.

Строка 58 — превратим строку параметров в словарь.

Строки 60-63 — перебираем в цикле все полученные параметры URL-строки и извлекаем:

ids — номер счетчика «Метрики»;

date_from — дата, начиная с которой необходимо получить данные;

date_to — дата, до которой необходимо выгрузить данные.

Строка 65 — проверяем, был ли передан номер счетчика в строке с параметрами. По сути это логический контроль. В приведенном примере кода, если в строке параметров не передан ids, считаем, что необходимы данные из счетчика с номером 77963. Это дополнительная полезность, позволяющая не указывать номер счетчика в URL-строке, если нужны данные всегда по одному и тому же счетчику. 

Но вы можете дописать код: например, если в URL-строке нет параметра ids — «завершать код с ошибкой».

Строки 66-67 — аналогично проверяется, переданы ли параметры с какой по какую дату извлекать данные, и если не переданы — присваивать значения по умолчанию.

Таким образом можно получать данные, обращаясь по адресу вида https://site.techdomen.ru/daily.csv без всяких параметров — будут возвращаться данные счетчика 77963 за период «6 дней назад, считая от текущей даты, до текущей даты».

А можно с указанием параметров, например:

https://site.techdomen.ru/daily.csv?ids=8766&date_from=2023-01-01&date_to=2023-07-01

В таком случае будут возвращены данные счетчика 8766 за период с 01.01.2023 по 01.07.2023.

Полезные дополнения

В чем полезность такого подхода (создание сервиса доступа к данным в виде сайта на Python на виртуальном хостинге)

1. Вы практически не ограничены в возможностях предварительной обработки данных.

Получив по API данные «Яндекс.Метрики», вы можете предобработать их средствами Python любым нужным вам способом.

2. Имея единый источник данных, вы можете анализировать и визуализировать данные из «Яндекс.Метрики» в любой электронной таблице или BI-инструменте.

3. Вы можете делиться своими данными «Метрики», просто передавая ссылку на URL коллегам. При этом вы можете работать одновременно с одними и теми же данными.

4. Можно дописать Python-код и настроить cron на Web-сервере для онлайн-мониторинга и уведомления о значимых событиях на сайте (например, в Telegram-бот). 

В чем недостатки

1. Понадобится компетенция «как создать сайт на Python на виртуальном хостинге». 

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

Да и сама эта компетенция весьма полезна.

2. Виртуальный хостинг стоит денег.

На момент написания материала я для своих задач арендую виртуальный хостинг по цене 175 рублей в месяц, при этом не ограничен в количестве создаваемых сайтов на технических доменах.

175 рублей — это много или мало? Все, конечно, относительно… Для меня качественная и оперативная аналитика важнее.

_____________________________

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


ссылка на оригинал статьи https://habr.com/ru/companies/digitalleague/articles/751504/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *