Tech каналы Telegram
Телеграм сейчас является основным источником контента для многих. За последние 10 лет Телеграм перетащил в каналы большую часть аудитории сайтов. Сейчас мы уже не читаем новостные сайты, а смотрим публикации в каналах. У Хабра тоже есть канал, его читает более 100 000 подписчиков. Кроме этого, о технологиях есть тысячи других каналов. Сколько их? Какая у них аудитория? Где найти данные? Разберемся в статье.
Стало интересно сделать анализ всех телеграм каналов: подписчики, рейтинги, частота статей, процент репостов, процент рекламы и т.д., поэтому посмотрел как можно достать данные. Забегая вперёд, скажу что собрал датасет со всеми телеграм каналами, в том числе и каналы с одним подписчиком. Их около 2 млн по всем гео. Какого-то сервиса, где можно сразу быстро и просто взять все каналы и набор метрик по ним, я не нашел, поэтому посмотрел где и как можно такие данные собрать. Хотел оценить масштабы Телеги.
Данные
Существуют агрегаторы данных телеграм типа tgstat.com. Один из способов — парсинг данных агрегаторов. Варианты с ботами, виртуальными аккаунтами показались более затратными, поэтому парсил несколько агрегаторов.
Итак, посмотрел ряд агрегаторов, взял на пробу три датасемпла. Самым адекватным показался семпл tgstat, поэтому, остановился на нем. В сервисе надо регистрироваться по телеграм аккаунту. Контент динамический, то есть, подгружается по клику. Парсер проходится по всем страницам, загружая динамический контент. Потом по тегам html собираются данные и сохраняются в файл.
Сегодня расскажу про tech каналы с этой страницы (https://tgstat.ru/tech). Это каналы категории 'Технологии', Россия. Периодически читаю каналы этой категории, ну и канал Хабра там есть. Поэтому, релевантно будет здесь рассказать именно о технологических каналах.
Теперь о парсинге. У tgstat есть защита от ботов, регистрация по телеграм аккаунту, динамический контент (не все загружается сразу). Есть капча от Cloudflare, но всё это обходится. Питоновская библиотека Requests, при помощи которой разбираются сайты с простой логикой без защит, здесь не работает. Есть еще библиотеки Selenium и Playwright, они подходят для сайтов с защитой от ботов. Playwright — библиотека асинхронная, может ждать какие-то действия на сайте, может работать с внутренними браузерами (они скачиваются дополнительно) и внешними. В текущем случае при помощи Playwright не получается регистрироваться на сайте tgstat с внутренних браузеров. Поэтому, делаем максимально 'человеческий' скрипт. Скрипт повторяет действия человека: запускается Хром в режиме отладки, скрипт логинится, нажимает кнопки для загрузки контента в этом браузере и скачивает данные. Все сохраняется в csv. Поля:
Категории
id канала
Техническое название канала с @ в начале
Название канала
Ссылка на лого канала
Описание канала
Метрики:
Число подписчиков
Дата последней активности
Для этой статьи брал каналы с числом подписчиков 100 и больше, и из 15и тысяч tech каналов RU сегмента осталось 7635. С названиями каналов есть нюансы в парсинге (есть эмоджи и нестандартные символы), но обойти можно. Лого всех каналов скачал скриптом, это .jpg файлы форматом 100×100.
Визуализация
Итого, датасет готов, можно покрутить и поискать инсайты. Первые 20 каналов сильно выделяются на фоне остальных огромным числом подписчиков. Канал Хабра в рейтинге по подписчикам — 77й (113 172 подписчика).
Топ каналов по подписчикам ниже.
Если каждому каналу присвоить рейтинг по числу подписчиков (Наибольшее число подписчиков — рейтинг 1 и т.д.), то можно построить кривую подписчиков от этого рейтинга. Кривая показывает насколько неравномерно распределяются подписчики по рейтингам каналов. График ниже:
Но барчарты и графики — это просто и тривиально, поэтому хотелось показать сразу все каналы на одном листе, построить 'вселенную' каналов. Хотел чтобы визуализация напоминала звездное небо с огромными звездами и небольшими планетами. Это нетривиально, но интересно.
Поэкспериментировал с несколькими вариантами. В итоге, остановился на визуализации — packed bubbles ('упакованные пузыри'. Здесь сложновато с переводом) c лого и размерами пузырей пропорциональными числу подписчиков. Смысл в том чтобы уместить все каналы (круги) на одном листе, и чтобы не было пересечений кругов. То есть, надо заполнить все пространство листа визуализации кругами.
Теперь о самой визуализации. Packed bubbles можно делать различными способами и в разных средах. В BI системах — большие ограничения, визуализация нетривиальная и не поддерживается нативно в большинстве систем. Питон очень долго считает (пробовал, но ждать долго). Поэтому, победил Процессинг. Писал в нем года полтора раньше — с геометрическими объектами и преобразованиями довольно комфортно работать, и плюсы нативной анимации есть.
На js есть библиотека p5. Тот же процессинг, но на js. В итоге, написал скрипт на p5js, алгоритм collide. Упаковывать пузыри можно несколькими способами. Сначала хотел в центр визуализации помещать самый большой пузырь и вокруг него рисовать другие пузыри с постепенным уменьшением их диаметра. Но тогда бы все пузыри были внутри одной большой окружности. В итоге алгоритм заполняет пространство 16×9, то есть, экран стандартного монитора. Картинки квадратные, круги из них можно вырезать самим скриптом js и функцией createGraphics.
Код работает с частотой 60 fps, за каждый кадр рисуется один пузырь. Получается анимация заполнения пространства пузырями.
В коде js есть 7 параметров, их можно настраивать, получая разные вариации диаграммы. Долго игрался с этим, в итоге получились 3 картинки. Оригиналы в разрешении 8k (30+MБ каждая), но на Habrastorage — ограничение 8МБ. Прикладываю визуализации в разрешении 1920×1080:
Каналы 100 и более подписчиков. 7635 штук.
Каналы 1000 — 100000 подписчиков. 4535 штук.
Каналы 10000 — 100000 подписчиков. 1009 штук.
Каналы 100 и более подписчиков. 7635 штук
Каналы 1000 — 100000 подписчиков. 4535 штук
Каналы 10000 — 100000 подписчиков. 1009 штук
Получились своего рода вселенные со звездами и планетами (самое то на fullscreen). Плотно упакованы только. На одной картинке можете видеть все каналы и представить масштабы контента в телеграм. Разрешение высокое 8k (7680×4320), можно зумить, искать знакомые и интересные каналы. Канал Хабра тоже можно найти.
Контент третьей категории читаю больше всего, поэтому, сделал интерактивный виз в Tableau именно в этом диапазоне подписчиков (10k — 100k). Все построил на p5, взял координаты кругов и перенес их в датасет для Tableau. В самом Tableau все круги располагаются на одном листе и подключаются шейпы. Единственное, пришлось пройтись питоновским скриптом по квадратным картинкам, вырезать из них круги и каждую картинку сохранить в .png с прозрачным фоном.
Интерактив в Tableau 'Telegram tech channels':
Здесь можно найти канал, выбирать диапазон подписчиков и рейтинги на основе числа подписчиков. Можно читать описание и переходить в сам канал по клику.
Интересно получилось.
Последние визуализации не для анализа, а скорее для того чтобы увидеть количество каналов и позалипать в картинки.
В прочих категориях, например, 'блоги' или 'спорт', кривые по рейтингам другие совершенно. Если статья зайдет, сделаю визуализацию всех каналов и расскажу про другие категории, а также про основные метрики. Может и датасет на kaggle выложу.