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)

Script en Python para rastrear los precios de Amazon
Extraer Precio de Teléfono Movil con Python

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.

Extracción de precio con Python

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"

Restricciones de seguridad en google

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.

dcaraballo

Creador de @PythonDiario, amante de la Tecnología y la Naturaleza. Programador Python, C# . NET

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey