从零到自动化的完整指南
📑 目录导读
- 为什么需要定时比对页面内容?
- 核心原理与工具选择
- 从零开始:Python脚本基础搭建
- 关键实现:页面抓取与内容提取
- 智能比对:从文本相似度到差异检测
- 定时调度:如何让脚本自动运行
- 常见问题与避坑指南
- 实战案例:监控产品价格变更
❓ 问答先行:用三个问题快速理解核心
Q1:定时比对页面内容脚本有什么实际用途? A:监控竞争对手价格变更、网站内容更新检测、新闻聚合抓取、法律条款变动追踪、API响应数据监控等,简单说,凡是需要“定期检查某网页内容是否变化”的场景,都用得上。

Q2:新手用哪个语言写这类脚本最合适? A:Python(推荐)或Node.js,Python有丰富的requests、BeautifulSoup、Selenium库,社区案例多,学习成本低,如果你只有前端经验,Node.js+Cheerio也是不错的选择。
Q3:比对算法怎么选? A:根据需求选——简单文本比对用difflib(Python内置);结构化数据用JSON diff;忽略微小差异用Hash比对(MD5/SHA256);可视化差异推荐htmldiff库。
为什么需要定时比对页面内容?
在实际业务中,手动刷新网页检查变更已成过去式。
- 电商运营:需要凌晨监控10个竞品SKU价格审核**:监控合作方API返回的协议条款是否被篡改
- 科研数据:定期抓取学术网站最新研究摘要
手动检查不仅慢,且容易遗漏,一个健壮的定时比对脚本,能让你“一次写好,终身受益”。
核心原理与工具选择
工作原理
- 获取页面:发送HTTP请求,获取HTML源码
- :通过CSS选择器或XPath定位目标区域
- 生成快照保存为本地文件或字符串
- 定时比对:对比新快照与旧快照的差异
- 触发通知:差异超过阈值时发送邮件/钉钉/企业微信
推荐技术栈
| 组件 | 推荐工具 | 说明 |
|---|---|---|
| 请求库 | requests | 轻量,适合静态页面 |
| 动态渲染 | Selenium/Playwright | 处理JS渲染的页面 |
| 比对引擎 | difflib / deepdiff | 文本/嵌套结构比对 |
| 调度器 | schedule / APScheduler | 轻量定时执行 |
| 通知 | smtplib / requests | 邮件/Webhook推送 |
从零开始:Python脚本基础搭建
1 安装依赖
pip install requests beautifulsoup4 schedule deepdiff
2 基础框架
import requests
from bs4 import BeautifulSoup
import schedule
import time
def fetch_page(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
resp = requests.get(url, headers=headers, timeout=10)
resp.encoding = resp.apparent_encoding
return resp.text
def compare_content():
url = 'https://example.com/product-page'
new_html = fetch_page(url)
# 后续扩展...
关键实现:页面抓取与内容提取
1 提取核心内容
def extract_text(html, selector):
soup = BeautifulSoup(html, 'html.parser')
target = soup.select_one(selector)
return target.get_text(strip=True) if target else ''
2 处理动态加载页面
对于SPA网站,使用Selenium:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://spa-site.com')
driver.implicitly_wait(5)
content = driver.find_element_by_css_selector('#price').text
避坑提醒:
- 设置合理的请求头,防止被反爬
- 添加
time.sleep随机延迟,模拟人类访问 - 对频繁变更的页面,只比对“净内容”(去除广告、导航等脏数据)
智能比对:从文本相似度到差异检测
1 简单文本比对(适合短文本)
import hashlib
def hash_content(text):
return hashlib.md5(text.encode('utf-8')).hexdigest()
# 调用比对
old_hash = 'abc123' # 从存储读取
new_hash = hash_content(new_text)
if old_hash != new_hash:
print('内容已变更')
2 精确差异检测(适合长文本)
import difflib
def get_diff(old, new):
diff = difflib.HtmlDiff()
return diff.make_file(old.splitlines(), new.splitlines())
3 结构化数据比对(适合JSON/字典)
from deepdiff import DeepDiff
old = {'price': 100, 'stock': 50}
new = {'price': 90, 'stock': 45}
diff = DeepDiff(old, new)
print(diff) # 输出:{'values_changed': {...}}
定时调度:如何让脚本自动运行
1 使用schedule库
import schedule
def job():
compare_content()
print(f'比对完成: {time.ctime()}')
schedule.every(30).minutes.do(job) # 每30分钟
schedule.every().day.at("08:00").do(job) # 每天8点
while True:
schedule.run_pending()
time.sleep(1)
2 部署为长期服务
- Linux:使用crontab或systemd
- Windows:使用任务计划程序
- 云函数:阿里云函数计算/腾讯云SCF,免费额度够用
常见问题与避坑指南
| 问题 | 解决方案 |
|---|---|
| 页面变化频繁但实际没变 | 只比对“内容主体”,过滤时间戳/个人化数据 |
| 请求被拒绝 | 添加Cookie池,使用代理IP |
| 比对结果包含广告文本 | 精确CSS选择器,或使用extract_first只取首元素 |
| 脚本崩溃 | 加try-except,写日志,配合看门狗自动重启 |
| 时区问题 | 统一使用UTC时间,每次比对带上时间戳 |
实战案例:监控产品价格变更
假设你要监控某电商平台一款手机的价格变化:
def monitor_price():
url = 'https://shop.example.com/phone-123'
html = fetch_page(url)
price = extract_text(html, 'span.product-price')
with open('price_history.txt', 'a') as f:
f.write(f'{time.ctime()} | 价格: {price}\n')
# 如果价格低于阈值,发邮件通知
if float(price.replace('¥', '').strip()) < 2999:
send_email('价格已降至目标价!')
总结与行动指南
写一个定时比对页面内容脚本,本质上是“获取-提取-存储-比对-通知”的五步循环,建议你从以下步骤开始:
- 确定目标URL和需要监控的内容元素
- 用Chrome开发者工具找到准确的CSS选择器
- 先写一个不需要比对的“单次抓取”脚本测试
- 加入本地存储(JSON/文本文件),保留上一次快照
- 添加比对逻辑,输出差异报告
- 最后套上定时调度外壳
- 部署到服务器或云函数长期运行
最佳实践提醒:
- 第一次运行前,手动触发一次,验证逻辑正确
- 日志一定要保留,方便回溯问题
- 如果监控敏感数据,注意合规性(如robots.txt限制)