Наткнулся на YouTube на топ-20 общественно-политических ютуб-каналов, результат за месяц. Подумал, такое легко сделать самому, заодно изучу API YT и проверю результаты. А готовый алгоритм можно применить и на другие тематические каналы.
Почитал статью на Хабр, посмотрел ролик на YouTube, полистал документацию и приступил писать код на коленке в jupyter notebook.
Первая проблема - как выбрать каналы, которые будут участвовать в рейтинге? Поиск по каналам по ключевым словам "новости, политика" дало много мусора. Ок, взял готовый список каналов из оригинального обзора, добавил немного своих для интереса.
Скрытый текст
id | title |
UCdubelOloxR3wzwJG9x8YqQ | Телеканал Дождь |
UCBzDAjLfvBUBVMMP6-K-y0w | Ходорковский LIVE |
UCgpSieplNxXxLXYAzJLLpng | Майкл Наки |
UCrp2It0yWUC7XcrWyBIQeKw | NEXTA Live |
UCSqO8lV-ric7ow5G5q9roWw | ВОТ ТАК |
UCUGfDbfRIx51kJGGHIFo8Rw | Максим Кац |
UC101o-vQ2iOj9vr00JUlyKw | varlamov |
UC7Elc-kLydl-NAV4g204pDQ | Популярная политика |
UC2CwLS7djYymder2K3UpbJg | Антон Хардин |
UCb64k6yqn3s4DlayVkbJ2qw | Обманутый Россиянин |
UCXoAjrdHFa2hEL3Ug8REC1w | DW на русском |
UCiWMFQCGvwGSc8QWHOqcQhw | Радио Свобода |
UCSK57JMV0OJL1C7V-YOEVkQ | Комсомольская Правда |
UCBG57608Hukev3d0d-gvLhQ | Настоящее Время |
UCeKCxQDv6lWDSzuqUXGtMRA | МИНАЕВ LIVE |
UC1eFXmJNkjITxPFWTy6RsWg | Редакция |
UCVPYbobPRzz0SjinWekjUBw | Анатолий Шарий |
UCS-cgYslpMpH5FkxJ2e0Vpg | Newsader |
UCvQXaJTjA3jRucTKN4CGiwg | Осторожно: Собчак |
UCb2oej0JtxlnywlqoSiHHVQ | Юрий Швец -- официальный канал |
UCHQT00AqYAG-D8HDJ3pgLdw | Мир в Огне |
UCO1lJlI3gjuOMrKppvPlDww | Новая газета Европа |
UCFLgZndaFe5JZTkq6d-W-Cw | Радио Свобода. Новости |
UCkp0Tc7ll67bChomTyB1ezQ | Om TV |
UCTVk323gzizpujtn2T_BL7w | The Breakfast Show |
UCjWy2g76QZf7QLEwx4cB46g | Alexey Arestovych |
UCjj5_jGA15A3IHMS3ml28yA | БОЛЬШОЙ КУШ |
UCcO762BN2bx6tyw_VlsDagw | Дед Архимед |
UCI4hEQc8mkuK2eMsew_MwTw | Любовь Соболь |
UCnbuCp4py12SNWCc5TI1RHA | Denis Kazanskyi |
Далее проходимся по каналам, собираем все видео, которые были опубликованы в прошлом месяце. Затем по каждому видео собираем статистику просмотров. В оригинальном обзоре shorts учитываются с коэффициентом 1/5. В API нет признака видео shorts или нет. ChatGPT любезно подсказал определять по длине видео: меньше минуты - shorts. Ок, вытаскиваем еще длину видео, определяем тип, коэффициент и взвешенное количество просмотров. Сортируем и получаем список. Сверяем с оригиналом.
![Таблица рейтинг каналов в сравнении с оригиналом Таблица рейтинг каналов в сравнении с оригиналом](https://habrastorage.org/getpro/habr/upload_files/f9d/111/e59/f9d111e59aea65a73ede2424dfaf757f.png)
В целом неплохо, место каналов более менее похоже. Но представьте, какого участникам рейтинга, если из-за ошибки кто-то попадет на 4, вместо 3 места. Нужен более однозначный алгоритм. Сравниваю количество просмотров - отклонения местами гигантские, например, 11 млн просмотров по varlamov.
Время сделать шаг назад и вспомнить предположения. Я считал, что раз это новостные каналы, то интерес к видео будет не более недели. Кто будет смотреть вчерашние новости. Поэтому собрать статистику на 5й день следующего месяца будет вполне хорошим приближением. Но на каналах из списка есть не только новостные видео. Эти могут смотреть и через год.
Возвращаемся к решению. На ум приходит два варианта:
брать общее количество просмотров канала на начало месяца и брать разницу между месяцами. То есть инкрементное увеличение общего количества просмотров и есть количество просмотров канала за месяц.
Проблема - как вычленить shorts?
проходиться дополнительно по всем старым видео на канале и фиксировать их количество просмотров, а потом по каждому видео высчитывать увеличение.
Проблема - объемы и лимиты. На YT API есть лимит обращений в сутки в 10К. Причем поиск стоит 100 очков. По 25 каналам за последний месяц у меня набралось порядка 3 тысяч видео. Смотреть во всю глубину канала и собирать статистику выглядит дорого.
Можно использовать комбинацию решений. Смотреть общее изменение просмотров канала, сравнить с суммой просмотров по видео и копать вглубь, пока эти величины не будут в рамках желаемой погрешности. Но такое решение кажется сложноватым для такой "простой" изначальной задачи.
Для чего я описал этот случай. Мне он показался наглядным примером частых случаев, когда заказчик дает "простую" задачу, которая из-за каких-то деталей может иметь сложное техническое решение. Вспомнилось
Любая сложная задача имеет простое, легкое для понимания неправильное решение.
Хотя может я не до конца разобрался с API YouTube и есть элегантное решение? Или может оригинальный обзор тоже делает какие-то упрощения? Если есть идеи, пишите в комментариях. Интересно ваше мнение.
P.S. код писал на коленке, он некрасивый и непонятный, поэтому прикладывать не буду. Базовые функции обращения к API YT есть в репозитории в статье на Хабре в начале поста.