Модуль SeleniumWebNavigator

Модуль SeleniumWebNavigator предоставляет удобный интерфейс для работы с интернет-реквестами и парсингом страниц сайтов с использованием Selenium WebDriver. Этот модуль позволяет ботам подключаться к интернету и извлекать необходимую информацию без необходимости дублирования кода в каждом из них.

Основные функции

  • Инициализация WebDriver для управления браузером Firefox.
  • Поддержка режима без головы (headless) для невидимого выполнения скрипта.
  • Навигация по указанным URL-адресам.
  • Ожидание загрузки определенных элементов на странице.
  • Закрытие браузера по завершении работы.

Пример использования

from SeleniumWebNavigator import SeleniumWebNavigator

navigator = SeleniumWebNavigator()

url = "https://example.com"
if navigator.navigate_to_url(url):
    element = navigator.wait_for_element(By.TAG_NAME, "h1")
    if element:
        print(element.text)

navigator.quit()
        

Структура проекта

Модуль SeleniumWebNavigator можно разместить в отдельном файле SeleniumWebNavigator.py, который используется в других проектах или ботах:

/ваш_проект
│
├── main.py                   # Ваш главный скрипт или бот
├── SeleniumWebNavigator.py   # Модуль для работы с интернетом через Selenium
└── /другие_файлы_и_папки_проекта

Код SeleniumWebNavigator.py:

import logging
import os
import time
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import WebDriverException, TimeoutException

logger = logging.getLogger(__name__)

class SeleniumWebNavigator:
    def __init__(self, geckodriver_path="/usr/bin/geckodriver", headless=True, timeout=180):
        self.geckodriver_path = geckodriver_path
        self.headless = headless
        self.timeout = timeout
        self.driver = self._init_driver()

    def _init_driver(self):
        if not os.path.exists(self.geckodriver_path):
            logger.error(f"Geckodriver не найден по пути: {self.geckodriver_path}")
            return None
        
        options = Options()
        options.add_argument("--no-sandbox")
        options.add_argument("--disable-dev-shm-usage")
        if self.headless:
            options.add_argument("--headless")
        
        service = Service(executable_path=self.geckodriver_path)
        
        try:
            driver = webdriver.Firefox(service=service, options=options)
            driver.set_page_load_timeout(self.timeout)
            logger.info("WebDriver успешно запущен")
            return driver
        except Exception as e:
            logger.error(f"Ошибка запуска WebDriver: {e}")
            return None

    def navigate_to_url(self, url):
        if not self.driver:
            logger.error("WebDriver не инициализирован")
            return False
        try:
            self.driver.get(url)
            logger.info(f"Навигация к {url} успешна")
            return True
        except (WebDriverException, TimeoutException) as e:
            logger.error(f"Ошибка навигации на {url}: {e}")
            return False

    def wait_for_element(self, by, value, wait_time=10):
        if not self.driver:
            logger.error("WebDriver не инициализирован")
            return None
        try:
            element = WebDriverWait(self.driver, wait_time).until(
                EC.presence_of_element_located((by, value))
            )
            logger.info(f"Элемент {value} найден")
            return element
        except TimeoutException:
            logger.error(f"Элемент {value} не найден в течение {wait_time} секунд")
            return None

    def quit(self):
        if self.driver:
            self.driver.quit()
            logger.info("WebDriver закрыт")

# Пример использования
if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    navigator = SeleniumWebNavigator()
    
    url = "https://example.com"
    if navigator.navigate_to_url(url):
        element = navigator.wait_for_element(By.TAG_NAME, "h1")
        if element:
            print(element.text)

    navigator.quit()