从零到自动化的完整指南
📑 目录导读
- 为什么需要定时比对页面内容?
- 核心原理与工具选择
- 从零开始: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限制)
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播