Cómo monitorizar precios de productos con python y no morir en el intento [pre-blackfriday] - Parte I

Mediante python, web scraping y Google Cloud Platform seremos capaces de monitorizar productos de Media Markt y que nos alerte cuando bajen de precio mediante un coreo electrónico

Antonio Fernández Troyano
5 min readNov 18, 2020

Todos los años vemos en los medios de comunicación grandes campañas publicitarias por el Black Friday, Cyber Monday y similares.

También sabemos que algunas cadenas comerciales y online, CASUALMENTE, incrementan los precios de ciertos productos los días y semanas previos…..

Ahora que se aproxima el Black Friday y con el fin de evitar estos “Yo no soy tonto”, se me ocurrió programar un pequeño script en python para que nos alertase por email cuando algún producto de los que queremos comprar bajase de un determinado precio.

¡Vamos con ello!

1. [Versión dummy] Obtención de la información de productos

En este primer apartado vamos a ver una versión “sencilla” del programa. No vamos a considerar excepciones como el caso de que el producto esté agotado o si queremos monitorizar varios productos.

En el apartado 2 de este artículo veremos una versión más “profesional” del mismo, con control de errores, funciones para reutilizar código y aviso también de productos agotados….

¡Empezamos!

1.a) Estructura html de la página web del producto

Lo primero que tenemos que hacer es conocer la estructura de la página web.

Ejemplo de producto que vamos a monitorizar

En este caso, estamos interesados simplemente en:

  • Título del producto: para enviarlo en el correo electrónico que recibiremos
  • Precio actual: con el que vamos a comparar el precio de la alerta

Una vez que tenemos claro qué es lo que necesitamos, vamos a inspeccionar la página web con el navegador.

Inspeccionar HTML en el navegador

Una vez localizadas las etiquetas y los atributos que necesitamos podremos extraer la información que necesitamos mediante la librería bs4.

En particular, necesitaremos:

  • Título del producto: etiqueta ‘h1’, con atributo itemprop=”name”
  • Precio actual: etiqueta ‘meta’ , con atributo itemprop=”price” y atributo “content” que es donde está registrado el precio del producto

Y… con esto, ya tenemos un 40% del trabajo hecho :D

1.b) Visita a la página web del producto y creación del “soup” de la web

Una vez hemos localizado las etiquetas HTML que vamos a extraer, necesitamos “visitar” la página web. Esto lo vamos a hacer con la librería requests y la función get.

Una vez que tenemos el código html en el objeto “web”, pasaremos a convertirlo en un objeto de clase BeautifulSoup para poder hacer búsquedas en el código html.

Nota: Es importante incorporar, al menos, el header con el “User-agent”, para simular que estamos accediendo desde un navegador

Vamos a ver el código:

Tal y como vemos, en el caso de Mediamarkt no es complicado obtener los datos. Siempre que obtengamos un resultado “Response 200” en la variable “web” significará que hemos obtenido un acceso correcto a la web.

¡Listo!, a por el siguiente apartado

1.c) Obtención de los datos que estamos buscando

Al inicio del apartado 1 establecimos que necesitábamos localizar la siguiente información:

  • Título del producto: etiqueta ‘h1’, con atributo itemprop=”name”
  • Precio actual: etiqueta ‘meta’ , con atributo itemprop=”price” y atributo “content” que es donde está registrado el precio del producto

Para quien quiera profundizar en html os dejo un enlace a W3school donde podréis aprender lo básico (Elementos y atributos). No hace falta ser un experto, pero conviene estudiar un poco el funcionamiento de html.

Vamos al código en python:

Como veis, una vez tenemos localizado el “bloque” donde se almacenan los datos del producto, solo queda localizar las etiquetas ‘h1’ y ‘meta itemprop:price” para obtener los datos que buscamos.

¡A por configurar el correo electrónico que nos enviará python!

1.d) Función “send_email” para envío de la alerta

Vamos a programar la función en “send_email” que utilizaremos en el caso de que el precio del producto sea igual o inferior al precio de alerta que hemos guardado.

Vamos con el código en python:

Es necesario incluir los datos de correo electrónico de envío, contraseña y correo electrónico que recibirá la notificación dentro de la función.

Paso IMPRESCINDIBLE

IMPORTANTE: también es necesario que le demos acceso a nuestra cuenta de Gmail a la aplicación, os dejo un gif en el que veis cómo se puede hacer

ACTIVAR acceso de aplicaciones poco seguras

1.e) Comprobación del precio actual frente al precio de alerta

A continuación pasaremos a comprobar si el precio actual del producto es inferior al del precio “alerta” que tenemos guardado en una variable y, en caso afirmativo, que nos envíe un correo electrónico.

En este caso simplemente es necesario programar un “if-else” que nos permita comprobar si el precio actual es igual o inferior al precio de alerta, vamos con ello:

Como vemos, tenemos que establecer el precio de alerta a partir del cual nos enviará un correo electrónico con la información del producto y la url para comprarlo.

Aquí el resultado:

Ejemplo del correo que recibiremos

Os dejo el código completo de la versión dummy:

2. [Versión pro] Obtención de la información de productos automatizada

Para aquellos que hayáis llegado hasta aquí quizás os interese una versión más “profesional” de este script.

En esta versión “profesional” e incluido las siguientes mejoras:

  • Definición de funciones: read_file, get_soup_url, sleep_scrap y send_email
  • Se incluye la posibilidad de monitorizar múltiples productos
  • Incluye control de errores para productos que se han agotado (no tienen precio)

Os dejo el código completo. Como se puede observar es muy similar a la versión dummy pero incluyendo try-except y control de productos agotados:

En el próximo artículo os enseñaré cómo podemos poner en marcha este código en Google Cloud Platform.

¡Un saludo!

--

--

Antonio Fernández Troyano

Civil Engineer | 📈Management consultant and Master in Data Analytics and Big Data💻 | Website: www.fernandeztroyano.es | Git https://github.com/afernandez119