Предыстория


Совсем недавно у нас случилась ситуация, когда «потерялись» все YouTube и Vimeo ссылки на ролики, количество просмотров которых нам необходимо выводить на сайте. Это нужно, чтобы потенциальные инвесторы и партнеры видели, какие текущие показатели у наших сериальных проектов. Скрипт обновляет данные раз в сутки, хотя я неоднократно просил сделать обновление показателей в реальном времени. Я много лет не программирую, ушел в совершенно иной вид деятельности и в настоящий момент возглавляю анимационную студию. Конечно же, я был обескуражен возникшей ситуацией с потерей данных, устроил разнос и прочее, но это к делу отношения не имеет.

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

ImportXML и Vimeo


Помятуя, что как-то делал себе вывод актуального курса доллара и евро, нашел старый документ и подглядел в нем удобную функцию Google.Sheets — это ImportXML (в Google есть 4 функций удобно утягивающих данные из сети: ImportXML, ImportDATA, ImportHTML, ImportFEED). В ячейке таблицы просто пишем "=ImportXML" и Google дает подсказку, как правильно вынимать необходимые данные. Я полез на сайт Vimeo и нашел странницу с API и описанием, где получить XML с данными ролика. Всё банально:

http://vimeo.com/api/v2/video/00000000.xml
где 00000000 — это id ролика (берется из адресной строки на Vimeo)

Открыв XML, я увидел, что всё, что мне нужно. В контейнере третьего порядка <stats_number_of_plays> лежали данные о просмотре. Таким образом получить в Google.Sheets данные о просмотре например вот этого ролика, можно просто указав в ячейке следующее значение:
=IMPORTXML("http://vimeo.com/api/v2/video/17589726.xml", "//videos/video/stats_number_of_plays")

В первых кавычках ссылка на XML, во вторых кавычках указываем XPath к нужному контейнеру. Подробнее о синтаксисе XPath можно прочитать здесь.

ImportJSON и YouTube


Чуть сложнее оказалось с YouTube. Да, они дают данные о ролике, но в контейнерах JSON. Найти сводный файл оказалось не сложнее, чем на Vimeo. Всё также не сложно:

http://gdata.youtube.com/feeds/api/videos/00000000?v=1&alt=json
где 00000000 — это id ролика (берется из адресной строки на YouTube)

Но вот сам JSON для меня лично — история новая. Я попробовал к нему обращаться и так, и сяк, в результате подумал, что стоит поискать нечто вроде «ImportJSON» и не ошибся. Нашел скрипт, чтобы добавить такую фичу в Google.Sheet, добавил и сразу с JSON сдружился. Сам текст скрипта лежит здесь по ссылке.

Устанавливать скрипт в Google.Sheets надо так:
1. Создаете новый Google Spreadsheet.
2. Жмете на Tools -> Script Editor.
3. Жмете на Create script for Spreadsheet.
4. Удаляете заготовку нового скрипта и вставляете текст нашего скрипта.
5. Переименовываете его в ImportJSON.gs и сохраняете.
6. Возвращаетесь в свой документ, где уже работает новая функция “=ImportJSON()” в полном объеме.

Открыв JSON от YouTube, мы можем найти все необходимые нам данные о ролике. В контейнере <yt$statistics> есть атрибут viewCount, который нам и нужен. Таким образом получить в Google.Sheets данные о просмотре например вот этого ролика, можно просто указав в ячейке следующее значение:
=ImportJSON("http://gdata.youtube.com/feeds/api/videos/GRNZ0wwNOTc?v=2&alt=json", "/entry/yt$statistics/viewCount", "noHeaders")

Вот и всё. Кстати, в итоге получилось, что Google.Sheets считает данные сотен роликов за… меньше, чем за одну минуту. Я был прав. Программисты просто водили меня вокруг пальца. Получить данные из контейнеров XML и JSON при помощи РНР задача еще менее хитрая, чем та, которую я перед собой поставил. Мало того, и YouTube, и Vimeo предлагают готовые РНР решения для разработчиков.

Всем удачи! Надеюсь, эта короткая статья будет полезна.

Комментарии (7)


  1. jartashi
    03.04.2015 11:14
    +2

    Можно смело добавлять тэг «управление персоналом».


  1. gkislin
    03.04.2015 11:55

    Спасибо за информацию. Еще один интересный пример применения: все ссылки со старнички

       =IMPORTXML("https://en.wikipedia.org/wiki/Moon_landing"; "//a/@href")
    

    У меня запросы заработали, только когда поставил разделителем ";"


  1. SovGVD
    03.04.2015 12:11

    А почему скрипт у программистов считал не верно? Просто интересно, малоли пригодится на будущее.


    1. Greenmoon2 Автор
      03.04.2015 14:19
      +1

      Нашли, когда получилось сделать вот этот альтернативный вариант. В общем большом потоке данных было несколько ссылок, где в контейнерах не было ничего, так как просмотров у роликов не было. Робот обходил ссылки пакетами, а натыкаясь на отсутствующее значение (Vimeo пишет «0», а вот YouTube просто не пишет ничего), просто переставал считать.


  1. belonesox
    03.04.2015 16:35

    Спасибо! Еще одна история, когда менеджер с помощью «эксель-повер» уел высокомерных программистов (наблюдал такое в учетных системах).


  1. TimsTims
    03.04.2015 21:59

    В формулах нужно заменить запятую на точку с запятой

    =IMPORTXML(«vimeo.com/api/v2/video/17589726.xml», "//videos/video/stats_number_of_plays")
    на
    =IMPORTXML(«vimeo.com/api/v2/video/17589726.xml»; "//videos/video/stats_number_of_plays")

    А так спасибо за spreadsheets, думал это просто недоаналог Excel, а оказалось весьма мощный инструмент, с применением серверов гугла.


  1. AxMuha
    04.04.2015 15:29

    Кстати, мое наблюдение: современные php программисты плохо владеют sql (и языком и инструментам). Попросишь какие-нибудь данные, смотришь, он «завис», говоришь, данные мол дай, что там делаешь. А оказывается он на ПХП скрипт пишет… Хотя их можно было бы получить sql запросом средней сложности…