Модуль 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 loggingimport osimport timefrom selenium import webdriverfrom selenium.webdriver.firefox.options import Optionsfrom selenium.webdriver.firefox.service import Servicefrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom 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()