Python商品价格监控

Python商品价格监控

在CHATGPT的帮助下,用python写了一个简单的价格监控程序。
实现了如下功能:
1.获取现在价格
2.当低于某个价格时提醒
3.邮件提醒
代码如下:

import requests
from bs4 import BeautifulSoup
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import time

# 设置自己的邮箱信息
my_email = "[email protected]"
my_password = "******"
recipient_email = "[email protected]"

# 商品链接和监控价格列表,target_price后面填写你意向的价格。可以添加多个商品链接。
products = [
    {"url": "https://explore.omsystem.com/us/en/e-m10-mark-iii-black-with-14-42mm-r-lens-reconditioned.html", "target_price": 800},
    {"url": "https://www.nikonusa.com/en/nikon-products/product/refurbished-mirrorless-cameras/1633b/z-50-refurbished.html", "target_price": 1000}
]

def get_price(url):
    # 请求商品链接,获取网页内容
    response = requests.get(url)
    soup = BeautifulSoup(response.content, "html.parser")
    
    # 查找价格信息并转换为数值类型返回
    if "omsystem.com" in url:
        price_str = soup.find("span", {"class": "price"}).text.strip().replace("$", "")
    elif "nikonusa.com" in url:
        price_str = soup.find("span", {"class": "font-open-sans price-now"}).text.strip().replace("$", "")
    return float(price_str)

def send_email(subject, message):
    # 创建邮箱内容
    msg = MIMEText(message, "plain", "utf-8")
    msg["Subject"] = Header(subject, "utf-8")
    msg["From"] = my_email
    msg["To"] = recipient_email
    
    # 使用SMTP协议发送邮件,我这里用的是腾讯企业邮箱。
    server = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465)
    server.login(my_email, my_password)
    server.sendmail(my_email, recipient_email, msg.as_string())
    server.quit()

while True:
    # 打印日志信息,显示当前时间和开始监控
    print("开始监控,当前时间:", time.ctime())
    # 检查每个商品的价格是否达到目标价格
    reached_products = []  # 保存价格达到目标值的商品
    for p in products:
        current_price = get_price(p["url"])
        if current_price <= p["target_price"]:
            # 当价格达到目标价格时保存商品到达标的商品列表
            reached_products.append(p)
            # 发送邮件提醒
            subject = "商品价格到目标值!"
            message = "商品 {} 当前价格为 ${},已达到你设置的目标价格 ${}。".format(p["url"], current_price, p["target_price"])
            send_email(subject, message)
            print("商品 {} 当前价格为 ${}".format(p["url"], current_price))

# 从products列表中删除已经达到目标价格的商品
    for p in reached_products:
        products.remove(p)

# 如果所有商品的价格都达到目标值,就退出程序
    if not products:
        print("所有商品的价格都已经达到目标值,结束监控。")
        break
# 打印日志信息,显示下一次监控的时间和间隔时间

next_check_time = time.ctime(time.time() + 3600)  # 用当前时间加上1小时的秒数计算下一次监控的时间
print("本次监控结束,下一次监控时间:{} (间隔时间1小时)".format(next_check_time))

# 设置间隔时间并进入下一个循环
time.sleep(3600)  # 每隔1小时进行一次监控,可以根据需要调整。