CodeGym /Cursos /Python SELF ES /Carga de contenido dinámico usando requests_html

Carga de contenido dinámico usando requests_html

Python SELF ES
Nivel 33 , Lección 4
Disponible

1. Contenido dinámico y JavaScript

Si ya manejas los conceptos básicos del web scraping usando bibliotecas como BeautifulSoup y requests, entonces es el momento de sumergirse en aspectos más emocionantes de esta actividad. Hoy hablaremos sobre cómo trabajar con contenido que se carga dinámicamente solo a medida que se hace scroll en la página. ¡Tu navegador no será el único fanático de las listas infinitas, ahora puedes enseñarle eso también a tus scripts! 🤖

Internet está lleno de páginas que cargan contenido dinámicamente, donde el contenido se actualiza y aparece solo al interactuar con JavaScript, que, a su vez, "hace magia" del lado del cliente. Esto puede ser tanto una bendición como una maldición para quienes hacen web scraping. Por un lado, dichos sitios pueden ser más interactivos y convenientes para los usuarios, por otro lado, el scraping de estas páginas se vuelve más complicado porque la biblioteca requests no entiende JavaScript.

2. La biblioteca requests_html

Por suerte, como ya sabes, en este mundo existe requests_html — una biblioteca que combina el poder de requests y las capacidades de renderizado similar a un navegador proporcionadas por Pyppeteer. Esta biblioteca permite cargar y renderizar páginas con contenido dinámico, dándote la posibilidad de ejecutar JavaScript e incluso hacer scroll en las páginas.

Instalación de requests_html

Para comenzar, primero necesitas instalar la biblioteca. Si aún no lo has hecho, ejecuta el siguiente comando:

Bash
pip install requests-html

Trabajando con requests_html

Una vez instalada, vamos a ver cómo usar requests_html para cargar y trabajar con contenido dinámico.

Ejemplo: Carga y renderizado de una página

Empezaremos con un caso sencillo: cargar una página, ejecutar JavaScript y extraer datos. Veamos un ejemplo donde cargamos una página y obtenemos el texto de un elemento que solo aparece después de ejecutar JavaScript.

Python

from requests_html import HTMLSession

# Creamos una sesión
session = HTMLSession()

# Cargamos la página
response = session.get('https://example.com/dynamic-page')

# Ejecutamos JavaScript para renderizar la página
response.html.render()

# Extraemos el texto de un elemento que aparece después del renderizado
content = response.html.find('#dynamic-content', first=True)
print(content.text)

En este ejemplo usamos el método render() para permitir que requests_html ejecute JavaScript en la página y renderice el contenido que podría estar oculto durante la carga estándar.

3. Scroll automático en páginas

A veces el contenido dinámico no se carga de inmediato, sino que aparece solo a medida que se hace scroll en la página. requests_html también puede ayudarte aquí, permitiéndote simular el scroll y cargar más datos.

Ejemplo de scroll automático

Supongamos que tienes una página con una lista infinita de noticias, y deseas extraer la mayor cantidad posible de elementos. Aquí está cómo podrías hacerlo:

Python

from requests_html import HTMLSession

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

# Renderizamos y hacemos scroll en la página
response.html.render(scrolldown=5, sleep=1)

# Extraemos todos los elementos de noticias
news_items = response.html.find('.news-item')

for news_item in news_items:
    print(news_item.text)

Aquí el método render() se complementa con los parámetros scrolldown y sleep, indicando cuántas veces hacemos scroll hacia abajo y cuánto tiempo esperamos entre scrolls.

4. Usos prácticos

¿Por qué molestarse con algo como el scroll automático? 🤔

  • Investigación de mercados: Muchas empresas utilizan tales páginas para mostrar continuamente datos, que pueden ser útiles para analizar tendencias y el comportamiento del consumidor.
  • Monitoreo de redes sociales: Muchas plataformas de redes sociales utilizan listas infinitas, lo que hace que requests_html sea una herramienta útil para monitorear y recopilar datos de esas fuentes.
  • Noticias y actualizaciones: Extraer titulares y artículos de sitios de noticias con listas infinitas te permite obtener información oportuna para un análisis.

5. Errores típicos y soluciones

Al trabajar con páginas dinámicas y requests_html, a menudo pueden surgir errores. Veamos algunos comunes:

Problemas con el renderizado

A veces, el método render() puede no completarse correctamente, especialmente si la página es demasiado grande o compleja. En tales casos, puede ayudar aumentar el tiempo de renderizado con el parámetro timeout, o disminuir el número de scrolls.

Python
response.html.render(timeout=30)

Ejecución problemática de scripts

Puede haber situaciones en las que el JavaScript en la página bloquee la ejecución del script o cause problemas. Puedes intentar usar el parámetro wait para esperar la aparición de los elementos necesarios.

Python
response.html.render(wait=2)

Resolución de pantalla y tipo de dispositivo

Algunos sitios pueden proporcionar contenido en función de la resolución de pantalla o del tipo de dispositivo. Verifica con qué user-agent se realiza la solicitud y si el contenido se renderiza.

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. Qué más leer

requests_html es una herramienta potente, pero para aprovechar al máximo sus capacidades y evitar errores típicos, consulta la documentación oficial. Te ayudará a comprender mejor cómo manejar el scroll y renderizar páginas complejas con éxito.

En este punto, tienes todo lo necesario para no temer al contenido dinámico ni a las listas infinitas. Ten cuidado, no olvides especificar que tu script es un hacker blanco que ama ayudar a las personas a automatizar sus tareas, ¡y no un malhechor! 😇

1
Cuestionario/control
Lectura de contenido dinámico, nivel 33, lección 4
No disponible
Lectura de contenido dinámico
Lectura de contenido dinámico
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION