Pull to refresh

В помощь аналитику: пишем свою автоматическую выгрузку отчетов Яндекс.Метрики с помощью AWS бесплатно

Reading time 7 min
Views 20K
В своей практике работы аналитиком мне часто приходится сталкиваться с ситуациями, когда коллеги ежедневно тратят много времени на нудную выгрузку данных для очередной отчетности. Если для Google Analytics и других продуктов Google написано множество плагинов, сервисов и надстроек для Excel, то для Яндекс Метрики и других аналитических систем удалось найти только пару-тройку библиотек 2013 года.

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

В этой и следующих статьях я покажу как с помощью Amazon Web Services просто настраивать автоматическую выгрузку данных. На AWS можно в течение 12 месяцев пользоваться бесплатным аккаунтом, в лимиты которого входит описанный в статье алгоритм. Можно выбрать и любой другой сервис аренды вычислительных мощностей, однако совсем бесплатных я не встречал. К тому же на инстансах AWS уже есть питон с нужными библиотеками.

В качестве примера данных счетчика буду использовать свой сайт. Итогом этой статьи будет небольшой скрипт, который для набора счетчиков выгружает посещения по дням за указанные даты. На основе него уже можно быстро перейти к нужным вам выгрузкам. К недостатку этого метода можно отнести необходимость в первый раз потратить около часа на настройку аккаунта и привыканию к интерфейсу. Но при последующих заходах эту процедуру проходить не надо. Вы просто запустите готовый инстанс и через пару минут получите необходимые данные.

Итак, начнем. Регистрируем аккаунт на Amazon Web Services console.aws.amazon.com и настраиваем доступ к консоли управления. К сожалению после создания аккаунта для полноценного использования AWS нужно подождать сутки, пока будет проверена ваша карта. В рамках этой статьи с нее все равно не будут списываться средства (мы не будем выходить за лимиты бесплатного использования). Процесс регистрации аккаунта хорошо описан в документации AWS (до пункта Getting started) docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-ug.pdf

После успешной верификации карты (на почту придет уведомление о завершении этого процесса) консоль console.aws.amazon.com должна выглядеть так:

image

Заходим в EC2 и в левой панели выбираем Instances. Нажимаем Launch Instance:

image

Нам предложат на выбор самые разные операционные системы. В данном примере выбор операционной системы не так важен. Я привык к Ubuntu (четвертая строчка на скриншоте). Можно выбрать первую строчку Amazon Linux. Отличие от примера будет в том, что по умолчанию на Amazon Linux логин пользователя при заходе на машину ec2-user. Для Ubuntu логин ubuntu:



На следующем шаге выбираем тип виртуалки. Для бесплатного использования выбираем первый вариант t2.micro. Цены на другие варианты можно посмотреть на странице aws.amazon.com/ru/ec2/pricing:



На последнем седьмом шаге проверяем группу безопасности в поле Security Groups (доступ по SSH должен быть разрешен для 22 порта как минимум для вашего IP-адреса) и нажимаем Launch. Переходим обратно к списку инстансов и ждем, пока для нашего запущенного инстанса поле Instance State не станет running (это займет пару минут). Выбираем строчку с нашим инстансом и ищем Public DNS. Копируем Public DNS и заходим на машину. Для Windows проще использовать Putty, для MAC — Terminal. В документации по заведению аккаунта описан это процесс для Windows и MAC. На всякий случай еще раз напомню для Putty. Логин ubuntu, порт 22:



Не забываем в Connection --> SSH --> Auth указать путь к приватному ключу (с расширением *.ppk):



Заходим на машину, на предупреждение Windows «The server's host key is not cached in the registry» нажимаем «Да». Если все прошло успешно, то получаем следующее:



Проверяем все ли в порядке с питоном (по умолчанию на AWS он уже установлен): набираем в консоли «python» и жмем Enter. После входа в консоль питона набираем 1+1 и снова жмем Enter. Для выхода из консоли питона нажмите Ctrl+D:



Последним шагом для выгрузки данных из Яндекс Метрики станет авторизационный токен:

1. Заходим на страницу создания приложений Яндекса oauth.yandex.ru/client/new

2. Называем свое приложение и в поле Права для Яндекс Метрики выбираем «Получение статистики, чтение параметров своих и доверенных счетчиков»:



Список созданных приложений и их ID можно посмотреть на странице зарегистрированных приложений oauth.yandex.ru (в примере приложение названо «Недельный отчет»):



Для получения токена нам понадобится ID. Подставляем это значение в ссылку получения отладочного токена в браузере в последний параметр client_id: oauth.yandex.ru/authorize?response_type=token&client_id=04d488...87aacb

В результате получим авторизационный токен 11daf5...516d, который будем использовать в каждом запросе к Яндекс Метрике:



