1. Introducción a las páginas dinámicas
Si alguna vez intentaste hacer scraping de datos en sitios web,
que actualizan contenido al vuelo gracias a JavaScript, entonces
sabes que puede ser un verdadero rompecabezas. ¡Pero no te
asustes! Como dicen, cualquier código complejo puede configurarse
para que parezca magia. Vamos a ver cómo
requests_html
nos permite trabajar con este tipo de contenido.
Como sabes, no todas las páginas web son igual de útiles. Algunas páginas cargan contenido inmediatamente, mientras que otras pueden generarlo o actualizarlo dinámicamente mediante JavaScript. Esto crea ciertos problemas para quienes quieren extraer datos, ya que el HTML que ves en las herramientas para desarrolladores puede diferir del HTML que obtienes con una solicitud estándar.
Problemas al hacer scraping de contenido dinámico
La mayoría de las librerías para trabajar con la web, como requests, solo trabajan con respuestas del servidor y no pueden ejecutar JavaScript. Esto significa que si el contenido se carga o cambia a través de JavaScript, puede que no lo veas en absoluto con una solicitud estándar.
2. Uso de la librería requests_html
Y aquí es donde entra en escena requests_html
, una librería
que combina la simplicidad de requests con el poder de un
navegador para ejecutar JavaScript. Te proporciona un motor
básico de renderizado que permite interactuar con páginas web
dinámicas como si estuvieras usando un navegador real.
Instalación y configuración de la librería
Para empezar, vamos a instalar requests_html
. Abre tu
terminal favorito y ejecuta el siguiente comando:
pip install requests-html
¡Perfecto, la librería está instalada! Ahora podemos trabajar con ella.
Fundamentos de uso de requests_html
para extraer
contenido en JavaScript
requests_html
hace nuestra vida más fácil. Vamos a ver
cómo funciona en la práctica. Supongamos que tenemos una página
que genera algunos datos a través de JavaScript.
from requests_html import HTMLSession
# Creamos una sesión HTML
session = HTMLSession()
# Realizamos una solicitud a la página web
response = session.get('https://example-dynamic-page.com')
# Renderizamos JavaScript
response.html.render()
# Extraemos datos
data = response.html.find('#dynamic-content', first=True)
print(data.text)
¡Esto es magia! A diferencia de requests, requests_html
nos proporciona el método .render()
, que
permite "desplazar" la página y ejecutar JavaScript. Una vez
que la página "cobra vida", puedes extraer todos los datos
necesarios utilizando selectores, que aprendimos anteriormente.
3. Ejemplos de extracción de datos
Ahora vamos a profundizar y examinar algunos ejemplos,
para que puedas ver cómo requests_html
nos saca de apuros
en diferentes escenarios.
Extracción práctica de datos de páginas dinámicas
Imagina una página que carga las últimas noticias
solo después de hacer scroll. Con requests_html
, podemos
imitar el comportamiento de un usuario.
url = 'https://example-news-site.com'
# Cargamos la página
response = session.get(url)
# Realizamos un renderizado con un timeout mayor si es necesario
response.html.render(timeout=20)
# Encontramos los elementos con noticias
news_items = response.html.find('.news-item')
for item in news_items:
print(item.text)
¡Así de fácil y sin complicaciones obtuvimos acceso al contenido, que antes parecía inalcanzable!
Procesamiento de contenido JavaScript cargado con
requests_html
Con requests_html
y los selectores CSS que vimos
en lecciones anteriores, puedes trabajar con el contenido
en páginas web como si llevaras años practicando scraping.
# Seleccionamos el primer elemento del título de noticias
headline = response.html.find('.news-headline', first=True)
print(headline.text)
# Extraemos el enlace del elemento
link = headline.find('a', first=True).attrs['href']
print(link)
4. Consejos prácticos y trucos
Aunque requests_html
es una herramienta poderosa, al trabajar
con ella, vale la pena tener en cuenta algunas cosas:
- Timeouts y retardos: No olvides configurar tiempos de espera para el renderizado en páginas más complejas. Esto ayuda a evitar errores por cargas lentas.
-
Capacidad de renderizado:
requests_html
puede consumir muchos recursos, ya que renderiza JavaScript. Para grandes volúmenes de datos o páginas complejas, esto puede ralentizar el proceso. -
CAPTCHA y protecciones anti-bots:
requests_html
no evade protecciones anti-bots y CAPTCHA, por lo que en casos más complejos, es mejor usar Selenium.
GO TO FULL VERSION