Monitorización de precios con web scraping: guía práctica
La monitorización de precios consiste en comprobar el precio de un producto en un conjunto de sitios, con una programación, y registrar lo que se ve para poder comparar a lo largo del tiempo. Los minoristas, los marketplaces y los analistas la usan. El scraping de precios es además una de las formas más habituales de que un scraper se encuentre con un captcha, así que merece la pena diseñarlo bien. Esta guía cubre qué monitorizar, cómo extraer números de páginas que nunca estuvieron pensadas para eso, cómo almacenar y alertar sobre los cambios, y cómo cumplir las reglas de un sitio mientras lo haces.
Empieza con una fuente que puedas usar
Antes de escribir código, comprueba si el sitio ofrece una forma oficial de obtener los datos: un feed de productos, una API o un programa de socios. Son más fiables que el scraping y eliminan la mayor parte del riesgo legal y técnico. El scraping es la alternativa para páginas públicas donde no existe una vía oficial, y los términos y el robots.txt siguen aplicándose. La visión general legal cubre las preguntas generales.
Arquitectura en cinco partes
Un monitor fiable tiene cinco partes, y mantenerlas separadas facilita la depuración:
- Planificador. Decide qué páginas de producto visitar y cuándo. Reparte las visitas a lo largo del día en lugar de comprobar todo en el mismo minuto.
- Descargador. Descarga la página, con un ritmo respetuoso, reintentos y caché.
- Analizador. Extrae el precio, el contexto de la moneda y el estado de stock.
- Almacén. Guarda cada observación con una marca de tiempo, para tener un historial.
- Alertador. Compara el valor nuevo con el último y te avisa cuando cruza un umbral que tú hayas fijado.
Extrae precios de páginas desordenadas
Los precios aparecen de muchas formas: con separadores de miles, con comas decimales, con una etiqueta delante del número o repartidos entre varios elementos. Mantén el analizador pequeño y pruébalo con ejemplos reales. Aquí tienes una versión que asume el formato habitual, con comas para los miles y un punto para los decimales. Normaliza los otros formatos antes de llamarla:
import re
from decimal import Decimal, InvalidOperation
PRICE_PATTERN = re.compile(r"\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?|\d+(?:\.\d{1,2})?")
def parse_price(text: str) -> Decimal | None:
"""Devuelve el primer número del texto como Decimal, o None."""
match = PRICE_PATTERN.search(text.replace(" ", " "))
if not match:
return None
try:
return Decimal(match.group(0).replace(",", ""))
except InvalidOperation:
return None
print(parse_price("Now 1,249.50 in stock")) # Decimal('1249.50')
print(parse_price("Sold out")) # None
Usa Decimal, no float, para todo lo que vayas a comparar o sumar. El redondeo de coma flotante puede hacer que dos precios iguales parezcan distintos. Guarda el texto original junto al valor analizado, para poder corregir más tarde un error del analizador sin volver a descargar cada página.
Almacena el historial y detecta cambios
Un precio único es una instantánea. El valor de un monitor está en el historial. Guarda una fila por observación, con el ID del producto, la fuente, la marca de tiempo, el valor analizado y el texto original. Entonces, la alerta es una simple comparación con la fila anterior. Avisa solo de cambios relevantes, como una bajada que supere un porcentaje fijado o un producto que se queda sin stock, para no recibir una avalancha de ruido.
Gestiona variantes y packs
Una página de producto a menudo muestra varios precios: uno por talla o color, un precio de pack, un precio para socios o un precio que solo aparece después de hacer una selección. Decide antes de construir qué debe registrar el monitor. Un enfoque habitual es guardar el identificador de la variante junto al precio, para que un cambio en una talla no parezca un cambio en todo el producto. Ten cuidado con los precios "desde" y con los precios originales tachados, porque un analizador que recoja el número equivocado generará falsas alertas. Guarda el texto de la etiqueta junto a cada valor, para poder comprobar qué se leyó cuando una alerta parezca errónea.
Programa con respeto
Comprueba cada producto con un intervalo que coincida con la frecuencia con la que realmente cambia su precio. Un producto que cambia a diario no necesita una comprobación cada hora. Añade variación aleatoria a cada visita, limita el número de peticiones por sitio y hora, y guarda en caché los resultados durante el intervalo que hayas elegido. Estos hábitos mantienen tu carga baja y tus datos consistentes.
Cuando la página te bloquea
Las páginas de precios son objetivos frecuentes para el acceso automatizado, así que puedes encontrarte con un bloqueo, un límite de peticiones o un captcha. Retrocede cuando veas un 429 o un 503, y deja de visitar un sitio que sigue rechazándote. Si aparece un captcha en una página que tienes permiso para automatizar, el tipo de captcha activo en Scarnox es PopularCaptcha. La guía de PopularCaptcha en Python muestra el flujo del token. Lee scrapear sin que te bloqueen antes de añadir más mecanismos, porque el ritmo suele resolver más que cualquier herramienta extra.
Algunas páginas muestran sus precios con JavaScript. Para esas, sigue el enfoque de scraping de sitios web con JavaScript.
Scrapea de forma responsable
- Usa primero los feeds o las API oficiales, y lee los términos de cada sitio que monitorices.
- Respeta el
robots.txt, mantén bajos los ritmos de peticiones y guarda los resultados en caché. - No monitorices a la competencia de una forma que degrade su servicio.
- Limita los datos que recopilas a lo que necesitas, y no almacenes información personal que aparezca en las páginas de producto.
Próximos pasos
- Scrapear resultados de búsqueda
- Scrapea sin que te bloqueen
- Proxies rotatorios para scraping
- ¿Es legal el web scraping? Una visión general
Empieza con crédito de prueba gratis, sin tarjeta: crea una cuenta y prueba el flujo de PopularCaptcha en una página que tengas permiso para automatizar. Para ver las tarifas actuales, consulta la página de precios.