CodeGym /Cursos /Python SELF ES /Recolección de datos con enlaces "Siguiente"

Recolección de datos con enlaces "Siguiente"

Python SELF ES
Nivel 34 , Lección 1
Disponible

1. Introducción a la paginación

¿Y quién dijo que los datos que necesitas estarían en una sola página? Muy a menudo tienes que sacarlos de un montón de páginas, o incluso están distribuidos por todo el sitio. Así que uno de los primeros retos con los que te toparás será la división de datos en páginas (pages). Y el fascinante trabajo de recolectarlos se llama paginación (pagination).

Sí, la paginación no solo es ese momento en el que esperas pasar a la siguiente página de resultados de Google, sino también cuando un scraper web se pregunta: "¿Y cómo automatizo esto para no hacerlo manualmente?"

La paginación es una forma de organizar datos en un sitio para evitar páginas largas con contenido. En su lugar, los sitios dividen los datos en páginas, agregando enlaces como "Siguiente" o "Más" para avanzar de una página a otra. Es un concepto importante porque, como scraper web, no querrás decirle a tu jefe que perdiste algo porque estaba escondido en la "quinta página".

2. Problemas al scrapear datos de múltiples páginas

El primer problema con el que puedes encontrarte es la falta de URLs intuitivas y predecibles. En algunos sitios, la URL no cambia radicalmente cuando avanzas entre páginas, lo que hace la vida bastante difícil para automatizar. Por ejemplo, en lugar de page=1, page=2, puedes encontrarte con x=abc, x=def, sin un patrón obvio.

El segundo problema es la protección contra bots. Algunos sitios monitorean activamente la cantidad de solicitudes desde una sola dirección IP. Si ven que haces demasiadas, podrías ser bloqueado temporalmente (o para siempre).

Pero no te preocupes, ahora aprenderemos a sortear estas dificultades como auténticos scrapers.

3. Cómo sortear la paginación

Técnicas y estrategias

  1. Análisis de la estructura de URLs: Normalmente, las páginas usan un parámetro en la URL para indicar el número de página, como por ejemplo ?page=2. Si encuentras esto, ¡felicidades! Has encontrado una plantilla de oro para sortear la paginación.
  2. Buscar enlaces "Siguiente": A veces la URL no es predecible. En esos casos, necesitas buscar enlaces "Siguiente" o similares en la página y seguirlos.
  3. Uso de solicitudes AJAX: Algunos sitios obtienen datos a través de AJAX sin recargar la página. En estos casos, necesitas interceptar estas solicitudes y reproducirlas.

¡Vamos a la práctica!

Ejemplo de script para sortear la paginación y recolectar datos

Veamos un ejemplo de script:

Python

import requests
from bs4 import BeautifulSoup

# Función para obtener datos de una página
def get_data_from_page(url):
    response = requests.get(url)
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        # Aquí extraes los datos de soup - ejemplo
        data = soup.find_all('div', class_='data-class')
        for item in data:
            print(item.text)  # Imprime o guarda los datos
    else:
        print(f"No se pudo obtener la página: {url}")

# Lógica principal para sortear la paginación
def scrape_all_pages(start_url):
    current_url = start_url
    while current_url:
        get_data_from_page(current_url)
        soup = BeautifulSoup(requests.get(current_url).text, 'html.parser')
        # Intentamos encontrar el enlace "Siguiente"
        next_button = soup.find('a', text='Siguiente')
        if next_button:
            current_url = next_button['href']
        else:
            current_url = None

# Iniciamos scraping desde la primera página
start_url = 'http://example.com/page=1'
scrape_all_pages(start_url)

Este es un ejemplo básico que demuestra el principio de trabajo con la paginación. Tendrás que adaptarlo a la estructura del sitio con el que estés trabajando.

Manejo de sesión y uso de user-agent

Cuando envías muchas solicitudes a un sitio, es útil usar una sesión y cambiar el user-agent para reducir el riesgo de ser bloqueado.

Python

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'}

session = requests.Session()
session.headers.update(headers)

response = session.get('http://example.com')

Esta construcción te permite emular un navegador de manera más confiable que simplemente enviando solicitudes con encabezados vacíos.

4. Implementación práctica

Ahora que conocemos los fundamentos, vamos a complicar un poco más la tarea. Consideremos un caso donde los enlaces a las páginas contienen parámetros impredecibles, y necesitamos usar AJAX para obtener los datos.

Implementación con el uso de AJAX

A veces los datos no se cargan en la página principal, sino que se cargan mediante AJAX. Si descubres que un sitio se comporta de esta manera, usa la herramienta de depuración de red en tu navegador para identificar qué solicitudes se realizan en segundo plano. Luego reproduce estas solicitudes con Python.

Python

# Ejemplo de llamada AJAX
ajax_url = 'http://example.com/ajax_endpoint'

params = {
'some_param': 'valor',  # parámetros si son necesarios para la solicitud
'page': 1
}

while True:
response = session.get(ajax_url, params=params)
data = response.json()
if not data['has_more']:
break
# Procesamiento de datos
for item in data['items']:
print(item)
params['page'] += 1  # Pasar a la siguiente página

Este enfoque ayuda cuando, después de un análisis detallado de la solicitud y respuesta, comprendes cómo se cargan los datos en el navegador.

La lección de hoy nos sumergió en el fascinante y a menudo caprichoso mundo de la paginación. Esta habilidad te permitirá recolectar datos de sitios de manera segura y eficiente, sin perderte ni una sola página. Después de todo, al igual que en la vida, en el web scraping la meticulosidad y la perseverancia son clave, porque ¿quién sabe qué tesoros escondidos están en la página veinte?

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION