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
Es la paginación más clásica. Lo normal es que se generen URLs con el siguiente aspecto:
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.