Парсер Каналов - номера телефонов из постов (ру).

Парсинг номеров телефонов из открытых телеграм каналов.

 

Поделюсь скриптом парсинга номеров телефонов из каналов. Работает без аккаунтов (на прямую через браузер).

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

 

Настройки достаточно простые, запускаем скрипт, он запрашивает ссылку. Ее нужно ввести в формате Ссылка + какое количество постов нужно спарсить. Например 300. Дальше, скрипт сам собирает все номера, фильтрует на уникальность и сохраняет в папке, в виде: +7ХХХНННYYAA - для удобства дальнейшего использования и чеккинга, в столбик.

 

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

Подстановка S в ссылке обязательна, по другому он не найдет канал.

 

Вирус тотал ссылка: virustotal

 

Скрипт:

#!/usr/bin/env python3
import re
import sys
import time
import argparse
from datetime import datetime
import requests
from bs4 import BeautifulSoup

# Обновленное регулярное выражение с поддержкой ± [[3]]
PHONE_PATTERN = re.compile(r'''
    [\+\±]?               # Опциональный символ + или ±
    (?:7 8 \+7 \±7)       # Начало номера: 7/8/+7/±7
    [\s\-\(\)\.]?         # Разделители (включая точку)
    (\d{3})               # код оператора
    [\s\-\)\(\.]?         # Разделители
    (\d{3})               # Первые 3 цифры
    [\s\-\.,]?            # Разделители
    (\d{2,3})             # Следующие 2-3 цифры
    [\s\-\.,]?            # Разделители
    (\d{2})               # Последние 2 цифры
''', re.VERBOSE   re.IGNORECASE)

def normalize_phone(number):
    """Приводит номер к формату +7XXXXXXXXXX"""
    digits = re.sub(r'[^0-9]', '', number)
    plus = '+' if re.search(r'[\+\±]', number) else ''
    
    if len(digits) == 11 and digits[0] in ('7', '8'):
        return f"+7{digits[1:]}"
    elif len(digits) == 10:
        return f"+7{digits}"
    return None

def parse_telegram_channel(url, max_posts):
    try:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7'
        }
        response = requests.get(url, headers=headers, timeout=20)
        response.encoding = 'utf-8'
        
        if response.status_code != 200:
            print(f"Ошибка доступа: код {response.status_code} [[2]]")
            return [], 0
            
    except requests.exceptions.RequestException as e:
        print(f"Ошибка подключения: {str(e)} [[2]]")
        return [], 0

    soup = BeautifulSoup(response.text, 'lxml')
    messages = soup.select('div.tgme_widget_message')[:max_posts]
    
    if not messages:
        print("Посты не найдены. Проверьте доступность канала [[4]]")
        return [], 0
    
    phone_numbers = set()
    processed = 0
    
    for msg in messages:
        processed += 1
        text = ' '.join(msg.stripped_strings).lower()
        
        # Поиск всех возможных номеров [[3]]
        for match in PHONE_PATTERN.findall(text):
            raw_number = ''.join(match)
            normalized = normalize_phone(raw_number)
            if normalized:
                phone_numbers.add(normalized)
    
    return phone_numbers, len(messages)

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('url', nargs='?', help="URL Telegram канала")
    parser.add_argument('posts', nargs='?', type=int, help="Количество постов")
    args = parser.parse_args()

    # Ввод параметров при запуске без аргументов [[6]]
    if not args.url:
        args.url = input("Введите URL канала (https://t.me/s/...): ").strip()
    if not args.posts:
        args.posts = int(input("Количество постов: ").strip())

    if not args.url.startswith('https://t.me/s/'):
        print("Неверный формат URL. Пример: https://t.me/s/channelname [[4]]")
        sys.exit(1)

    channel_name = args.url.split('/')[-1]
    print(f"Начинаю обработку {channel_name}... [[6]]")
    
    try:
        numbers, processed_posts = parse_telegram_channel(args.url, args.posts)
    except Exception as e:
        print(f"Критическая ошибка: {str(e)} [[2]]")
        sys.exit(1)
    
    # Сохранение результатов [[4]]
    timestamp = datetime.now().strftime("%Y%m%d")
    filename = f"{channel_name}_{timestamp}.txt"
    
    try:
        with open(filename, 'w', encoding='utf-8') as f:
            f.write('\n'.join(sorted(numbers)))
    except Exception as e:
        print(f"Ошибка записи файла: {str(e)} [[2]]")
        sys.exit(1)
    
    print("\n[[5]] Результаты:")
    print(f"Обработано постов: {processed_posts}")
    print(f"Уникальных номеров: {len(numbers)}")
    print(f"Сохранено в: {filename}")
    print(f"Время выполнения: {time.time() - start_time:.2f} сек")
    
    input("\nНажмите Enter для выхода...")

if __name__ == "__main__":
    start_time = time.time()
    main()

Установка и настройка:

 

Цитата

 

Чтобы запустить скрипт на Windows, выполните следующие шаги:

 
1. Установите Python
Скачайте и установите последнюю версию Python с [официального сайта](Ссылка).
- Во время установки поставьте галочку **«Add Python to PATH»**.
 
2. Установите необходимые библиотеки
Откройте командную строку (Win + R → `cmd` → Enter) и выполните:
pip install requests beautifulsoup4 lxml
3. Сохраните скрипт
- Создайте папку для проекта (например, `C:\TelegramParser`).
- Сохраните файл как `parser.py` в эту папку:
  - Откройте файл в блокноте → Файл → Сохранить как → выберите папку, укажите имя `parser.py`, кодировку UTF-8.
 
4. Запустите скрипт
В командной строке:
cd C:\TelegramParser
python parser.py
- Введите URL Telegram-канала (например: `Ссылка
- Укажите количество постов для обработки.
 
5. Результат
- Номера телефонов сохранятся в файле `channelname_YYYYMMDD.txt`.
- Проверьте файл в папке скрипта.

 

На скринах видно более понятно о каком парсинге идет речь:

 

 

Кому пригодилось, не забываем ставить лайк) спасибо.

Читать на zismo.biz

ZiSMO - самый крупный форум в мире о социальных сетях