Как стать автором
Обновить
15.46

Как извлечь больше данных о посетителях сайта через «Яндекс.Метрику» при помощи Python и с минимумом библиотек

Время на прочтение8 мин
Количество просмотров13K

Введение

Меня зовут Андрей Устьянцев, я ведущий аналитик направления Big Data в Лиге Цифровой Экономики. Эту статью я задумал как вторую в цикле материалов (первую об улучшении лендинга на основе метрик вы можете прочитать здесь). Сам текст будет полезен аналитикам, которым необходим более глубокий анализ данных о посетителях сайта, чем предоставляет стандартный интерфейс «Яндекс.Метрики». Или тем, кто хочет объединить данные из «Метрики» с другими источниками (например, из CRM) для визуализации, поиска инсайтов, проверки продуктовых гипотез etc.

Мини-оглавление

  1. Получение OAuth-токена

  2. Python-код

Если у вас уже есть OAuth-токен, можете сразу переходить к разделу 2.

Получение OAuth-токена

Переходим в «Яндекс.Метрику».

Важно: 

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

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

Нажимаем на API в верхнем меню.

Выбираем «Получить OAuth-токен».

  1. В поле «Название вашего сервиса» вводите удобное и понятное вам название (по нему потом можно будет найти токен в общем списке).

  2. Ставите галочку напротив «Веб-сервисы».

  3. Переходите в поле Redirect URL и в появляющейся подсказке выбираете вариант «Подставить URL для отладки».

1. В разделе «Доступ к данным» в поле ввода начинаете вводить слово «Метрика».

2. Выбираете из выпадающего списка вариант «Получение статистики, чтение параметров своих и доверенных источников».

  1. В поле «Почта для связи» рекомендую указать свой реальный электронный ящик. На него будут приходить информационные сообщения от «Яндекс.Метрики». 

  2. После следует нажать на кнопку «Создать приложение».

Должна появиться вот такая картинка:

  1. Обратите внимание на «Время жизни токена», то есть срок его действия. Через год с момента создания вы не сможете получать данные из «Яндекс.Метрики» по API с использованием этого токена — необходимо будет или его актуализировать, или создать новый.

На момент написания материала токены создавались сроком действия 1 год, но все может измениться. Отчасти и по этой причине я рекомендовал выше указывать контактный адрес электронной почты (не исключено, что сервисы «Яндекса» заранее предупредят вас по почте о приближении срока окончания действия токена).

  1. Откройте «Блокнот» или любой другой текстовый редактор и скопируйте туда ClientID.

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

В списке приложений кликаем на только что созданное вами приложение (1 на картинке ниже) и получаем экран с нужной нам информацией:

Примечание: список ранее созданных вами приложений всегда можно найти в разделе «Мои приложения» (2 на картинке выше)

Далее в текстовом редакторе надо сформировать URL-строку такого вида:

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

Замените символы «ХХХХХ» на ClientID, который вы скопировали на предыдущем шаге.

Должен получиться URL-адрес следующего вида:

https://oauth.yandex.ru/authorize?response_type=token&client_id=36d5c6d7fa432fa5f81e726bb3fa

Полученный URL-адрес вставляете в адресную строку браузера в новой вкладке и переходите по этой ссылке. 

На появившемся экране следует нажать кнопку «Войти как».

Должна появиться такая картинка. Практически по центру экрана будет нужный нам OAuth-токен (далее по тексту буду использовать более привычный термин «API-ключ»).

Важно! Может отобразиться пустая страница без OAuth-токена. Без паники! Нажмите на клавиатуре Ctrl+U (или иным способом перейдите в режим просмотра кода страницы) и найдите поиском (обычно это комбинация клавиш Ctrl+F) символы «access_token».

Скопируйте себе в отдельный файл все символы, начиная с «=» до ближайшего значка «&» — это и будет ваш API-ключ.

Важно! Без необходимости никому не передавайте API-ключ — он позволяет получать доступ к статистике всех доступных вам счетчиков «Яндекс.Метрики».

Пишем Python-код для получения данных из «Яндекс.Метрики»

Для получения данных из «Яндекс.Метрики» по API нам понадобится только библиотека requests. Обычно она есть в стандартном пакете с Python, но если у вас ее нет, установите - pip install requests.

Получение сводных данных 

Получим из «Яндекс.Метрики» сводные данные об источниках посетителей сайта за последние 7 дней.

import requests

