技术架构
/
Feb 08, 2026
Step 10 第九篇:作战篇 (Waging War) —— 决战沙场,综合实战项目
<!-- Title: 第九篇:作战篇 (Waging War) —— 决战沙场,综合实战项目 -->
<!-- ID: 144 -->
<!-- Series: Python 兵法:零基础建站与 AI 编程实战 (ID: 7) -->
<!-- Author: 潘卫 -->
## 第九篇:作战篇 (Waging War) —— 决战沙场,综合实战项目
### 【原文】
> **兵贵胜,不贵久。**
> **译文**:战争贵在速战速决,不宜旷日持久。
### 【实战项目:全自动价格监控情报系统】
我们将结合前面学到的知识(Requests 爬虫、Re 解析、SMTP 邮件、Time 调度),做一个有实际价值的工具。
**需求**:24小时不间断监控某商品(或股票、显卡)的价格,当价格低于心理价位时,立刻发送邮件报警。
### 【代码架构】
1. **数据层**:使用 `requests` 获取网页源码。
2. **逻辑层**:使用 `re` (正则表达式) 或 `BeautifulSoup` 提取价格数据。
3. **判断层**:`if price < target:`
4. **通知层**:使用 `smtplib` 发送邮件。
5. **调度层**:使用 `time.sleep()` 配合 `try-except` 实现长期运行。
6. **日志层**:使用 `logging` 记录运行状态,而不是只用 `print`。
### 【完整核心代码】
```python
import requests
import time
import smtplib
import logging
from email.mime.text import MIMEText
from email.header import Header
# --- 配置区 (Config) ---
TARGET_URL = "http://fake-shop.com/product/rtx4090"
TARGET_PRICE = 12000
CHECK_INTERVAL = 600 # 10分钟检查一次
# 邮件配置 (需要去邮箱设置里开启 SMTP 服务获取授权码)
SMTP_SERVER = "smtp.qq.com"
SMTP_PORT = 465
SENDER_EMAIL = "your_email@qq.com"
PASSWORD = "your_auth_code"
RECEIVER_EMAIL = "your_email@qq.com"
# --- 初始化日志 ---
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
filename='monitor.log' # 日志保存到文件
)
def get_price():
"""获取当前价格"""
try:
# 伪装成浏览器 (User-Agent),这是"瞒天过海"之计
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
}
resp = requests.get(TARGET_URL, headers=headers, timeout=10)
resp.raise_for_status() # 如果状态码不是 200,抛出异常
html = resp.text
# 假设价格在 <span id="price">12999</span> 标签里
# 这里为了演示,我们模拟一个随机价格
# 实际战斗中,你需要用 BeautifulSoup 解析 html
import random
current_price = random.randint(11000, 13000)
return current_price
except Exception as e:
logging.error(f"获取价格失败: {e}")
return None
def send_email(price):
"""发送报警邮件"""
try:
msg = MIMEText(f"将军!目标商品降价了!当前价格: {price},低于预设的 {TARGET_PRICE}!快去抢!", 'plain', 'utf-8')
msg['From'] = Header("Python情报官", 'utf-8')
msg['To'] = Header("指挥官", 'utf-8')
msg['Subject'] = Header(f"🚨 紧急情报:降价预警 ({price})", 'utf-8')
# SSL 安全连接
server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
server.login(SENDER_EMAIL, PASSWORD)
server.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, msg.as_string())
server.quit()
logging.info("邮件发送成功!")
except Exception as e:
logging.error(f"邮件发送失败: {e}")
# --- 主循环 (Main Loop) ---
def main():
logging.info("监控系统启动...")
while True:
price = get_price()
if price is not None:
logging.info(f"当前巡查价格: {price}")
if price <= TARGET_PRICE:
logging.warning(f"价格达标!触发警报!")
send_email(price)
# 发送后可以增加等待时间,避免轰炸邮箱
time.sleep(3600)
# 战术休息
time.sleep(CHECK_INTERVAL)
if __name__ == "__main__":
main()
```
### 【课后作业】
1. 修改代码,将价格数据保存到 `price_history.csv` 文件中,形成历史走势。
2. 尝试使用 `schedule` 库来替代 `while True + sleep`,实现更优雅的定时任务(比如每天早上 8 点汇报)。
---
P
潘卫
南京市沉思波网络科技有限责任公司创始人、CEO
您的观点 (可选)
🎁 注册账号,同步您的个性化学习路径