Пример: Плавная прокрутка страницы вниз на Selenium и переход по страницам

В этой статье мы рассмотрим пример использования Selenium для реализации прокрутки страницы. Этот скрипт демонстрирует, как автоматизировать плавную прокрутку вниз по странице, имитируя поведение пользователя, и переходить между страницами пагинации. Такой подход полезен для парсинга многостраничных сайтов, где нужно загрузить все элементы, включая те, что появляются при скролле (infinite scroll) или распределены по страницам. Пример можно использовать для сбора данных с блогов, каталогов товаров или форумов, где контент загружается динамически.

Для чего можно использовать этот пример?

Этот код идеально подходит для следующих задач:

  • Автоматизация парсинга многостраничных сайтов: Плавная прокрутка и переход по страницам позволяют собрать все данные без пропусков.
  • Имитация пользовательского поведения: Медленная прокрутка помогает избежать блокировок от антибот-систем.
  • Тестирование интерфейсов: Проверка загрузки контента при скролле и навигации.
  • Сбор данных для анализа: Автоматическое прохождение по всем страницам для извлечения информации.

Необходимые инструменты

Для работы скрипта потребуется установить Python, а также библиотеки Selenium. Selenium позволяет управлять браузером, включая прокрутку и клики. Убедитесь, что ChromeDriver установлен и доступен в PATH.

Установка необходимых библиотек.

pip install selenium webdriver-manager

Основные модули и импорты Selenium для Python

Код программы

Ниже приведён полный код с подробными комментариями, который реализует плавную прокрутку страницы Selenium и автоматизированный переход по страницам пагинации на примере сайта parsertools.ru.

Основной код программы для работы с Selenium

import time  # Импорт модуля time для создания пауз между действиями
from selenium import webdriver  # Основная библиотека Selenium для работы с браузером
from selenium.webdriver.common.by import By  # Модуль для указания способов поиска элементов (By.CSS_SELECTOR, By.ID и т.д.)
from selenium.webdriver.chrome.service import Service  # Класс для управления сервисом ChromeDriver
from selenium.webdriver.chrome.options import Options  # Класс для настройки опций браузера Chrome


def smooth_scroll(driver, pause=0.3, step=300):
    """
    Функция для плавной прокрутки страницы вниз в Selenium.
    
    Эта функция реализует постепенную прокрутку, чтобы имитировать поведение реального пользователя.
    Полезна для загрузки динамического контента и избежания обнаружения автоматизации.
    
    :param driver: экземпляр webdriver - объект для управления браузером
    :param pause: пауза между шагами прокрутки (в секундах), регулирует скорость движения
    :param step: количество пикселей на шаг прокрутки, определяет гранулярность
    """
    # Получаем полную высоту документа страницы через JavaScript
    last_height = driver.execute_script("return document.body.scrollHeight")
    pos = 0  # Начальная позиция прокрутки (верх страницы)

    # Цикл продолжается, пока текущая позиция меньше полной высоты страницы
    while pos < last_height:
        pos += step  # Увеличиваем позицию на шаг
        # Выполняем JavaScript-команду для прокрутки к новой позиции (0 - по горизонтали, pos - по вертикали)
        driver.execute_script(f"window.scrollTo(0, {pos});")
        time.sleep(pause)  # Пауза для плавности и загрузки контента

    # Финальная прокрутка до самого низа страницы для гарантии полной загрузки
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")


def main():
    # URL сайта для тестирования - страница с примерами на parsertools.ru
    url = "https://parsertools.ru/primers"

    # Создание объекта опций для настройки браузера Chrome
    options = Options()
    # Аргумент для запуска браузера в максимально развернутом окне
    options.add_argument("--start-maximized")
    # Создание сервиса для ChromeDriver (предполагается, что он установлен в PATH)
    service = Service()
    # Инициализация драйвера Chrome с указанными опциями и сервисом
    driver = webdriver.Chrome(service=service, options=options)

    try:
        # Загрузка начальной страницы сайта
        driver.get(url)
        # Пауза 2 секунды для полной загрузки контента и JavaScript-элементов
        time.sleep(2)

        # Бесконечный цикл для обработки всех страниц пагинации
        while True:
            # Шаг 1: Плавная прокрутка страницы до конца для загрузки всех элементов
            smooth_scroll(driver, pause=0.3, step=300)
            # Дополнительная пауза внизу страницы для завершения загрузки
            time.sleep(2)

            # Шаг 2: Поиск и определение номера текущей страницы по CSS-селектору
            current_page = driver.find_element(By.CSS_SELECTOR, ".page-numbers.current").text
            # Вывод информации о текущей странице в консоль для мониторинга
            print(f"Сейчас на странице: {current_page}")

            # Шаг 3: Поиск элементов кнопки "Следующая страница" (возвращает список)
            next_button = driver.find_elements(By.CSS_SELECTOR, ".wp-block-query-pagination-next")

            # Проверка наличия кнопки следующей страницы
            if next_button:
                # Вывод сообщения о переходе
                print("Переход на следующую страницу...")
                # Клик по первой найденной кнопке (индекс 0)
                next_button[0].click()
                # Пауза для загрузки новой страницы и её элементов
                time.sleep(2)
            else:
                # Если кнопка отсутствует, это последняя страница - выход из цикла
                print("Достигли последней страницы. Работа завершена.")
                break

    finally:
        # Блок finally гарантирует закрытие браузера даже при ошибках
        # Дополнительная пауза перед закрытием для просмотра результата
        time.sleep(2)
        # Закрытие экземпляра драйвера и освобождение ресурсов
        driver.quit()


# Точка входа в программу - проверка, если скрипт запущен напрямую
if __name__ == "__main__":
    main()  # Вызов основной функции

Как работает скрипт?

В этом примере скрипт Selenium выполняет следующие действия:

  • Инициализация браузера: Настройка Chrome с опциями для максимального окна и создание драйвера.
  • Загрузка страницы: Переход на URL и пауза для полной загрузки.
  • Плавная прокрутка: Функция smooth_scroll постепенно скроллит вниз, используя JavaScript, с паузами для имитации пользователя.
  • Навигация по страницам: Определение текущей страницы, поиск и клик по кнопке "Далее", повтор до последней страницы.
  • Завершение: Автоматическое закрытие браузера после обработки всех страниц.

Этот пример полезен для автоматизации навигации по сайтам с пагинацией, где стандартная прокрутка Selenium может быть слишком резкой. Он повышает эффективность парсинга, минимизируя риски блокировок, и легко адаптируется под другие сайты.

Больше примеров по парсингу на parsertools.ru/primers.