JavaRush /Курсы /Python SELF /Работа с JavaScript-контентом

Работа с JavaScript-контентом

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

1. Введение в динамические страницы

Если вы когда-либо пытались скрейпить данные с сайтов, которые обновляют контент на лету благодаря JavaScript, то знаете, что это может быть настоящей головоломкой. Но не пугайтесь! Как говорится, любой сложный код можно настроить так, чтобы он выглядел как магия. Давайте разберемся, как requests_html позволяет нам работать с таким контентом.

Как известно, не все веб-страницы одинаково полезны. Некоторые страницы загружают контент сразу, в то время как другие могут генерировать или обновлять его динамически с помощью JavaScript. Это создает некоторые сложности для тех, кто хочет извлечь данные, поскольку HTML, который вы видите с помощью инструментов для разработчиков, может отличаться от HTML, который вы получите при стандартном запросе.

Проблемы, возникающие при скрейпинге динамического контента

Большинство библиотек для работы с вебом, такие как requests, работают только с серверными ответами и не могут выполнять JavaScript. Это значит, что если контент загружается или изменяется через JavaScript, вы можете вообще его не увидеть при стандартном запросе.

2. Использование библиотеки requests_html

И вот тут на сцену выходит requests_html — библиотека, которая объединяет в себе простоту requests и мощь браузера для выполнения JavaScript. Она предоставляет вам базовый движок для рендеринга, который позволяет взаимодействовать с динамическими веб-страницами так, будто вы используете настоящий браузер.

Установка и настройка библиотеки

Для начала работы давайте установим requests_html. Откройте ваш любимый терминал и выполните следующую команду:

Bash
pip install requests-html

Прекрасно, библиотека установлена! Теперь мы можем с ней работать.

Основы использования requests_html для извлечения JavaScript-контента

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

Python

from requests_html import HTMLSession

# Создаем сессию HTML
session = HTMLSession()

# Выполняем запрос к веб-странице
response = session.get('https://example-dynamic-page.com')

# Рендерим JavaScript
response.html.render()

# Извлекаем данные
data = response.html.find('#dynamic-content', first=True)
print(data.text)

Это магия! В отличие от requests, requests_html предоставляет нам метод .render(), который позволяет "прокрутить" страницу и выполнить JavaScript. Как только страница "оживает", вы можете извлечь все необходимые данные, используя селекторы, которые мы изучали ранее.

3. Примеры извлечения данных

Теперь давайте углубимся и рассмотрим несколько примеров, чтобы вы могли увидеть, как requests_html выручает нас в самых разных сценариях.

Практическое извлечение данных с динамических страниц

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

Python

url = 'https://example-news-site.com'

# Загружаем страницу
response = session.get(url)

# Выполняем рендеринг с увеличением таймаута, если необходимо
response.html.render(timeout=20)

# Находим элементы с новостями
news_items = response.html.find('.news-item')

for item in news_items:
print(item.text)

Вот как легко и ненавязчиво мы получили доступ к контенту, который раньше казался неуловимым!

Обработка загруженного JavaScript-контента с помощью requests_html

С помощью requests_html и CSS-селекторов, которые мы рассмотрели в предыдущих лекциях, вы можете работать с контентом на веб-страницах так, как будто вы уже много лет практикуетесь в скрейпинге!

Python

# Выбираем первый элемент новостного заголовка
headline = response.html.find('.news-headline', first=True)
print(headline.text)

# Извлекаем ссылку из элемента
link = headline.find('a', first=True).attrs['href']
print(link)

4. Практические советы и трюки

Хотя requests_html — мощный инструмент, при работе с ним стоит помнить о нескольких вещах:

  • Таймауты и задержки: Не забывайте настраивать таймауты рендеринга для более сложных страниц. Это поможет избежать ошибок из-за медленных загрузок.
  • Мощности рендеринга: requests_html может потреблять много ресурсов, так как рендерит JavaScript. Для больших объемов данных или сложных страниц это может замедлить процесс.
  • CAPTCHA и защиты от ботов: requests_html не обходит антибот-защит и CAPTCHA, поэтому для более сложных случаев лучше использовать Selenium.
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Максим (upsarin) Уровень 34
7 марта 2025
При попытке импорта from requests_html import HTMLSession возвращается ошибка ImportError: lxml.html.clean module is now a separate project lxml_html_clean. Install lxml[html_clean] or lxml_html_clean directly. Надо дополнительно установить pip install lxml_html_clean
Максим (upsarin) Уровень 34
7 марта 2025
Ещё одна ошибка - Chromium revision error при попытке render страницы. Как исправить: выставить переменную окружения PYPPETEER_CHROMIUM_REVISION = '1263111'
Anonymous #3540844 Уровень 1
8 декабря 2025
Уже версия 1181217