Робимо простенький web-сервіс за допомогою API

Нещодавно Яндекс відкрив для використання API Яндекс.Метрики. У цій статті я розповім, для чого воно потрібно, як ним користуватися і коротко опишу відмінності від API Google Analytics.

Крім того, я покажу, як за допомогою цього API зробити web-сервіс, в якому можна порівняти поточні показники сайту з минулим та подивитися, як згодом змінювалася популярність сторінок:

простенький

Коротко про API Метрики

Вибір орієнтації на звіти, а не показники відповідає концепції Метрики як інструменту для звичайних користувачів, а не професіоналів. Користуватися API Метрики справді в рази простіше.

Проте, поточний підхід має й недоліки. По-перше, можна запитувати у сервісу лише заздалегідь визначені програмістами Яндекса звіти. По-друге, оскільки структуру звітів змінювати не можна, щоразу ви отримуватимете надлишковий обсяг інформації, що може позначитися на часі відгуку сервісу.

Метрика розвивається дуже швидко (за час написання статті навіть встиг трошки помінятися API), тому я впевнений, що вже скоро можна буде так само, як і в GA, формувати звіти тільки для потрібних показників, і проблеми, що описані вище, пропадуть.

Навіщо воно потрібне?

Наприклад, як це зроблено на Хабре (http://habrahabr.ru/info/stats/):

простенький

Головна перевага для програміста

Після роботи з API GA та його громіздким мені хотілося б окремо підкреслити ще один важливий момент: Метрика дозволяє отримувати дані у JSON! На мій погляд, це одна з найважливіших конкурентних переваг перед GA. Всі сучасні мови вміють працювати з JSON із коробки, і таким чином відпадає потреба у будь-яких додаткових бібліотеках. На відміну від Google зМетрикою можна одразу сісти та їхати.

У цьому дуже легко переконатися, відкрийте нову вкладку браузера та перейдіть по наступному URL (ви повинні бути залогінені в Яндексі): http://api-metrika.yandex.ru/counters.json?pretty=1.

Вітаю, ви тільки-но скористалися API метрики. І вам навіть не потрібні додаткові програми, щоб розібрати відповідь сервера.

можна

Робимо власний сервіс на основі API Метрики

Отже, щоб глибше розібратися в API, спробуємо створити інтернет-сервіс, який розширює стандартні можливості Метрики. За замовчуванням у ній немає однієї дуже важливої ​​штуки — порівняння з минулим періодом. Це дуже зручна можливість, завдяки якій аналітика сайту стає значно простішою. У GA порівняння за періодом виглядає так:

Спробуємо зробити щось подібне до Метрики.

Перед тим, як розпочинати створення безпосередньо звітів, треба дати користувачеві можливість вибрати лічильник, статистику якого він хоче побачити. Для цього ми повинні скористатися посиланням, яке вже бачили вище (http://api-metrika.yandex.ru/counters.json). З інформації, яку надсилає сервер, нам треба витягнути два параметри: id та site. ID — це номер лічильника, без якого неможливо отримати жодної статистики, а site — назва сайту, вказана при реєстрації.

Отже, створимо для користувача інтерфейс вибору лічильника та періоду, з яким ми порівнюватимемо наші дані. На пітоні код для запиту лічильників виглядатиме так:

classFetchCounters (webapp . RequestHandler):def post ( self ): token = cgi . escape( self . request . get( 'token' )) counters = memcache . get(token)if countersis None : fetch_url = 'api-metrika.yandex.ru/counters.json?oauth_token=' + token result = urlfetch . fetch (url = fetch_url, deadline = 3600)if result . status_code == 200 : counters = json . loads(result . content)[ "counters" ] memcache . add(token, counters, 3600 ) # TTL 3600 __seconds__else : counters = 'Oops, looks like you don\' t have permission to access counters' self. response. out. write(json . dumps(counters))

Оскільки даний сервіс не призначений для продакшна, збережемо для токена список лічильників в memcache, щоб не смикати сервер зайвий раз. Насправді цього робити на платформі Google AppEngine, ймовірно, не варто - розмір memcache відносно невеликий.

Для користувача інтерфейс буде виглядати так:

Далі, нам потрібно вибрати відповідний звіт із доступного списку. У API Метрики є такі групи звітів:

  • Трафік
  • Джерела
  • Зміст
  • Географія
  • Демографія
  • Комп'ютери
Для побудови графіка потрібно знати кількість відвідувань у кожен із днів періоду, що розглядається, тому нам потрібна група звітів “трафік”, а в ній звіт “відвідуваність”. Щоб отримати необхідні дані, сформуємо запит наступного виду: http://api-metrika.yandex.ru/stat/traffic/summary.json? > В якості id виступає ID обраного користувачем лічильника, date1 і date2 - дати у зазначеному форматі. Будь-який запит до API метрики можна перевірити прямо у браузері, тому ви можете просто взяти id свого лічильника та підставити його у це посилання. Якщо ви залогінені в сервісах Яндекса, oAuth токен можна опустити.

У відповідь метрика поверне звіт, в якому міститься багато зайвої інформації, нам потрібна тільки дата («date») ікількість відвідувань («visits»):

Далі, порівняємо обраний користувачем період з аналогічним за кількістю днів попереднім періодом (наприклад, буде порівнюватися з цим.

period = [datetime. strptime(cgi . escape( self . request . get( 'date_1' ))), "%Y-%m-%d "), datetime . strptime(cgi . escape( self . request . get( 'date_2' ))), "%Y-%m-%d ")] rng = period[ 1 ] - period[ 0 ] + timedelta(1)

А потім віднімемо довжину з кінцевих точок нашого періоду:

res2 = self. fetch_data( map (lambda x: x - rng, період))ifnot res2:return data2 = map (lambda x: < "visits" : x[ "visits" ] >, json . loads(res2 . content)[ "data" ])

В результаті для кожної дати з періоду користувача у нас буде кількість візитів в цей день і N днів тому і на основі цих даних вже можна будувати графік. Я для побудови графіків використовував Google Charts, тому що з ними просто працювати, а результат виглядає досить гарно. Графік порівняння виглядає так:

простенький

Тепер, коли ми маємо дані по днях і візитах, чому б нам не розрахувати відхилення від середнього в кожен день. Якщо уявити цю інформацію як гістограми, її простіше сприймати, ніж, якщо вдивлятися в побудований графік.

Для цього порахуємо середнє значення, розділивши суму візитів на число днів, а потім порівняти отримане значення зі значенням кожного окремого дня. В результаті отримаємо наступну діаграму:

Отже, тепер ми маємо діаграми для порівняння трафіку з минулим, але щоб зробити наш сервіс по-справжньому корисним, треба туди додати щось ще.

Дуже часто при оцінці сайту доводитьсяпорівнювати, як змінилася популярність сторінок. Наприклад, те, що цього місяця добре йдуть телескопи на підставці Добсона, не означає, що вони також добре продавалися в минулому. Спробуємо додати звіт, в якому можна буде просто та швидко побачити зміни у відвідуваності сторінок.

В іншому механізми отримання даних схожі

res1 = self. fetch_data(period, 20)ifnot res1:return data1 = json. loads(res1 . content)[ "data" ]

res2 = self. fetch_data( map (lambda x: x - rng, період))ifnot res2:return data2 = make_url_tuple(json . loads(res2 . content)[ "data" ])

У результаті наш сервіс буде виглядати так:

простенький

Завдяки тому, що у правому стовпці показується, як змінилася позиція порівняно з минулим періодом, дуже легко зрозуміти динаміку популярності сторінок.