如何写定时比对页面内容脚本

wen 实用脚本 30

从零到自动化的完整指南

📑 目录导读

  1. 为什么需要定时比对页面内容?
  2. 核心原理与工具选择
  3. 从零开始:Python脚本基础搭建
  4. 关键实现:页面抓取与内容提取
  5. 智能比对:从文本相似度到差异检测
  6. 定时调度:如何让脚本自动运行
  7. 常见问题与避坑指南
  8. 实战案例:监控产品价格变更

❓ 问答先行:用三个问题快速理解核心

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返回的协议条款是否被篡改
  • 科研数据:定期抓取学术网站最新研究摘要

手动检查不仅慢,且容易遗漏,一个健壮的定时比对脚本,能让你“一次写好,终身受益”。

核心原理与工具选择

工作原理

  1. 获取页面:发送HTTP请求,获取HTML源码
  2. :通过CSS选择器或XPath定位目标区域
  3. 生成快照保存为本地文件或字符串
  4. 定时比对:对比新快照与旧快照的差异
  5. 触发通知:差异超过阈值时发送邮件/钉钉/企业微信

推荐技术栈

组件 推荐工具 说明
请求库 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('价格已降至目标价!')

总结与行动指南

写一个定时比对页面内容脚本,本质上是“获取-提取-存储-比对-通知”的五步循环,建议你从以下步骤开始:

  1. 确定目标URL和需要监控的内容元素
  2. 用Chrome开发者工具找到准确的CSS选择器
  3. 先写一个不需要比对的“单次抓取”脚本测试
  4. 加入本地存储(JSON/文本文件),保留上一次快照
  5. 添加比对逻辑,输出差异报告
  6. 最后套上定时调度外壳
  7. 部署到服务器或云函数长期运行

最佳实践提醒

  • 第一次运行前,手动触发一次,验证逻辑正确
  • 日志一定要保留,方便回溯问题
  • 如果监控敏感数据,注意合规性(如robots.txt限制)

抱歉,评论功能暂时关闭!