Мы закончили длительную процедуру подготовки технической части. В следующий раз ее не надо будет проходить. Напишем теперь первый «Hello world» к нашим данным в Яндекс Метрике. Для редактирования скриптов на инстансе можно использовать самые разнообразные подключения и редакторы или просто работать в консоли. В Windows для простых скриптов можно использовать WinSCP (https://winscp.net/eng/docs/lang:ru) и встроенный блокнот.

После подключения к инстансу (аналогично тому как делали через Putty) мы оказываемся в папке /home/ubuntu. Заведем отдельную папку 'yam' (можно с помощью F7) и создадим файл 'test.py' (Shift+F4). Теперь проверим, что все работает, выгрузив данные отчета «Посещаемость» за вчерашний день согласно документации API Яндекс Метрики tech.yandex.ru/metrika/doc/api2/api_v1/intro-docpage:



Импортируем библиотеки 'requests' и 'json' для работы с запросами к API и форматом JSON. В переменной atoken в кавычках указываем полученный ранее авторизационный токен. Копируем этот код в файл 'test.py' и сохраняем:

import requests
import json

atoken = 'insert token here'

r = requests.get('https://api-metrika.yandex.ru/stat/v1/data?&id=21075004&accuracy=full&date1=yesterday&date2=yesterday&metrics=ym:s:visits&oauth_token=' + atoken)

parsed = json.loads(r.text)
print json.dumps(parsed, indent=4, sort_keys=True)

В параметре 'id' строчки r=requests.get(...) необходимо указать номер счетчика, с которого берем данные. Его можно найти в списке счетчиков (https://metrika.yandex.ru/list) рядом с названием. Параметр accuracy соответствует ползунку «Точность» в веб-интерфейсе, date1 и date2 — период выгрузки, metrics — метрики (столбцы). Еще есть измерения (dimensions), они пригодятся позже. В Яндекс Метрике предусмотрены готовые шаблоны, можно подставлять их в строку запроса tech.yandex.ru/metrika/doc/api2/api_v1/presets/preset_traffic-docpage

json.loads преобразует полученный от Яндекс Метрики ответ формата JSON в массив, из которого можно легко выбирать нужные нам элементы (в данном случае количество посещений за вчера). Строчка print json.dumps(...) покажем нам ответ API в более человеческом виде.

Запускаем скрипт: в Putty или терминале набираем 'python test.py'. Успех:



Чтобы выцепить число 489 из этого массива (т. е. в питоне это «словарь») пройдемся по его иерархической структуре сверху вниз:
1. Первым уровнем иерархии идет элемент 'data', он будет первым в обращении: ['data']
2. Потом идет квадратная скобка, значит начинается список. В нашем случае это список из одного элемента, значит ставим [0]
3. Далее идут два элемента 'dimensions' и 'metrics'. Выбираем ['metrics']
3. Наконец, в поле 'metrics' опять лист из одного элемента

Таким образом адресом количества посещений 489.0 за вчера будет ['data'][0]['metrics'][0]. Добавляем в наш скрипт строчку:
print parsed['data'][0]['metrics'][0]

В результате повторного запуска в конце будет выведено количество посещений за вчера.

Ок, 'hello world' это весело. Выгрузим теперь что-нибудь более практичное. Например, посещения по дням за прошлую неделю для списка сайтов и запишем это в файл. Для начала запишем в файл по дням посещения одного сайта за прошлую неделю:

import requests
import json

atoken = ''

r = requests.get('https://api-metrika.yandex.ru/stat/v1/data?&id=21075004&accuracy=full&date1=2015-08-10&date2=2015-08-16&group=day&dimensions=ym:s:date&metrics=ym:s:visits&sort=ym:s:date&oauth_token=' + atoken)

parsed = json.loads(r.text)
print json.dumps(parsed, indent=4, sort_keys=True)

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



Теперь нам надо в цикле пройтись по всем датам и достать количество посещений за каждый день. Из структуры видно, что пройтись надо по листу в parser['data']. Посмотрим что представляет из себя каждый элемент этого листа. Для этого добавим в конец скрипта цикл:
for day in parsed['data']:
    print day


Кто мало знаком с питоном обратите внимание на отступ перед 'print day' (табуляция или несколько пробелов). По этому отступу определяется начало и конец цикла. Запускаем:



Теперь более понятно как вытащить дату и количество визитов. Вместо 'print day' ставим:
print str(day['dimensions'][0]['name']) + '\t' + str(day['metrics'][0])



Добавим возможность выгрузки данных по нескольким проектам и запишем все в файл, заменяя в визитах точку на запятые. Чтобы при экспорте в Excel не пришлось этого делать. В примере в листе listOfSites можно подставлять любое количество счетчиков проектов, здесь стоит два одинаковых просто для примера. Файл 'weekly_data.txt' будет перезаписываться при каждом запуске скрипта:

import requests
import json

listOfSites = ['21075004', '21075004']
f = open('weekly_data.txt', 'w')

atoken = ''

for site in listOfSites:
    r = requests.get('https://api-metrika.yandex.ru/stat/v1/data?&id=' + site + '&accuracy=full&date1=2015-08-10&date2=2015-08-16&group=day&dimensions=ym:s:date&metrics=ym:s:visits&sort=ym:s:date&oauth_token=' + atoken)

parsed = json.loads(r.text)
print json.dumps(parsed, indent=4, sort_keys=True)

for day in parsed['data']:
    print str(day['dimensions'][0]['name']) + '\t' + str(day['metrics'][0])
    f.write(str(day['dimensions'][0]['name']) + '\t' + str(day['metrics'][0]).replace('.', ',') + '\n')

f.close()

Итого после запуска мы должны получить файл 'weekly_data.txt' с посещениями по дням перечисленных в listOfSites сайтов (в нашем примере цифры просто повторяются два раза), которые легко скопировать в эксель. Или любой другой инструмент, в котором вы составляете отчетность:



После завершения работы заходим в консоль управления AWS и на нашем инстансе с помощью правой кнопки мыши выбираем Instance state — Stop. В следующий раз не надо будет проходить долгую процедуру настройки. Просто выбираем Instance state — Start и через пару минут сразу начинаем работу с кодом:



Используя этот нехитрый подход и документацию Яндекс Метрики можно настроить практически любую выгрузку. Надеюсь эта инструкция сэкономит вам много времени и сил при выгрузке данных.
Tags:
Hubs:
+10
Comments 1
Comments Comments 1

Articles