Script en Python para rastrear los precios en Amazon
Hoy estaremos viendo como crear un Script en Python para rastrear los precios en Amazon (en este ejemplo rastrearemos el precio de un teléfono celular)
La url del móvil a rastrear es la siguiente: https://www.amazon.com/-/es/Samsung-DS-Dynamic-Unlocked-Smartphone/dp/B07WV6BY5S/ref=sr_1_9?__mk_es_US=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=JYU71JQXJVWI&dchild=1&keywords=xiaomi+mi+10+pro&qid=1609348165&sprefix=xiaomi%2Caps%2C381&sr=8-9
Agregaré el código en Python 3 y luego iré explicando paso a paso cada una de sus funcionalidades.
# www.pythondiario.com
import requests
from bs4 import BeautifulSoup
import smtplib
import time
URL = 'https://www.amazon.com/-/es/Samsung-DS-Dynamic-Unlocked-Smartphone/dp/B07WV6BY5S/ref=sr_1_9?__mk_es_US=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=JYU71JQXJVWI&dchild=1&keywords=xiaomi+mi+10+pro&qid=1609348165&sprefix=xiaomi%2Caps%2C381&sr=8-9'
headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"}
def rastrear_precio():
page = requests.get(URL, headers=headers)
soup = BeautifulSoup(page.content, 'html.parser')
producto = soup.find(id="productTitle").get_text().strip()
precio = soup.find(id="priceblock_ourprice").get_text().strip()
precio_convertido = float(precio[4:])
if(precio_convertido < 800):
enviar_correo(producto, precio)
def enviar_correo(producto, precio):
fromaddr = 'tucorreo@gmail.com'
toaddrs = 'destino@gmail.com'
# Datos
username = 'tucorreo@gmail.com'
password = 'password'
# Enviando el correo
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
server.ehlo()
server.login(username,password)
subject = 'El precio bajo'
body = 'Revisar el siguiente link de amazon: ' + URL
msg = f"Subject: {subject}\n\n{body}"
server.sendmail(
fromaddr,
toaddrs,
msg
)
print("HEEEEEY, el producto bajo")
server.quit()
while True:
rastrear_precio()
time.sleep(20)
Lo primero que debemos hacer es importar los módulos necesarios:
- import requests
- from bs4 import BeautifulSoup
- import smtplib
- import time
En caso de no tener instalado algunos de estos módulos, puede hacerlo utilizando pip, y en caso no tener pip puedes pasarte por esta entrada que te guiará para instalarlo: Instalar pip en Linux y Windows
Luego de importar los módulos definimos dos variables:
- URL: es la ruta de la web de amazon donde esta nuestro teléfono móvil
- headers: Los agentes de usuario son únicos para cada visitante de la web. Revelan un catálogo de datos técnicos sobre el dispositivo y el software que está utilizando el visitante. Todos los que navegan por la web en este momento tienen un agente de usuario. Es el software que actúa como puente entre usted, el usuario, e Internet.
Para detectar nuestra configuración de User-Agent podemos entrar a Google y escribir "my user agent", en el primer resultado nos saldrá la configuración de nuestro navegador y podremos remplazarla por la que está en el script más arriba.
Primera función: rastrear_precio()
def rastrear_precio():
page = requests.get(URL, headers=headers)
soup = BeautifulSoup(page.content, 'html.parser')
producto = soup.find(id="productTitle").get_text().strip()
precio = soup.find(id="priceblock_ourprice").get_text().strip()
precio_convertido = float(precio[4:])
if(precio_convertido < 800):
enviar_correo(producto, precio)
Obtenemos la página con requests pasandole como parámetros la URL y el User-Agent y la guardamos en la variable page.
Luego con BeautifulSoup creamos la variable soup para extraer los datos de la página HTML. Si quieres ver algún otro ejemplo con esta librería puedes pasarte por la entrada: Web Scraping con Python y BeautifulSoup
A continuación vamos a extraer el producto (nombre del producto) y el precio. Para esto vamos a utilizar la función find de BeautifulSoup pasandole por parámetro el id del elemento HTML, y se preguntaran ¿de donde sacamos esta información? Tranquilos, lo explico más adelante. Por último get_text() nos servirá para solo extraer el texto y no las etiquetas HTML y strip() es para quitar cualquier espacio en blanco que pueda venir.
¿Como ver la etiqueta id de producto y precio?
Voy a agregar la captura de pantalla de como sacar el precio, pero de igual forma sacamos el título del producto. Para esto vamos a ir al navegador de tu preferencia, entramos al link del producto y vamos a presionar click derecho sobre el precio del producto y le damos inspeccionar elemento. Se abrirá una ventana nueva (abajo o al costado a la derecha por lo general) donde veremos el HTML de la página. Como lo hicimos arriba del precio nos debería llevar directamente a la linea del HTML donde está el precio. A continuación les muestro la imagen para que puedan apreciarlo mejor.
Para este caso sencillo, con la etiqueta id podremos obtener el nombre del producto y el precio. Cualquier duda puedes dejarla en los comentarios.
Por último agregamos una condición if, este caso preguntamos si el precio que está publicado en Amazon es menor que 800 (dólares), en caso afirmativo se ejecuta la función que más abajo detallo.
Segunda función: enviar_correo()
def enviar_correo(producto, precio):
fromaddr = 'tucorreo@gmail.com'
toaddrs = 'destino@gmail.com'
# Datos
username = 'tucorreo@gmail.com'
password = 'password'
# Enviando el correo
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
server.ehlo()
server.login(username,password)
subject = 'El precio bajo'
body = 'Revisar el siguiente link de amazon: ' + URL
msg = f"Subject: {subject}\n\n{body}"
server.sendmail(
fromaddr,
toaddrs,
msg
)
print("HEEEEEY, el producto bajo")
server.quit()
Para esta función no voy a entrar en detalle porque ya tenemos alguna entrada de como enviar correos, te la dejo por aquí: Enviar un correo con Python (smtplib)
Importante: Lo que si quiero comentarles es que Google y por tanto Gmail tienen restricciones de privacidad para este tipo de aplicaciones y si corres el script tal cual así como está puede que te de algún error de permisos. Para solucionarlo lo que hice fue (estando autenticado en Google) ir a la dirección: https://myaccount.google.com/lesssecureapps?pli=1&rapt=AEjHL4PqH1pxtUdb8FJkXOplOvtKc-JIh24n2WH_bIWkLz2aaMRM4AviGqIDr7GQVzHoRyP2_ClYgcwl1687v8wJkerZuqCWpA, y aquí cambiar momentáneamente (mientras hacemos estas a pruebas) a "SI" en "Permite el acceso de aplicaciones poco seguras"
Bien, aclarado el tema de la restricción del amigo Google, lo que hace la funcionalidad es recibir como parámetro el nombre del producto y el precio, luego realiza lo correspondiente para enviar el correo.
Llamada el script
while True:
rastrear_precio()
time.sleep(20)
Lo que hacemos acá con el ciclo while es iterar constantemente llamando a la función rastrear_precio() y luego con time.sleep(20) lo que hacemos es esperar 20 segundos para que el ciclo vuelva a comenzar.
Espero que esta entrada sea de ayuda para sus futuros proyectos, como verán, poniendo un poco de creatividad se pueden hacer varías cosas interesantes a partir de este script.
Cualquier duda o sugerencia, nos encantaría que la dejen en los comentarios. Saludos, Diego.
Deja una respuesta