Модуль 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()