Python中如何实现淘宝商品降价提醒脚本

本人大二狗,刚刚自学 Python ,因为看到某东的降价提醒很好用,而某宝却没有,因此想做一个降价提醒,用爬虫将他们的价格爬下来,然后做一个降价的提示,现在有几个问题:
1 、如果做好了这个脚本,如何让他一直保持运行;
2 、能不能实现邮箱通知或短信通知这个功能;
这些是我昨天晚上突发奇想,还没有去具体实现,如果后期遇到问题,还望 dalao 不吝赐教。


Python中如何实现淘宝商品降价提醒脚本
24 回复

如果只是盯着个别商品,都好说,用系统的计划任务隔一段时间来执行脚本,然后在分析价格,注册个网易邮箱来发通知邮件,或者弄个微信推送也行。如果要扫描整个淘宝的商品。额,那就复杂了,要弄代理池,防止 ip 被干掉,还要多线程去跑任务。建议从手机版网站去爬,这样信息量比较小


要写个淘宝降价提醒脚本,核心就是定时爬取价格然后对比。我直接给你个完整可用的版本:

import requests
import time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from datetime import datetime
import re

class PriceMonitor:
    def __init__(self, url, target_price, check_interval=3600):
        self.url = url
        self.target_price = target_price
        self.check_interval = check_interval
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        }
    
    def get_current_price(self):
        """获取当前商品价格"""
        try:
            response = requests.get(self.url, headers=self.headers, timeout=10)
            response.raise_for_status()
            
            # 淘宝价格通常在data-price属性或特定class中
            # 这里用正则简单匹配,实际可能需要更复杂的解析
            price_pattern = r'"price":"(\d+\.?\d*)"'
            matches = re.findall(price_pattern, response.text)
            
            if matches:
                # 取第一个匹配到的价格
                current_price = float(matches[0])
                return current_price
            else:
                # 备用方案:查找常见价格标签
                alt_pattern = r'<em class="tb-rmb-num">(\d+\.?\d*)</em>'
                alt_matches = re.findall(alt_pattern, response.text)
                if alt_matches:
                    return float(alt_matches[0])
                
                print(f"未找到价格信息: {self.url}")
                return None
                
        except Exception as e:
            print(f"获取价格失败: {e}")
            return None
    
    def send_email_alert(self, current_price):
        """发送邮件提醒"""
        # 配置你的邮箱信息
        sender = 'your_email@qq.com'
        receiver = 'receiver_email@qq.com'
        smtp_server = 'smtp.qq.com'
        password = 'your_authorization_code'  # QQ邮箱用授权码,不是密码
        
        subject = f'商品降价提醒!当前价格:{current_price}元'
        content = f"""
        你监控的商品已降价!
        
        商品链接:{self.url}
        当前价格:{current_price}元
        目标价格:{self.target_price}元
        监控时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
        """
        
        try:
            msg = MIMEText(content, 'plain', 'utf-8')
            msg['Subject'] = Header(subject, 'utf-8')
            msg['From'] = sender
            msg['To'] = receiver
            
            server = smtplib.SMTP_SSL(smtp_server, 465)
            server.login(sender, password)
            server.sendmail(sender, [receiver], msg.as_string())
            server.quit()
            print("邮件发送成功")
        except Exception as e:
            print(f"邮件发送失败: {e}")
    
    def start_monitoring(self):
        """开始监控"""
        print(f"开始监控商品: {self.url}")
        print(f"目标价格: {self.target_price}元")
        print(f"检查间隔: {self.check_interval}秒")
        
        while True:
            current_price = self.get_current_price()
            
            if current_price is not None:
                print(f"{datetime.now().strftime('%H:%M:%S')} - 当前价格: {current_price}元")
                
                if current_price <= self.target_price:
                    print(f"🎉 价格已降到目标以下!当前: {current_price}元")
                    self.send_email_alert(current_price)
                    break  # 达到目标后停止监控
            
            time.sleep(self.check_interval)

