JavaRush /Курсы /Python SELF /Работа с динамическими элементами на веб-странице

Работа с динамическими элементами на веб-странице

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

1. Понимание динамических элементов

Давайте начнём с небольшого экскурса в природу динамического контента. Представьте, что вы находитесь на сайте, и как только вы прокручиваете страницу вниз, появляется больше данных, как волшебный ковёр-самолёт, который постоянно расширяется, чтобы вы могли на нём летать. Это называется ленивой загрузкой или "lazy loading" — хитрая техника, которая позволяет экономить ресурсы, загружая контент только по мере его необходимости. Полагаться на статичный HTML в таких случаях — как надеяться, что ваш кот принесёт утренний кофе.

Что такое динамические элементы?

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

2. Стратегии взаимодействия

Приступим к практической магии. Чтобы обработать динамические элементы, нам нужны инструменты, которые понимают: "Жизнь — это движение, и я готов к этому". В нашем волшебном арсенале будет Selenium, так как он позволяет взаимодействовать с браузером почти как человек.

Работа с AJAX-запросами

AJAX — это технология, которая позволяет обновлять часть веб-страницы, не загружая её целиком. Это удобно для пользователей, но немного затрудняет жизнь разработчикам скрейперов. Однако, у нас есть секретное оружие — WebDriverWait и expected_conditions из Selenium.

Python

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

# Настраиваем драйвер
driver = webdriver.Chrome()
driver.get("https://example-dynamic-site.com")

# Ожидание появления элемента
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "dynamic_element_id"))
    )
    print(element.text)
finally:
    driver.quit()

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

При работе с динамическими элементами важно давать браузеру время, чтобы "дойти" до нужного состояния. Методы ожидания, такие как WebDriverWait в сочетании с expected_conditions, позволяют нам плавно дождаться загрузки всех нужных элементов. Это как затащить себя в спортзал — нужно время, но результат стоящий.

Примеры:

  • presence_of_element_located — ждёт, пока элемент появится в DOM.
  • visibility_of_element_located — ждёт, пока элемент станет видимым.
  • element_to_be_clickable — ждёт, пока элемент станет кликабельным.

Вот, например, как можно дождаться кликабельности кнопки:

Python

button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
)
button.click()

Прокрутка страницы

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

Python

# Скроллинг до конца страницы
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

Попробуйте реализовать прокрутку в цикле, чтобы подгрузить весь контент:

Python

SCROLL_PAUSE_TIME = 2
driver.get("https://example.com/dynamic-content")

last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Подождите, чтобы страница подгрузила контент
    WebDriverWait(driver, SCROLL_PAUSE_TIME)

    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

3. Практические примеры взаимодействия

Теперь, когда мы научились ждать и наблюдать, пора применить эти навыки на практике и поймать все эти динамические данные.

Предположим, у нас есть страница с товарами, которая загружается при прокрутке вниз. Нам нужно извлечь название и цену каждого продукта:

Python

products = []

while True:
    # Прокрутка вниз
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Ждать загрузки новых элементов
    WebDriverWait(driver, SCROLL_PAUSE_TIME)

    # Извлечение данных товаров
    items = driver.find_elements(By.CLASS_NAME, "product-item")
    for item in items:
        name = item.find_element(By.CLASS_NAME, 'product-name').text
        price = item.find_element(By.CLASS_NAME, 'product-price').text
        products.append({'name': name, 'price': price})

    # Проверка, загрузилось ли что-то новое
    # (наивный способ: если список items не увеличился, выходим)
    if len(products) == last_known_count:
        break
    last_known_count = len(products)

Когда динамические элементы не загружаются так быстро, как бы нам хотелось, приходится проявлять терпение и сноровку. WebDriverWait со своим арсеналом условий, прокрутка страницы и JavaScript-инъекции — это наш ключ к завоеванию мира динамического контента. Как говорил великий Джедай: "Терпение, мой юный падаван". В нашем случае терпение означает успешный скрейпинг всех данных.

Завершаем сессию так же, как после успешного рабочего дня — аккуратно.

Python

driver.quit()

Не забудьте: напоследок важно убедиться, что ваш код работает корректно, без сбоев и ошибок. Только так вы можете с уверенностью сказать: "Миссия выполнена". Желаю удачи в вашем путешествии по миру динамических данных!

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