Выбор случайного User-Agent и проверка IP (Python + requests + tkinter)

При парсинге или автоматизации работы с веб-сайтами важно уметь маскировать свои запросы. Многие сайты проверяют заголовок User-Agent, который указывает, с какого устройства и браузера поступает запрос. Если всегда использовать стандартный User-Agent библиотеки requests, сайт может быстро заподозрить автоматизацию и заблокировать доступ.

В этой примере мы разберём, как:

  • Подключить список User-Agent’ов из файла.
  • Случайным образом выбирать один из них для каждого запроса.
  • Отправлять запросы на сервис httpbin.org, который позволяет увидеть, как сервер видит ваш User-Agent и IP-адрес.
  • Выводить результат в удобное графическое окно с помощью tkinter.
  • Подготовка списка User-Agent

    В отдельный файл user_agents.txt мы добавляем список строк, каждая из которых соответствует определённому браузеру или устройству. Например:
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0 Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1
    Каждый раз программа будет выбирать случайный вариант, что имитирует работу нового пользователя.

    Полный код

    import random
    import requests
    import tkinter as tk
    from tkinter import ttk
    
    # Читаем user-agents из файла
    with open('user_agents.txt', 'r', encoding='utf-8') as f:
        user_agents = [line.strip() for line in f if line.strip()]
    
    if not user_agents:
        raise SystemExit("Файл user_agents.txt пуст или не найден")
    
    # Выбираем случайный User-Agent
    user_agent = random.choice(user_agents)
    
    # Заголовки с выбранным user-agent
    headers = {'User-Agent': user_agent}
    
    # Функция для отображения окна
    def show_modal(user_agent_response, ip_response):
        root = tk.Tk()
        root.title("User Agent и IP")
        root.geometry("480x260")
        root.resizable(False, False)
    
        style = ttk.Style()
        style.configure("TLabel", font=("Segoe UI", 11), padding=4)
    
        frame = ttk.Frame(root, padding=12)
        frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
    
        ttk.Label(frame, text="User-Agent:", style="TLabel").grid(row=0, column=0, sticky=tk.W)
        ttk.Label(frame, text=user_agent_response, style="TLabel", wraplength=440).grid(row=1, column=0, sticky=tk.W, pady=(0,8))
    
        ttk.Label(frame, text="IP:", style="TLabel").grid(row=2, column=0, sticky=tk.W)
        ttk.Label(frame, text=ip_response, style="TLabel", wraplength=440).grid(row=3, column=0, sticky=tk.W, pady=(0,12))
    
        ttk.Button(frame, text="Закрыть", command=root.destroy).grid(row=4, column=0, pady=6)
    
        try:
            root.eval('tk::PlaceWindow . center')
        except Exception:
            pass
    
        root.mainloop()
    
    # Запрос к httpbin.org
    try:
        resp1 = requests.get('https://httpbin.org/user-agent', headers=headers, timeout=10)
        resp1.raise_for_status()
        user_agent_response = resp1.json().get('user-agent', str(resp1.text))
    except Exception as e:
        user_agent_response = f"Error: {str(e)}"
    
    try:
        resp2 = requests.get('https://httpbin.org/ip', headers=headers, timeout=10)
        resp2.raise_for_status()
        ip_response = resp2.json().get('origin', str(resp2.text))
    except Exception as e:
        ip_response = f"Error: {str(e)}"
    
    show_modal(user_agent_response, ip_response)
    

    Результат

    Как работает программа

  • Загружаем список User-Agent из текстового файла.
  • Выбираем случайный элемент с помощью random.choice().
  • Добавляем его в заголовки HTTP-запроса.
  • Отправляем запросы на сервис httpbin.org:
  • Используем библиотеку tkinter, чтобы показать результат в графическом модальном окне, а не просто в консоли.
  • ⚠️ Важно: код предназначен для только для тестов. Для парсинга используйте его с прокси и задержками.

    Советы

    Зачем это нужно?

  • При парсинге важно менять User-Agent, чтобы уменьшить риск блокировки.
  • Можно совмещать User-Agent с прокси, чтобы подменять ещё и IP-адрес.
  • Такой подход полезен и в тестировании сайтов, чтобы видеть, как страницы отображаются на разных устройствах.
  • Итог

    Мы создали универсальный скрипт на Python, который случайным образом выбирает User-Agent, отправляет запросы к тестовому сервису и показывает результат в удобном графическом интерфейсе. Это полезный инструмент как для парсинга, так и для обучения работе с HTTP-заголовками.

    Больше уроков по парсингу на parsertools.ru/primers.