JavaRush /Курсы /Python SELF /Загрузка динамического контента с помощью requests_html

Загрузка динамического контента с помощью requests_html

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

1. Динамический контент и JavaScript

Если вы уже освоили основы веб-скрейпинга с помощью библиотек, таких как BeautifulSoup и requests, настало время погрузиться в более увлекательные аспекты этого занятия. Сегодня мы поговорим о том, как можно работать с контентом, который загружается динамически только по мере прокрутки страницы. Ваш браузер может быть не единственным фанатом бесконечных лент, теперь вы сможете научить этому и свои скрипты! 🤖

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

2. Библиотека requests_html

К счастью, как вы уже знаете, в этом мире есть requests_html — библиотека, которая объединяет силу requests и возможностей браузера-подобного рендеринга от Pyppeteer. Эта библиотека позволяет загружать и рендерить страницы с динамическим содержимым, предоставляя вам возможность выполнять JavaScript и даже скроллить страницы.

Установка requests_html

Для начала работы нужно установить библиотеку. Если вы еще не сделали этого, выполните команду:

Bash
pip install requests-html

Работа с requests_html

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

Пример: Загрузка и рендеринг страницы

Начнем с простого случая: загрузка страницы, выполнение JavaScript и извлечение данных. Рассмотрим пример, в котором мы загружаем страницу и получаем текст элемента, который появляется только после выполнения JavaScript.

Python

from requests_html import HTMLSession

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

# Загружаем страницу
response = session.get('https://example.com/dynamic-page')

# Выполняем JavaScript для рендеринга страницы
response.html.render()

# Извлекаем текст элемента, появляющегося после рендеринга
content = response.html.find('#dynamic-content', first=True)
print(content.text)

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

3. Автоматическая прокрутка страниц

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

Пример автоматической прокрутки

Допустим, у вас есть страница с бесконечной лентой новостей, и вы хотите извлечь как можно больше элементов. Вот как это можно сделать:

Python

from requests_html import HTMLSession

session = HTMLSession()
response = session.get('https://example.com/infinite-scroll')

# Рендерим и прокручиваем страницу
response.html.render(scrolldown=5, sleep=1)

# Извлекаем все элементы новостей
news_items = response.html.find('.news-item')

for news_item in news_items:
    print(news_item.text)

Здесь метод render() дополнен параметрами scrolldown и sleep, которые означают, сколько раз мы прокрутим страницу вниз и сколько подождем между прокрутками.

4. Практическое применение

Почему вообще стоит заниматься такой ерундой, как автоматическая прокрутка? 🤔

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

5. Типичные ошибки и их решения

В процессе работы с динамическими страницами и requests_html часто могут возникать ошибки. Рассмотрим несколько распространённых:

Проблема с рендерингом

Иногда метод render() может не завершиться успешно, особенно если страница слишком большая или сложная. В таких случаях помогает увеличение времени рендеринга с помощью параметра timeout, или уменьшение числа прокруток.

Python
response.html.render(timeout=30)

Паразитное выполнение скрипта

Могут быть ситуации, когда JavaScript на странице блокирует выполнение скрипта или вызывает проблемы. Можно попробовать использовать параметр wait для ожидания появления необходимых элементов.

Python
response.html.render(wait=2)

Разрешение экрана и тип устройства

Некоторые сайты могут предоставлять контент в зависимости от разрешения экрана или типа устройства. Проверьте, с каким user-agent выполняется запрос и содержимое рендерится.

Python

response.session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'

6. Что еще почитать

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

На этом моменте вы вооружены всем необходимым для того, чтобы не бояться динамического контента и бесконечных лент. Будьте осторожны, не забудьте указывать, что ваш скрипт — белый хакер, любящий помогать людям автоматизировать их задачи, а не злоумышленник! 😇

Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Y. P. Уровень 37
8 апреля 2025
Предложения для разработчиков курса. Можно ли хотя бы какой то сайт заглушку с тестовыми данными и элементами сделать? Я искренне желаю Вам так же писать код без возможности его проверить, а только использовать example.com.