Как парсить телеграмм каналы python
Перейти к содержимому

Как парсить телеграмм каналы python

  • автор:

Парсим данные в Telegram на Python. Часть 1. Выбираем библиотеку и изучаем подписчиков

Собираем данные о подписчиках телеграм-каналов и чатов с помощью библиотеки Telethon.

Иллюстрация: Катя Павловская для Skillbox Media

Антон Яценко

Антон Яценко
Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.

Для анализа телеграм-каналов и чатов используют парсеры данных. Это специальные программы, которые позволяют получить информацию о подписчиках, публикациях и обсуждениях с помощью механизмов самого мессенджера (API). Существует немало коммерческих парсеров, однако создать их можно и самостоятельно — используя специальные библиотеки для языков программирования.

В этой статье мы научимся работать с библиотекой Telethon для Python, которая автоматизирует работу по сбору данных из мессенджера: напишем на ней простой парсер для получения информации о подписчиках телеграм-групп или каналов. Это первая часть урока — во второй части будем парсить уже сообщения пользователей.

Библиотека Telethon и особенности парсинга

Написать парсер для Telegram можно на любом языке программирования, позволяющем работать с API: Python, JavaScript, Go и так далее. Каждый из них имеет свою универсальную библиотеку для работы с любыми API, а некоторые — даже специализированные библиотеки для Telegram.

Мы остановимся на Python — одном из самых популярных языков программирования. В экосистеме Python есть удобная асинхронная библиотека для работы с API Telegram — Telethon. Её используют для парсинга информации из мессенджера, управления сообществами и создания ботов. У Telethon два больших преимущества: подробная документация и большая популярность в комьюнити. Работает библиотека тоже отлично 🙂

Ограничения на парсинг данных из Telegram

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

Канал. Если к каналу не подключены комментарии, то список пользователей можно спарсить только при выполнении следующих условий:

  • это ваш канал;
  • в нём более 200 подписчиков.

Если одно из условий не выполняется, получить информацию о пользователях будет невозможно. Если же к каналу подключён чат, то работа с ним не отличается от парсинга чатов.

Чат. Ограничений на парсинг нет. Главное — чтобы вы были участником этого чата. Если вас в нём нет и он закрыт, спарсить ничего не получится.

Перейдём к написанию кода: получим данные для доступа к API Telegram и напишем парсер списка участников.

Шаг 1

Регистрируемся в разделе инструментов разработчика Telegram

Для работы с API Telegram нам необходимо получить api_id и api_hash. Сделать это можно в разделе инструментов разработчика Telegram. Это обязательное действие не только при создании нашего бота, но и при создании любого бота или парсера, который задействует API мессенджера.

Переходим по ссылке и авторизуемся, используя номер телефона, привязанный к вашему профилю в мессенджере. После авторизации необходимо выбрать пункт API development tools:

В открывшейся форме заполняем пустые поля. Всё заполнять необязательно, главное — указать полное и краткое имя приложения:

После нажатия Create application откроется страница, на которой нас интересует два параметра:

Важно!

Не отправляйте свои api-id и api-hash третьим лицам. Их могут использовать для работы с мессенджером от вашего имени.

Шаг 2

Импортируем библиотеки и запускаем клиент

Для написания кода парсера мы будем использовать Visual Studio Code. Это стандартная IDE, которую можно заменить на любую другую — например, на PyCharm или онлайн-редактор типа Google Colab.

Если вы никогда не работали на своём компьютере с Python, его будет необходимо установить. Сделать это проще всего по нашей инструкции.

Теперь откроем вкладку «Терминал» в нашей IDE и установим библиотеку для парсинга данных:

После входа в систему в папке с кодом появится файл .session. Это файл базы данных, который делает сессию постоянной, то есть как бы не даёт нам разлогиниться. База данных благодаря библиотеке Telethon создаётся автоматически (формат — SQLite) — в ней хранится информация о текущей сессии парсинга: хеш, IP-адрес, с которого она производится, время сессии и другие технические данные подключения.

Шаг 3

