Instagram Phone Number Parser with GUI and Save Functionality

Answered using ChatGPT 4o by ChatGPT4o

Question:

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

  1. Название проекта: Парсер Instagram для извлечения номеров телефонов подписчиков 2. Цель проекта: разработать парсер Instagram, который извлекает номера телефонов подписчиков из указанных каналов и сохраняет их в текстовом файле.

  2. Функциональные требования:

  • интерфейс с кнопками на русском языке;

  • возможность указать список групп (каналов) для парсинга;

  • возможность выбора конкретной группы из списка для парсинга;

  • возможность запуска пар 4. Функциональные требования (продолжение):

  • возможность выбора интервала времени для парсинга (например, за последние 24 часа, 3 дня и т.д.);

  • возможность выбора количества страниц для парсинга (например, 1, 5, 10 и т.д.);

  • возможность сохранения результатов в текстовом файле с ук

Answer:

Для реализации проекта парсера Instagram, который извлекает номера телефонов подписчиков из указанных каналов и сохраняет их в текстовом файле, нам потребуется использовать несколько библиотек Python. Основные шаги включают создан��е графического интерфейса, выполнение парсинга и сохранение результатов.

Шаг 1: Установка необходимых ��иблиотек

Для начала установим необходимые библиотеки. Нам понадобятся tkinter для создания графического интерфейса, requests для выполнения HTTP-запросов и beautifulsoup4 для парсинга HTML.

pip install requests beautifulsoup4

Шаг 2: Создание графического интерфейса

Создадим графический интерфейс с помощью библиотеки tkinter.

import tkinter as tk
from tkinter import filedialog, messagebox

def start_parsing():
    # Здесь будет логика парсинга
    pass

def save_results():
    # Здесь будет логика сохранения результатов
    pass

root = tk.Tk()
root.title("Парсер Instagram")

# Поле для ��вода списка групп
tk.Label(root, text="Список групп (каналов):").pack()
group_list_entry = tk.Entry(root, width=50)
group_list_entry.pack()

# Поле для выбора интервала времени
tk.Label(root, text="Интервал времени (в днях):").pack()
time_interval_entry = tk.Entry(root, width=10)
time_interval_entry.pack()

# Поле для выбора количества страниц
tk.Label(root, text="Количеств�� страниц:").pack()
page_count_entry = tk.Entry(root, width=10)
page_count_entry.pack()

# Кнопка для запуска парсинга
start_button = tk.Button(root, text="Запустить парсинг", command=start_parsing)
start_button.pack()

# Кнопка для сохранения результатов
save_button = tk.Button(root, text="Сохранить результаты", command=save_results)
save_button.pack()

root.mainloop()

Шаг 3: Реализация логики парсинга

Для парсинга Instagram нам потребуется использовать библиотеку requests для выполнения HTTP-запросов и BeautifulSoup для анализа HTML-кода.

import requests
from bs4 import BeautifulSoup

def start_parsing():
    group_list = group_list_entry.get().split(',')
    time_interval = int(time_interval_entry.get())
    page_count = int(page_count_entry.get())
    
    results = []
    
    for group in group_list:
        for page in range(1, page_count + 1):
            url = f"https://www.instagram.com/{group}/?page={page}"
            response = requests.get(url)
            if response.status_code == 200:
                soup = BeautifulSoup(response.text, 'html.parser')
                # Здесь будет логика и��влечения номеро�� телефонов
                phones = extract_phones(soup)
                results.extend(phones)
            else:
                messagebox.showerror("Ошибка", f"Не удалось получи��ь данные с {url}")
    
    # Сохраняем результаты �� глобальную переменную для после��ующего сохранения
    global parsed_results
    parsed_results = results
    messagebox.showinfo("Успех", "Парсинг завершен")

def extract_phones(soup):
    phones = []
    # Пример логики извлечения номеров телефонов
    for tag in soup.find_all('a', href=True):
        if "tel:" in tag['href']:
            phones.append(tag['href'].replace("tel:", ""))
    return phones

Шаг 4: Сохранение результатов

Теперь добавим функцию для сохранения результатов в текстовый файл.

def save_results():
    if not parsed_results:
        messagebox.showwarning("Внимание", "Нет данных для сохранения")
        return
    
    file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files", "*.txt")])
    if file_path:
        with open(file_path, 'w') as file:
            for phone in parsed_results:
                file.write(phone + "\n")
        messagebox.showinfo("Успех", "Результаты сохранены")

Полный код

import tkinter as tk
from tkinter import filedialog, messagebox
import requests
from bs4 import BeautifulSoup

def start_parsing():
    group_list = group_list_entry.get().split(',')
    time_interval = int(time_interval_entry.get())
    page_count = int(page_count_entry.get())
    
    results = []
    
    for group in group_list:
        for page in range(1, page_count + 1):
            url = f"https://www.instagram.com/{group}/?page={page}"
            response = requests.get(url)
            if response.status_code == 200:
                soup = BeautifulSoup(response.text, 'html.parser')
                phones = extract_phones(soup)
                results.extend(phones)
            else:
                messagebox.showerror("Ошибка", f"Не удалось получить данные с {url}")
    
    global parsed_results
    parsed_results = results
    messagebox.showinfo("Успех", "Парсинг завершен")

def extract_phones(soup):
    phones = []
    for tag in soup.find_all('a', href=True):
        if "tel:" in tag['href']:
            phones.append(tag['href'].replace("tel:", ""))
    return phones

def save_results():
    if not parsed_results:
        messagebox.showwarning("Внимание", "Нет данных для сохранения")
        return
    
    file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files", "*.txt")])
    if file_path:
        with open(file_path, 'w') as file:
            for phone in parsed_results:
                file.write(phone + "\n")
        messagebox.showinfo("Успех", "Результаты сохранены")

root = tk.Tk()
root.title("Парсер Instagram")

tk.Label(root, text="Список групп (каналов):").pack()
group_list_entry = tk.Entry(root, width=50)
group_list_entry.pack()

tk.Label(root, text="Интервал времени (в днях):").pack()
time_interval_entry = tk.Entry(root, width=10)
time_interval_entry.pack()

tk.Label(root, text="Количество страниц:").pack()
page_count_entry = tk.Entry(root, width=10)
page_count_entry.pack()

start_button = tk.Button(root, text="Запустить парсинг", command=start_parsing)
start_button.pack()

save_button = tk.Button(root, text="Сохранить результаты", command=save_results)
save_button.pack()

parsed_results = []

root.mainloop()

Заключение

Этот код создает графический интерфейс для ввода параметров парсинга, выполняет парсинг страниц Instagram и сохраняет результаты в текстовый файл. Обратите внимание, что для реального парсинга Instagram могут потребоваться дополнительн��е шаги, такие к��к авторизация и обработка динамического контента.