JavaRush /Курсы /Python SELF /Оптимизация скрипта для стабильной работы и минимизации о...

Оптимизация скрипта для стабильной работы и минимизации ошибок

Python SELF
38 уровень , 3 лекция
Открыта

1. Анализ производительности

Зачем нужна оптимизация?

Представьте себе мощный автомобиль, который способен разгоняться до 100 км/ч за три секунды, но при этом ест бензин как кит — планктон. Вот и ваш скрипт может быть очень быстрым, но крайне "прожорливым", если говорить о ресурсах и времени исполнения. Более того, "утечки" ресурсов могут сделать его нестабильным, что в свою очередь может привести к ошибкам. Оптимизация помогает избежать подобных проблем.

Первым делом, как говорят хирурги, делаем "разрез". Проведем анализ производительности нашего скрипта, чтобы понять, где он может "страдать".

Методы проверки скорости и стабильности исполнения скрипта

Одним из простых способов анализа является использование базовых средств Python, таких как модуль time. Давайте добавим в наш скрипт пару строк, чтобы понять, какие операции занимают больше всего времени.

Python

import time

start_time = time.time()
# Здесь ваш код для выполнения действий с Selenium
end_time = time.time()

print(f"Время выполнения: {end_time - start_time} секунд")
  

Этот небольшой фрагмент кода поможет вам определить, сколько времени занимает выполнение части кода. С помощью таких "таймеров" можно локализовать "узкие" места.

Идентификация слабых мест и их оптимизация

Как только вы найдете часть кода, которая "жрет" время, можно принимать меры. Может быть, вы обращаетесь к динамическим элементам чаще, чем это необходимо, или ваш код стал похож на "спагетти". Первый шаг — идентификация, второй — действия.

Снижение количества запросов: Проверьте, не делаете ли вы много лишних переходов по страницам или обновлений DOM. Например, использование метода WebDriverWait помогает запускать скрипт только после полной загрузки желаемых элементов.

Python

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, 'myDynamicElement'))
)
  

Кэширование данных: Если вы работаете с одними и теми же данными многократно, подумайте о кэшировании. Храните данные в переменных или кэше для минимизации ресурсоемких операций.

2. Улучшение структуры скрипта

Если ваш код читабелен как карта метро без указателей и названий станций, пора его улучшить. Оптимальная структура кода — залог легкого понимания и, соответственно, ошибкоустойчивости.

Использование пайплайнов данных и оптимальных алгоритмических решений

Подумайте над структурацией вашего кода в виде пайплайнов, где каждая функция или модуль отвечает за свой кусочек логики. Подразделение кода на логические блоки не только улучшает читаемость, но и упрощает отладку.

Python

def load_page(url):
    driver.get(url)

def extract_data():
    # Код для извлечения данных
    pass

def save_data():
    # Код для сохранения данных
    pass

load_page("http://example.com")
extract_data()
save_data()
  

Улучшение читаемости и тестируемости кода

Следуйте принципу "одна функция — одна задача". Это облегчит тестирование и рефакторинг. Используйте именованные константы вместо "магических чисел" и строк для большей ясности.

Python

MAX_RETRIES = 5

def fetch_data_with_retry():
    for attempt in range(MAX_RETRIES):
        try:
            # Попытка запроса данных
            pass
        except Exception as e:
            print(f"Попытка {attempt+1} не удалась: {e}")
  

3. Если код можно улучшить - его нужно улучшить

Используйте явные ожидания вместо неявных

Явные ожидания позволяют точно контролировать, когда Selenium начинает выполнять действия, дождавшись появления нужных элементов. Вместо того чтобы полагаться на неявные ожидания (например, implicitly_wait), используйте библиотеку WebDriverWait, которая позволяет настроить ожидания для конкретных элементов на основе условий (например, элемент виден, доступен для клика и т.д.).

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

Python

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.ID, "target_element"))
)
  

Убедитесь в готовности страницы

После загрузки страницы не всегда сразу доступны все элементы, особенно если сайт использует асинхронные методы загрузки (AJAX). Используйте document.readyState для проверки полной загрузки документа перед началом взаимодействия.

Пример проверки полной загрузки страницы

Python

