要写个淘宝降价提醒脚本,核心就是定时爬取价格然后对比。我直接给你个完整可用的版本:
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()
这个脚本的工作原理很简单:
- 用requests获取商品页面
- 用正则表达式从页面源码里提取价格
- 对比当前价格和目标价格
- 如果降价了就发邮件通知
需要注意的几点:
- 淘宝页面结构可能会变,价格提取的正则可能需要调整
- 频繁请求可能会被屏蔽,建议检查间隔设长点(比如半小时)
- 发邮件需要配置正确的SMTP信息,QQ邮箱要用授权码不是密码
- 可以考虑用代理IP或者随机User-Agent来避免被ban
如果正则匹配不到价格,可能需要用更稳定的方法,比如:
- 用
BeautifulSoup解析HTML
- 找淘宝API接口(但可能需要登录)
- 用Selenium模拟浏览器
建议先用这个基础版本测试,有问题再调整价格提取逻辑。