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
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.
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.
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.
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
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:
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!