def wait_for_page_load(driver):
    WebDriverWait(driver, 10).until(
        lambda d: d.execute_script("return document.readyState") == "complete"
    )
  

Минимизируйте использование time.sleep

Метод time.sleep() заставляет скрипт ждать фиксированное время и замедляет его работу, особенно при длинных задержках. Вместо этого используйте WebDriverWait, который более гибкий и завершает ожидание, как только нужное условие выполнено.

Используйте устойчивые пути к элементам

Хрупкие локаторы, такие как пути XPath, которые зависят от определенных HTML-структур, могут быстро перестать работать, если структура сайта изменится. Чтобы этого избежать, старайтесь использовать более устойчивые локаторы, например, атрибуты id, name, class и data-*, которые более стабильны.

Пример надежного использования атрибутов

Python

# Используем id для поиска, если доступен
element = driver.find_element(By.ID, "submit_button")

# Если нет id, можно использовать атрибут data-* или уникальные классы
element = driver.find_element(By.CSS_SELECTOR, "[data-role='main-button']")
  

Закрывайте всплывающие окна и баннеры

Некоторые сайты содержат всплывающие окна, которые мешают выполнению скрипта. Обработка таких элементов позволяет избегать блокировки основных действий.

Пример закрытия всплывающего окна

Python

from selenium.common.exceptions import ElementClickInterceptedException

try:
    close_popup = driver.find_element(By.CLASS_NAME, "popup-close-button")
    close_popup.click()
except (NoSuchElementException, ElementClickInterceptedException):
    pass  # Игнорируем, если элемент не найден или закрытие невозможно
  

Настройте обработку логирования

Логирование помогает отслеживать действия скрипта и выявлять ошибки в работе. Используйте встроенный модуль logging для логирования каждого важного шага скрипта, что облегчит отладку и анализ.

Пример настройки логирования

Python

import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

logging.info("Скрипт запущен")
logging.warning("Элемент не найден, продолжаем работу")
logging.error("Возникла ошибка")
  

Проверяйте видимость элементов перед взаимодействием

Иногда элементы загружаются на странице, но невидимы или недоступны для взаимодействия. Используйте WebDriverWait с условием element_to_be_clickable, чтобы убедиться, что элемент доступен перед кликом или вводом данных.

Python

from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.ID, "button_id"))
)
element.click()
  

Обрабатывайте ошибки соединения и таймауты

При скрейпинге веб-сайтов иногда происходят ошибки соединения или таймауты, когда сервер не отвечает на запросы. Настройте обработку таких ошибок, чтобы скрипт мог пропустить или повторить действия в случае временной недоступности сайта.

Пример обработки ошибок соединения

Python

from selenium.common.exceptions import TimeoutException

try:
    driver.get("https://example.com")
except TimeoutException:
    logging.error("Не удалось подключиться к странице. Переход к следующей задаче.")
  

Закрывайте браузер

Чтобы избежать накопления ресурсов и закрытия браузера в случае ошибок, всегда используйте try-finally или конструкции, чтобы завершить работу корректно.

Python

try:
    # Ваши действия с Selenium
    pass
finally:
    driver.quit()  # Закрытие браузера
  

4. Типичные ошибки новичков

Не забывайте обновлять веб-драйверы и библиотеки. Это поможет избежать несовместимости и ошибок, связанных с обновлениями браузера и изменениями в API Selenium.

И на последок, если ваш скрипт часто "валится" без явной причины, возможно, ваш тестовый сервер блокирует частые запросы. Проверьте, не нарушаете ли вы правила доступа, и подумайте об использовании прокси-серверов или регулировке частоты запросов.

Оптимизация скриптов — это не просто техническая задача, а искусство, которое приходит с опытом. Надеюсь, сегодняшние советы помогут вам создать надежные и стабильные скрипты, которые выдержат любую нагрузку.

Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Davich Уровень 44
23 августа 2025
Условие задачи :Время ожидания не должно превышать 15 секунд. Установил 10 сек Получаешь ошибку - Нужно исправить на 15 👏
Ioanna Polyak Уровень 43
11 сентября 2025
Ну исправь В чем затык?
Davich Уровень 44
17 сентября 2025
Как скажешь...