API_URL = 'https://api-metrika.yandex.ru/stat/v1/data.csv'
API_token = 'y0_AgCO_AIAAn8ZwAAAADkWiTPkxy-d9aXTJElsmFx2XC840'
params = {
  
'date1': '6daysAgo',
'date2': 'today',
'id': 77963344,
'metrics': 'ym:s:visits,ym:s:users',
'dimensions': 'ym:s:TrafficSource',
'limit': 100
}
r = requests.get(API_URL, params = params, headers={'Authorization':API_token})

Рассмотрим код детально.

  • Строка 3 — адрес API «Яндекс.Метрики», который возвращает данные в табличном виде.

  • Строка 4 — API-ключ, который мы получили на предыдущем шаге.

  • Строки 6-12 — параметры запроса. Далее рассмотрим подробнее.

  • Строки 7 и 8 — диапазон дат, за которые необходимы данные: «date1» — дата «от», «date2» — дата «до».

В приведенном примере указаны следующие значения:

  • «today» — служебное значение, понимается «Яндекс.Метрикой» как текущая дата. 

  • «6daysAgo» — служебное значение, обозначающее «6 дней назад от текущей даты».

На самом деле это значения параметров «date1» и «date2» по умолчанию. То есть если вы не укажете их значения в переменной «params», «Яндекс.Метрика» вернет данные за последние 7 дней (включая текущую дату). 

Кроме того, вы можете использовать обозначения:

  • «yesterday» — служебное обозначение даты «вчера».

  • «NdaysAgo» — N дней назад, считая от текущей даты (N — обязательно число).

Помимо этого, можно указать конкретные даты в формате «YYYY-MM-DD»:

  • «YYYY» — 4 символа, год (важно прописать полностью).

  • «MM» — 2 символа, номер месяца (настоятельно рекомендую не пропускать «0» в месяцах с одним числом)

  • «DD» –- 2 символа, день.

То есть данные за 01.06.2023 необходимо в параметрах указать как «2023-06-01».

  • Строка 9 — номер счетчика «Яндекс.Метрики», из которого необходимо получить данные. 

Совет: номер нужного счетчика можно посмотреть через браузер в списке доступных вам счетчиков по этому адресу.

  • Строка 10 — обязательный параметр «metrics», метрики — числовые значения, которые необходимо получить.

  • «ym:s:visits» — обозначает количество визитов («визиты» — в терминах «Яндекс.Метрики»).

  • «ym:s:users» — «количество уникальных посетителей».

Вы можете использовать до 20 метрик в запросе.

  • Строка 11 — обязательный параметр «dimensions» — группировки.

В приведенном примере я выбрал только одну группировку — «ym:s:TrafficSource». Это означает «источники трафика», но вы можете указать через запятую до 10 группировок в запросе.

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

Совет: как я не путаюсь, где метрики, а где группировки? Переформулируем задачу тестового примера: «получить количество (это «метрики») посетителей сайта в разрезе (это «группировки») источников трафика».

  • Строка 12 — указывает, что количество возвращаемых строк должно быть не более 100. 

Если вы не передадите в параметрах значение «limit», «Яндекс.Метрика» вернет не более 100 строк. Но я лично рекомендую принудительно указывать это значение, нежели потом недополучить данные и тратить время на поиск причин (или, что хуже, сделать неверные выводы из неполных данных).

Максимальное значение этого параметра — 100 000. Если в вашей задаче предполагается большее количество данных, дополнительно используйте параметр «offset» (порядковый номер выборки с шагом «limit»).

  • Строка 15 — вызов API «Яндекс.Метрики» для получения данных.

В случае успешного обращения r.text будет содержать следующую строку, по сути — данные в формате CSV:

Примечание: если вам привычнее или необходимо работать с данными в формате JSON, отредактируйте строку 3 кода: уберите символы «.csv» - вызывайте API по следующему адресу:

https://api-metrika.yandex.ru/stat/v1/data 

В случае ошибки выполнения запроса в тексте ответа будет достаточно подробная информация о ее причине. Для примера: в параметре «date1» вместо «6daysAgo» я написал «NaysAgo». Текст ошибки, в общем-то, позволяет понять, что не так.

Теперь важный момент! Когда вы смотрите данные на сайте «Яндекс.Метрики», во всех отчетах отображаются данные без учета статистик, которые формируются при посещении сайта поисковыми и иными техническими роботами.

А данные, возвращаемые API «Яндекс.Метрики», по умолчанию содержат всю информацию, в том числе с учетом «роботов». Разница может быть достаточно ощутимой — вот пример одного из реальных счетчиков.

