Наткнулся на YouTube на топ-20 общественно-политических ютуб-каналов, результат за месяц. Подумал, такое легко сделать самому, заодно изучу API YT и проверю результаты. А готовый алгоритм можно применить и на другие тематические каналы.
Почитал статью на Хабр, посмотрел ролик на YouTube, полистал документацию и приступил писать код на коленке в jupyter notebook.
Первая проблема - как выбрать каналы, которые будут участвовать в рейтинге? Поиск по каналам по ключевым словам оказался бесполезным. Для отладки взял готовый список каналов из оригинального обзора. Для других тематик идея такая: ищем топ видео за месяц/неделю по заданным ключевым словам с сортировкой по количеству просмотров. Выделяем уникальные каналы. Проверяем глазками на корректность.
Далее проходимся по каналам, собираем все видео, которые были опубликованы в прошлом месяце. Затем по каждому видео собираем статистику просмотров. В оригинальном обзоре shorts учитываются с коэффициентом 1/10. В API нет признака видео shorts или нет. ChatGPT любезно подсказал определять по длине видео: меньше минуты - shorts. (По факту не так. На StackOverflow предлагают ходить по адресу https://www.youtube.com/shorts/<video_id> , если вернулся код 301 редирект, значит не shorts) Ок, вытаскиваем длину видео, определяем тип, коэффициент и взвешенное количество просмотров. Сортируем и получаем список. Сверяем с оригиналом.
Скрытый текст
В целом неплохо, место каналов более менее похоже. Но представьте, какого участникам рейтинга, если из-за ошибки кто-то попадет на 4, вместо 3 места. Нужен более однозначный алгоритм. Сравниваю количество просмотров - отклонения местами гигантские, например, 11 млн просмотров.
Время сделать шаг назад и вспомнить предположения. Я считал, что раз это новостные каналы, то интерес к видео будет не более недели. Кто будет смотреть вчерашние новости. Поэтому собрать статистику на 5й день следующего месяца будет вполне хорошим приближением. Но на каналах из списка есть не только новостные видео. Эти могут смотреть и через год.
Возвращаемся к решению. На ум приходит два варианта:
брать общее количество просмотров канала на начало месяца и брать разницу между месяцами. То есть инкрементное увеличение общего количества просмотров и есть количество просмотров канала за месяц.
Проблема - как вычленить shorts?
проходиться дополнительно по всем старым видео на канале и фиксировать их количество просмотров, а потом по каждому видео высчитывать увеличение.
Проблема - объемы и лимиты. На YT API есть лимит обращений в сутки в 10К. Причем поиск стоит 100 очков. По 25 каналам за последний месяц у меня набралось порядка 3 тысяч видео. Смотреть во всю глубину канала и собирать статистику выглядит дорого. Как я понял, именно так и делали в оригинальном обзоре.
Можно использовать комбинацию решений. Смотреть изменение числа просмотров канала, сравнить с суммой просмотров по видео и копать вглубь, пока эти величины не будут в рамках желаемой погрешности. Но такое решение кажется сложноватым для такой "простой" изначальной задачи. Для проверки этого подхода нужно иметь данные по каналу за прошлый месяц. Смогу проверить через месяц.
Для чего я описал этот случай. Мне он показался наглядным примером частых случаев, когда заказчик дает "простую" задачу, которая из-за каких-то деталей может иметь сложное техническое решение. Вспомнилось
Любая сложная задача имеет простое, легкое для понимания неправильное решение.
Хотя может я не до конца разобрался с API YouTube и есть элегантное решение? Если есть идеи, пишите в комментариях. Интересно ваше мнение.
P.S. код писал на коленке для себя. Но по рекомендациям вставлю ссылку на репозитарий.