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:
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.
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:
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_htmlsea 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.
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.
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.
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! 😇
GO TO FULL VERSION