Лично я затрудняюсь ответить на вопрос, в какой истории может понадобиться детальная аналитика по роботам, поэтому настоятельно рекомендую во всех запросах к API «Яндекс.Метрики» в параметре «filters» в явном виде указывать, что необходимы данные без учета роботов:

'filters' : "ym:s:isRobot=='No'"

Ниже приведен полный код. В строке 12 добавлена строка с фильтрацией данных «без роботов».

import requests

API_URL = 'https://api-metrika.yandex.ru/stat/v1/data.csv'
API_token = 'y0_AgAAAIAAn8ZwAAAADkWiTPkxy-d9aXTRyE7SJEx2XC840'
params = {
  
'date1': '6daysAgo',
'date2': 'today',
'id': 77963344,
'metrics': 'ym:s:visits,ym:s:users',
'dimensions': 'ym:s:TrafficSource',
'filters' : "ym:s:isRobot=='No'",
'limit': 100
}
r = requests.get(API_URL, params = params, headers={'Authorization':API_token})

К слову о фильтрации. В параметре «filters» можно указать и другие ограничения на выборки, причем сложные (с использованием логических операторов «И», «ИЛИ», «НЕ»). Полная документация по синтаксису фильтров — тут.

Приведенный пример получения данных достаточно простой. Полная официальная документация по API-методу «data» — здесь.

Получение данных в динамике по датам

Итак, мы разобрались, как получать сводные данные за определенный период. А если необходимы данные в динамике по дням?

Для этого следует обращаться к API «Яндекс.Метрики» по адресу:

https://api-metrika.yandex.ru/stat/v1/data/bytime

Вот пример кода. Рассмотрим только отличия от предыдущего.

import requests

API_URL = 'https://api-metrika.yandex.ru/stat/v1/data/bytime.csv'
API_token = 'y0_AgAAAAACO_AIAAn8ZwADkWiTPkxy-d9aXTRyEsmFx2XC840'
params = {
  
'date1': '6daysAgo',
'date2': 'today',
'id': 77963344,
'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})
  • Строка 3 — обращаемся к методу bytime.csv («.csv» — указание на то, что данные нам необходимы в табличном виде. Если вызывать метод bytime без «.csv», данные будут возвращены в формате JSON.)

  • Строка 12 — в параметры запроса добавили 'group' : 'day’ — указание на то, что данные необходимо сгруппировать по дням. Можно также группировать по часам, минутам, неделям, месяцам и проч. (Полный перечень возможных группировок и их обозначений смотрите в официальной документации «Яндекс.Метрики» по методу bytime).

Результат работы кода:

По сути мы получили сводную таблицу, в которой по столбцам указаны все значения из группировки «ym:s:TrafficSource» (источники трафика), в строках — значения за указанный диапазон дат.

Ограничения использования API-сервисов «Яндекс.Метрики»

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

Есть и другие важные ограничения (на момент написания материала):

  1. Максимальное количество запросов с одного IP-адреса — не более 30 в секунду.

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

  3. Максимальное количество обращений в сутки к одному счетчику — не более 5 000.

Актуальная информация об ограничениях — тут.

Что еще важно?

Отмечу, что у «Яндекс.Метрики» представлена очень подробная информация по работе с их API. Полная документация размещена по этому адресу.

Обращу внимание кратко на полезные (с моей точки зрения) разделы:

  1. Виды отчетов (возвращаемых данных).

В статье я уделил внимание только сводным данным и в динамике. API «Яндекс.Метрики» может также возвращать данные в виде «Сравнение-таблица», «Drill Down», «Сравнение Drill Down».

Подробно о каждом методе написано в разделе «Виды отчетов» официальной документации.

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

  1. Хорошо расписаны случаи вызова отдельных методов на реальных примерах.

Заключение

Надеюсь, эта статья окажется полезной для вас и вы сможете извлечь еще больше информации из статистики посещения сайта. Смотрите также статью "Получаем данные из «Яндекс.Метрики» в электронные таблицы и BI: пошаговая инструкция".

Подписывайтесь на обновления раздела нашей компании — в ближайшее время я напишу еще несколько материалов: продолжу делиться своим опытом digital-аналитики.

Теги:
Хабы:
Всего голосов 3: ↑3 и ↓0+3
Комментарии1

Публикации

Информация

Сайт
digitalleague.ru
Дата регистрации
Численность
5 001–10 000 человек
Местоположение
Россия