Получаем список каналов и чатов, доступных для парсинга

Будем собирать информацию из чатов, на которые подписан пользователь. Это удобно, так как позволяет обращаться к ним, не указывая конкретный адрес, а выбирая из списка.

Начнём с создания пустых списков, которые пригодятся для хранения списка чатов, и инициализируем две переменные (они используются для фильтрации чатов):

Запустим файл main.py. Для этого напишем в терминале:

Выберем любую группу, введя в терминал нужную цифру. В нашем случае это будет группа «Вастрик.ЗОЖ».

Теперь мы видим текстовые сообщения, которые «зашивали» в код. И главное, понимаем, что парсинг прошёл удачно.

Откроем нашу папку. В ней появился файл members.csv:

Откроем его и посмотрим на содержимое:

Всё получилось! В файле мы видим всех пользователей группы с указанием их юзернейма и имени, включающего также фамилию с дополнительными символами.

Что дальше?

В следующей части мы научимся парсить сообщения из чатов. Изучим новые методы и объекты библиотеки Telethon и поработаем с форматом JSON, который особенно удобен для хранения текстовой информации.

Читайте также:

  • Чат-боты в Telegram на Python. Часть 1. Выбираем библиотеку и пишем первого бота
  • «Я удивился, когда написал код, а он заработал»: как живёт начинающий Python-разработчик
  • Упражнения в прекрасном: подключаемся к домашнему Wi-Fi без пароля

Как написать парсер телеграм‑каналов на Python

Акчурин И. С.

В предыдущей статье об асинхронном программировании на Python мы разобрали основные моменты, связанные с построением асинхронного приложения и функций. Теперь рассмотрим полезный пример, который вовсю использует принципы асинхронности, — простой парсер данных из Telegram

