Урок 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.
