Abordar la paginación al hacer web scraping con Python

Last Updated on octubre 15, 2024 by Álvaro

La paginación es uno de los principales retos a los que nos sometemos a la hora de hacer web scraping. Abordarla es bastante sencilla en determinados casos y muy complicado en otros.

Cómo scrapear cuando la paginación es numérica

Ejemplo de paginación

Es la paginación más clásica. Lo normal es que se generen URLs con el siguiente aspecto:

ejemplo de URL con parámetros de paginación
ejemplo de URL con parámetros de paginación

El parámetro ?page=X que indica el número de la página.

Código para scrapear una sola página

Este es el código base para scrapear una sola página. La idea es aplicar esta función a cada una de las URLs parametrizadas.

from bs4 import BeautifulSoup as bs
import requests as rq
import pandas as pd

def scraper (url):
    response = rq.get(url)
    soup = bs(response.text, 'html.parser')
    buscar_productos = soup.find_all('a', attrs={'data-test': 'product-leaf-title'})

    productos = []
    for i in buscar_productos:
         productos.append(i.get_text())

    buscar_precios = soup.find_all('span', class_="price-sm-bold")
  
    precios = []
    for i in buscar_precios:
         precios.append(i.get_text())

    precios_limpios = []
    for i in precios:
        precios_limpios.append(i.replace('\xa0', ''))
    
    return productos, precios_limpios

Código para recorrer la paginación

La idea es contar con un while que que recorra todas las páginas de la categoría. Para ello se controla el flujo con un contador que es el que a su vez cambia el valor del parámetro ?page.

En muchos casos, la primera página se corresponderá con la URL base que no estará parametrizada. Aunque si indicas ?page=1 normalmente redirigirá a esta URL sin parámetros, este código tiene en cuenta la que se puede dar el caso en el que ?page=1 no exista y por eso se trata de manera individual.

todos_productos = []
todos_precios = []

url_primera = "https://www.lego.com/es-es/themes/ninjago"
productos, precios = scraper(url_primera)
todos_productos.extend(productos)
todos_precios.extend(precios)

page = 2
seguir = True

while seguir:
    url = f'https://www.lego.com/es-es/themes/ninjago?page={page}&offset=0'
    productos, precios = scraper(url)
 
    if not productos:
        seguir = False
    
    else:
        todos_productos.extend(productos)
        todos_precios.extend(precios)
        page+=1
    time.sleep(2)
  
data = {
    "Productos": todos_productos,
    "Precios": todos_precios
} 

df = pd.DataFrame(data) 
df.to_excel('lego_producto2.xlsx', index=False)

Cómo scrapear cuando la paginación es del tipo “mostrar más”

Normalmente, cuando en vez de páginas como tal, existe únicamente un botón de mostrar más, el proceso es idéntico. Al clicar en el botón mostrar más, tan solo tendrás que fijarte en si la URL realmente está generando parámetros numéricos similares a los de la paginación. Un ejemplo de ello es cualquier URL de Mediamarkt. Por ejemplo, la siguiente PLP: https://www.mediamarkt.es/es/category/smartwatches-265.html

Y cuándo es scroll infinito…

Cuando es scroll infinito toca recurrir a técnicas más avanzadas. El combo Beautiful Soup y Requests se nos queda corto para este caso y necesitamos de librerías que nos permitan simular el comportamiento real de un usuario.

Normalmente se utiliza la librería Selenium en estos casos. No entro en ello de momento ya que es más complicado.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *