Урок 19. Работа с JavaScript и динамическим контентом через Selenium

В современном вебе многие страницы используют JavaScript для динамической подгрузки данных. Для парсинга таких страниц обычного поиска элементов бывает недостаточно. В этом уроке мы разберем, как использовать Selenium для работы с динамическим контентом и выполнять JavaScript на странице.

Импорт и подготовка

Подключаем необходимые модули и открываем браузер:

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

# Настройка браузера
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://parsertools.ru/primers")
wait = WebDriverWait(driver, 10)
time.sleep(2)  # Пауза для полной загрузки страницы

Выполнение JavaScript

Selenium позволяет выполнять собственный JavaScript код на странице через метод execute_script. Например, можно получить текущий URL или прокрутить страницу до низа:

# Получаем текущий URL через JS
current_url = driver.execute_script("return window.location.href;")
print("Текущий URL:", current_url)

# Прокрутка страницы до конца
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)  # Пауза для загрузки динамического контента

Ожидание появления динамических элементов

Для динамических элементов лучше использовать явное ожидание (WebDriverWait) с условиями:

# Ждем появления кнопки "Показать ещё"
show_more_btn = wait.until(
    EC.element_to_be_clickable((By.XPATH, "//div[contains(text(), 'Показать ещё')]"))
)
print("Кнопка 'Показать ещё' доступна")

Извлечение динамически подгруженных данных

После выполнения JavaScript или прокрутки можно собирать новые элементы, которые были загружены на страницу:

# Собираем все карточки примеров
examples = driver.find_elements(By.CSS_SELECTOR, "div.wp-block-post-content")
for idx, example in enumerate(examples, start=1):
    title = example.find_element(By.TAG_NAME, "h2").text.strip()
    print(f"{idx}. {title}")

Полный пример кода

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

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://parsertools.ru/primers")
wait = WebDriverWait(driver, 10)

page = 1
all_titles = []

while True:
    print(f"📄 Страница {page}")

    # Собираем карточки примеров
    examples = driver.find_elements(By.CSS_SELECTOR, "div.wp-block-post-content")
    for idx, example in enumerate(examples, start=1):
        title = example.find_element(By.TAG_NAME, "h2").text.strip()
        all_titles.append(title)
        print(f"{len(all_titles)}. {title}")

    # Проверяем наличие ссылки "Следующая страница"
    try:
        next_btn = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, "a.wp-block-query-pagination-next"))
        )
        next_btn.click()
        page += 1
        time.sleep(7)  # ждём загрузку новой страницы
    except:
        print("❌ Больше страниц нет")
        break

driver.quit()

Советы

  • Используйте execute_script для прокрутки и выполнения JS кода на странице.
  • WebDriverWait помогает корректно дождаться появления элементов перед взаимодействием.
  • Комбинация JavaScript и Selenium идеально подходит для динамических страниц с подгрузкой контента.

Этот урок полезен для тех, кто хочет парсить современные веб-страницы с динамическим контентом и кнопками «Показать ещё», AJAX-запросами и другими интерактивными элементами.

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