# 使用示例
if __name__ == "__main__":
    # 替换为你要监控的商品链接
    product_url = "https://item.taobao.com/item.htm?id=商品ID"
    
    # 设置目标价格(当商品价格低于这个值时提醒)
    target_price = 100.0
    
    monitor = PriceMonitor(product_url, target_price, check_interval=1800)  # 每30分钟检查一次
    monitor.start_monitoring()

这个脚本的工作原理很简单:

  1. 用requests获取商品页面
  2. 用正则表达式从页面源码里提取价格
  3. 对比当前价格和目标价格
  4. 如果降价了就发邮件通知

需要注意的几点:

  • 淘宝页面结构可能会变,价格提取的正则可能需要调整
  • 频繁请求可能会被屏蔽,建议检查间隔设长点(比如半小时)
  • 发邮件需要配置正确的SMTP信息,QQ邮箱要用授权码不是密码
  • 可以考虑用代理IP或者随机User-Agent来避免被ban

如果正则匹配不到价格,可能需要用更稳定的方法,比如:

  • BeautifulSoup解析HTML
  • 找淘宝API接口(但可能需要登录)
  • 用Selenium模拟浏览器

建议先用这个基础版本测试,有问题再调整价格提取逻辑。

  1. 大概有两种思路, 可以考虑使用 flask ,一种是在 flask 里嵌入定时任务(做成网站的样子,好处是如果做上添加,可以变成网页添加,避免经常需要修改 Python 代码),另一种是使用系统的定时任务(这时候 Python 脚本就只是个确定是否降价,如果降价就发邮件的程序)
    2. 使用 Flask-Mail ,短信的话只能花钱买 api 接口(当然也有免费的,我记得有个 api 是每天免费 5 条,应该做够)

说远了,楼主刚学 Python 的话,不建议就接触 web 框架,还是从一个脚本写起吧

也许可以分析一下惠惠购物助手,直接用惠惠购物助手的信息

一直保持运行 -> 可以换种方式, 每隔 delta 秒运行一次.

像 crontab 这种定时任务管理, 或者 windows 自带的计划任务帮助你实现自动化执行的要求;

然后爬虫提取 sku_id price timestamp 这些属性, 数据可以用 sqlite 或者 mysql 等熟悉的方式存储. 甚至本地的 tsv 文件都可以.

提醒的话就邮件比较方便, 短信涉及到收费问题.
发邮件工具 Python 的 SMTP 模块 (smtplib) 就能实现了.

小菜鸟暂时也只能想到这些了, 供参考.

写个简单的脚本,然后 crontab 就行了,我就是这么干的

最大的问题是怎么反 反爬虫

如果商品足够多
还没等爬虫爬下来东西已经被抢光了……

如果只是单个商品,那就很简单了, Python 写个死循环,每隔一段时间执行一次就可以,消息发送可选方糖。如果是所有商品,那问题就好复杂了。

只是想单纯的吐槽一下楼主的头像,另外楼上说的方糖是这个: http://sc.ftqq.com/

一点一点来,总之我保证这是一个大坑


同意
笑而不语

即刻 app 好像可以做到

你提的这两个问题都不是大问题,坑的在其他地方。

反扒是关键 其他无所谓

chrome 市场里很多比价插件 惠惠等,还要造轮子的必要吗?

第一个问题很简单,谷歌一下即可,第二个问题用 server 酱,也就是楼上提的方糖,微信提醒,用起来很方便

淘宝上面不下几百亿的商品数据,你一个月能爬完一遍不?一个月的更新周期,降价提醒还有意义么?

现在的电商网站都学尖了。

不降价,但是有满减或者组合降价的活动。

光监控价格没用。

无解,淘宝的价格不是这么好抓取的,少数可用,多数恨麻烦

你得盯鹊桥和隐藏优惠券

部分商品监控还好。大量的,说句实话,这个还是甭想了,那不是你能做的。

看你要监控的数量 大量的话 这个坑有点大。

回到顶部