Содержание статьи

  • async for
  • Как написать парсер телеграм-каналов на Python
    • Шаг 1. Создаем приложение API для Telegram
    • Шаг 2. Устанавливаем библиотеку telethon
    • Шаг 3. Получаем первые данные из Telegram
    • Шаг 4. Получаем диалоги
    • Шаг 5. Получаем сообщения из выбранного канала

    async for

    Чтобы пример с парсером был понятнее, сначала поговорим о циклах внутри асинхронных функций. Вспомним финальный пример из первой части статьи, посвященной асинхронному программированию на Python, с получением данных о погоде.

    Добавим еще одну функцию, которая будет отображать прогресс измерения давления.

    Теперь, если мы запустим приложение, будем видеть прогресс измерения давления.

    Все хорошо отрабатывает, и проблем нет. Но пойдем дальше в сторону реальных условий работы. Бывает, что функции отдают не готовую последовательность, а асинхронный генератор или асинхронный итератор. Это специальные контейнеры, которые содержат данные и при каждом обращении асинхронно выдают по одному объекту.

    Перепишем функцию процесса измерения.

    Раз функция def ticker ( ) теперь генератор, то мы должны каждый раз его вызывать, когда она нам понадобится. Классический способ перебора всех значений, возвращаемых генератором, — это подстановка его вызова в цикл for. Перепишем функцию измерения давления.

    Теперь, если запустим код, столкнемся с интересной ошибкой.

    Из текста может показаться, что генератор не является итерируемым объектом. Но на самом деле проблема здесь в другом. Мы работаем с асинхронным генератором, а значит, и цикл, который его перебирает, тоже должен быть асинхронным.

    Все снова отлично работает! Зачем это нужно, спросите вы? Прямо сейчас и узнаем.

    Как написать парсер телеграм-каналов на Python

    Основы языка Python
    Курс для всех, а не только для IT-специалистов

    Telegram — один из самых популярных источников контента. Каналов в мессенджере столько, что следить за всеми самостоятельно просто нереально, не говоря уж об использовании и анализе получаемой информации.

    Но зачем все делать вручную, когда за нас это может сделать приложение? Совместим приятное с полезным: напишем приложение для парсинга данных из любого телеграм-канала и параллельно закрепим тему асинхронных компонентов.

    • Все о парсинге данных на бесплатном вебинаре Контур.Школы.

    Шаг 1. Создаем приложение API для Telegram

    Для начала необходимо завести аккаунт в Telegram, если его еще нет. Затем переходим по ссылке https://my.telegram.org/auth и авторизуемся с помощью номера телефона.

    Код подтверждения придет прямо в мессенджере Telegram. Необходимо его ввести в поле Confirmation code.

    В открывшемся окне переходим по ссылке API Development Tools. Вас перебросит в окно создания приложения. Необходимо заполнить основные поля.

    Значения полей можно указывать любые. Для нас они не играют особой роли. Ставим точку напротив Desktop и подтверждаем заполнение кнопкой Create application.

    Следующее окно отобразит важные параметры вашего приложения, которые нам и будут нужны для создания приложения на Python, — это App api_id и App api_hash.

    Шаг 2. Устанавливаем библиотеку telethon

    Теперь у нас есть все необходимое, чтобы приступить к созданию приложения в Python. Первым делом нам понадобится библиотека telethon, чтобы авторизоваться и получить доступ к данным аккаунта. Устанавливаем ее обычным способом.

    Далее импортируем необходимые модули и сразу создадим переменные с данными для авторизации.

    Естественно, в серьезных приложениях авторизационные данные не хранятся в таком открытом виде. Обычно используются переменные окружения, содержимое которых не раскрывается.

    Следующий шаг — авторизация приложения и создание сессионного файла. Допишем следующую строку:

    Здесь ‘test_tg’ — это название файла, который будет создан для хранения авторизационных данных приложения. Далее необходимо создать тот самый цикл обработки событий (event loop). Это будет асинхронная функция main ( ) , в которой мы пока напишем команду-заглушку pass. И сразу запустим этот цикл, используя один из методов запуска библиотеки telethon.

    Теперь наше приложение необходимо запустить, чтобы пройти одноразовую авторизацию. Примерно так же вы устанавливаете приложение на компьютер и авторизуете его с помощью QR-кода. Запустите приложение — и в окне терминала увидите приглашение ввести проверочный код.

    Можно ввести номер телефона — тогда следующее сообщение попросит одноразовый код, который придет в Telegram.

    Если все выполнили верно, то ниже в терминале получите сообщение:

    А также в списке файлов появится файл с авторизационными данными, имеющий расширение *.session.

    Готово! Все последующие запуски вашего приложения уже будут выполняться без запроса одноразовых паролей. И код, написанный в обработчике событий main ( ) , будет сразу исполняться.

    Шаг 3. Получаем первые данные из Telegram

    Настало время сбора данных. Начнем с того, что у telethon есть неплохая документация, основные методы из которой мы и рассмотрим. Первая информация, которая нам доступна, — о нашем аккаунте.

    Если проверим тип полученного объекта, то увидим знакомое сообщение.

    Мы получаем корутину. То есть все методы клиента Telegram асинхронны. Еще бы — без асинхронности мы не смогли бы получать информацию одновременно из нескольких чатов, а отправка фотографии другу вообще застопорила бы все процессы на глобальном уровне.
    Поэтому все методы вызываем только через await.

    Полученный объект me содержит огромное количество свойств, включая ваше имя, фамилию, номер телефона, фотографию и много еще чего персонального, что афишировать не нужно. Просмотреть содержимое объекта удобно в режиме отладки.

    Шаг 4. Получаем диалоги

    Чтобы получить список диалогов, воспользуемся еще одним методом клиента .get_dialogs( ).

    В dialogs получим общее количество диалогов. Оно включает не только каналы, на которые мы подписаны, но и личные переписки. Можете посмотреть их количество в отладчике или воспользоваться функцией len(dialogs) и испытать шок от итогового количества. У меня 1540 диалогов.

    Зачем специалисту Python
    Бесплатный вебинар в Контур.Школе

    Так как в dialogs нам, по сути, возвращается итерируемый объект, мы можем легко его перебрать с помощью обычного цикла for, чтобы найти именно тот канал или переписку, которые нам нужны.

    Каждый элемент полученного dialogs — это объект класса Dialog библиотеки telethon. Посмотреть методы и свойства этого объекта можно в документации. Переберем диалоги по названиям и найдем нужный.

    Шаг 5. Получаем сообщения из выбранного канала

    Убедитесь, что нужный канал находится и вы получаете об этом сообщение. Когда канал у вас на руках, можно получить из него все сообщения, которые когда-либо были написаны.

    Воспользуемся методом client.iter_messages(dialog), чтобы получить сообщения.

    • Важно посмотреть на тип полученного значения у messages.

    Получаем не готовый список, как в случае с диалогами, а итератор. Это не должно быть проблемой, потому что элементы итератора мы можем получить так же, как и элементы списка, — закинуть в цикл for.

    Если теперь запустим приложение, то текстов сообщений мы не увидим, а получим ошибку.

    Это именно то, о чем мы говорили в начале: нужен асинхронный for, чтобы перебирать элементы асинхронного итератора. Исправим эту ошибку и получим желаемый результат.

    Единственное, что рекомендуется добавить, — обычную задержку между чтением каждого сообщения во избежание блокировок вашего аккаунта со стороны сервисов Telegram. Пусть будет медленно, зато спокойно и уверенно.

    Напоследок рекомендуем также ознакомиться со всеми свойствами и методами объекта message. Основные из них, которые могут пригодиться при сборе полных данных, вынесены в таблицу.

    date Свойство Содержит дату сообщения
    edit_date Свойство Содержит дату редактирования сообщения
    file Свойство Содержит файл, который приложен к сообщению
    download_media( ) Метод Позволяет загрузить файл, приложенный к сообщению
    is_reply Свойство Показывает, является ли сообщение ответом на другое сообщение
    forward Свойство Содержит информацию о первоисточнике, если текущее сообщение было переслано

    Конечно, в разных ситуациях могут потребоваться разные данные, но у этой статьи нет цели перепечатать всю документацию библиотеки telethon. На этой полезной ноте мы и завершим наше знакомство с асинхронным миром программирования.

    Как спарсить из телеграм-канала сообщения, опубликованные за последние 5 минут? (Python, Telethon)

    Есть задача спарсить и загрузить в json-файл сообщения из определенного телеграм-канала с помощью Python (я использую библиотеку Telethon).
    Но нужны не все посты, а только те, что были опубликованы за последнее время, например, 5 минут.
    Для получения всех сообщений использовал такой код:

    from telethon import TelegramClient from telethon.errors import SessionPasswordNeededError from telethon.tl.functions.messages import (GetHistoryRequest) from telethon.tl.types import ( PeerChannel ) # Setting configuration values api_id = 57272 api_hash = '. ' phone = '. ' username = '. ' # Create the client and connect client = TelegramClient(username, api_id, api_hash) async def main(phone): await client.start() print("Client Created") # Ensure you're authorized if await client.is_user_authorized() == False: await client.send_code_request(phone) try: await client.sign_in(phone, input('Enter the code: ')) except SessionPasswordNeededError: await client.sign_in(password=input('Password: ')) me = await client.get_me() user_input_channel = input('enter entity(telegram URL or entity id):') if user_input_channel.isdigit(): entity = PeerChannel(int(user_input_channel)) else: entity = user_input_channel my_channel = await client.get_entity(entity) offset_id = 0 limit = 100 all_messages = [] total_messages = 0 total_count_limit = 0 while True: print("Current Offset ID is:", offset_id, "; Total Messages:", total_messages) history = await client(GetHistoryRequest( peer=my_channel, offset_id=offset_id, offset_date=None, add_offset=0, limit=limit, max_id=0, min_id=0, hash=0 )) if not history.messages: break messages = history.messages for message in messages: all_messages.append(message.to_dict()) offset_id = messages[len(messages) - 1].id total_messages = len(all_messages) if total_count_limit != 0 and total_messages >= total_count_limit: break with client: client.loop.run_until_complete(main(phone)) 

    Как теперь заставить его парсить только последние сообщения?

    Парсинг Телеграм каналов и чатов своими руками

    Мы уже рассказывали про Телеграм-боты для пробива. Сегодня продолжим говорить про телегу и рассмотрим еще одну популярную тему — парсинг телеграм каналов и чатов.

    Последнее время, на всяких компьютерных форумах и сайтах часто поднимают вопрос парсинга чатов и каналов Телеграм. Некоторые пытаются впарить свои сервисы, которые как правило еще то разводилово. Другие, делая умный, вид пытаются чему-то научить. Непорядок подумал я пос­мотрев на это дело и решил самос­тоятель­но разоб­рать­ся.

    Парсинг телеграм каналов и чатов

    В данной статье я пос­тара­юсь понятным языком (даже для далеких от программирования пользователей) рас­ска­зать, как парсить Телеграм, что мож­но сде­лать, а что нель­зя и насколько это трудоемко. Заранее предупреждаю. Я не буду выкладывать готовые исходни­ки, но покажу при­меры для наг­ляднос­ти.

    Всем извес­тно, что в телег­е существуют чаты и каналы, где иногда кучкуются большое количество поль­зовате­лей. Стоит иметь список юзеров, нап­ример для рассылки или приг­лашений.

    Как правило под сло­вом «пар­синг» в кон­тек­сте Telegram подразумевается получе­ние спис­ка поль­зовате­лей чата или канала. Но иногда, еще и получе­ние спис­ка сооб­щений.

    Кстати, если вас интересует деанон пользователя Телеграм, очень рекомендую прочитать статью «Как узнать информацию о пользователе Telegram».

    Парсинг телеграм каналов

    Канал — это площадка в Телег­рам, где подписчикам разрешается толь­ко чита­ть сооб­щения создателя канала. Писать коментарии юзеры не могут, за исклю­чени­ем тех слу­чаев, ког­да к каналу Telegram при­вязан чат для ком­мента­риев. Тог­да у пользователей появ­ляет­ся воз­можность ком­менти­ровать сооб­щения канала.

    Вы можете по­лучить спи­сок под­писчи­ков канала без при­вязан­ного к нему чата с ком­мента­риями, толь­ко если это ваш канал и у него менее 200 пользотелей. Если какое-то из этих усло­вий не выпол­няет­ся, пар­синг Телеграм реализовать не получится и ник­то не смо­жет его про­вес­ти, что бы вам там ни обе­щали. Может быть, в ближайщем будущем появятся новые спо­собы, но на даннй момент рабочих спо­собов не существует.

    Ес­ли к каналу привязан чат с ком­мента­риями, тогда спар­сить поль­зовате­лей телеги вы сможете точ­но так же, как в слу­чае с каким-ниобудь чатом.

    Списо­к сооб­щений на канале мож­но получить двумя способами: прог­рам­мно, через API Telegram и ручками, экспор­том спи­ска сооб­щений с помощью кли­ента.

    Для этого в меню чата выбираем пункт «Экспорт».

    Парсинг телеграм каналов

    После этого выбираем формат для экспорта и жмем «Сохранить».

    Парсинг телеграм каналов

    Парсинг телеграм чатов

    С чатами гораз­до инте­рес­нее. Вруч­ную вытащить спи­сок юзе­ров через стан­дар­тный кли­ент не получит­ся, раз­ве что сидеть с блок­нотом и руч­кой и выписы­вать всю инте­ресу­ющую информа­цию. Спо­соб не очень, так что при­дет­ся пос­мотреть в сто­рону род­ного API Телеграм или, если хотите упростить себе жизнь, на какую‑нибудь биб­лиоте­ку, нап­ример Telethon.

    В Telethon есть фун­кция GetParticipantsRequest, которая получа­ет на вход некую сущ­ность (entity), а на выходе выда­ет спи­сок поль­зовате­лей.

    Итак, поп­робу­ем скор­мить ей какой‑нибудь чат.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *