Демонстрация эмуляции User-Agent в Selenium

Этот пример демонстрирует, как использовать библиотеку Selenium для запуска браузера Chrome с различными User-Agent, эмулируя разные браузеры и устройства, такие как Chrome, Firefox, Edge, Safari на macOS и iOS. Код выполняет следующие действия:

  1. Создание директории для скриншотов: Функция ensure_screenshot_directory() создаёт папку screenshots, если она не существует.
  2. Отображение сообщений: Функция show_message() показывает всплывающие окна с информацией о текущем User-Agent.
  3. Запуск браузера: Функция run_browser_with_user_agent() запускает Chrome с указанным User-Agent, загружает страницу https://webmaster-tools.online/tool/user-agent-finder, делает скриншот и сохраняет его в папку screenshots.
  4. Проверка User-Agent: Используется библиотека requests для получения User-Agent с сайта и вывода его в консоль.
  5. Перебор User-Agent: Основной цикл проходит по списку available_user_agents, применяя каждый User-Agent с задержкой в 3 секунды между запусками и задержкой перед закрытием окна в 15 секунд.
  6. Обработка ошибок: Код включает обработку исключений для случаев, когда браузер не запускается или возникают проблемы при загрузке страницы.

Каждый User-Agent сопровождается описанием, а результат работы — скриншот страницы с именем, соответствующим User-Agent.

Урок по этой теме с описанием можно посмотреть здесь.

import os
import time
import tkinter as tk
from tkinter import messagebox
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.common.exceptions import WebDriverException
from webdriver_manager.chrome import ChromeDriverManager
import requests  # Для получения User-Agent с сайта

# Задержка между запусками в секундах
DELAY = 3

# Список различных User-Agent для эмуляции браузеров
available_user_agents = [
    (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
        "Google Chrome (Windows, последняя версия)"
    ),
    (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0",
        "Mozilla Firefox (Windows, последняя версия)"
    ),
    (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0",
        "Microsoft Edge (Windows, последняя версия)"
    ),
    (
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_6_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",
        "Safari (macOS, последняя версия)"
    ),
    (
        "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1",
        "Safari (iOS, iPhone, последняя версия)"
    )
]

def ensure_screenshot_directory():
    """Создаёт директорию screenshots, если она не существует."""
    screenshot_dir = os.path.abspath("screenshots")
    if not os.path.exists(screenshot_dir):
        os.makedirs(screenshot_dir)
    return screenshot_dir

def show_message(title, message):
    """Отображает всплывающее окно с указанным заголовком и сообщением."""
    root = tk.Tk()
    root.withdraw()  # Скрываем основное окно
    messagebox.showinfo(title, message)
    root.destroy()

def run_browser_with_user_agent(index, user_agent, desc):
    """Запускает браузер с выбранным User-Agent и делает скриншот."""
    # Показываем всплывающее окно с текущей задачей
    show_message("Текущая задача", f"User-Agent: {user_agent}\nОписание: {desc}")

    print(f"\n=== Запуск браузера с User-Agent: {desc} ===")

    # Настройка Chrome с выбранным User-Agent
    opts = webdriver.ChromeOptions()
    opts.add_argument(f"--user-agent={user_agent}")

    try:
        driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opts)
    except WebDriverException as e:
        print(f"🚫 Ошибка при запуске браузера с User-Agent '{desc}': {e}")
        return

    try:
        url = "https://webmaster-tools.online/tool/user-agent-finder"
        print(f"📄 Загружаем страницу: {url}")
        driver.get(url)
        time.sleep(15)  # Ждём загрузки страницы

        # Получаем User-Agent с сайта
        try:
            response = requests.get(url, headers={"User-Agent": user_agent})
            if response.status_code == 200:
                print(f"🏷️ User-Agent, полученный с сайта: {response.json()['user-agent']}")
            else:
                print(f"⚠️ Не удалось получить User-Agent с сайта: {response.status_code}")
        except Exception as e:
            print(f"⚠️ Ошибка при запросе User-Agent: {e}")

        # Сохраняем скриншот
        screenshot_dir = ensure_screenshot_directory()
        screenshot_name = f"screenshot_{index}_{desc.replace(' ', '_').replace('(', '').replace(')', '')}.png"
        screenshot_path = os.path.join(screenshot_dir, screenshot_name)
        driver.save_screenshot(screenshot_path)
        print(f"📸 Скриншот сохранён: {screenshot_path}")

    except Exception as e:
        print(f"🚫 Ошибка при работе с браузером: {e}")
    finally:
        driver.quit()
        print("🔌 Браузер закрыт.")

if __name__ == "__main__":
    # Приветственное сообщение
    print("🎉 Добро пожаловать в демонстрацию User-Agent в Selenium!")
    print(f"Каждый User-Agent будет запущен с задержкой в {DELAY} секунд.\n")

    # Перебираем все User-Agent
    for i, (user_agent, desc) in enumerate(available_user_agents, start=1):
        run_browser_with_user_agent(i, user_agent, desc)
        print(f"\n⏳ Ожидание {DELAY} секунд перед следующим запуском...")
        time.sleep(DELAY)

    print("\n🎉 Все User-Agent протестированы! Проверьте папку 'screenshots' для результатов.")