一句话: 本教程将向您展示如何构建一个 Python 网站监控脚本,该脚本通过以下方式获取页面: Crawlbase生成 SHA-256 内容指纹,并在内容发生任何变化时发出警报;无需代理基础设施。

要构建网站变更跟踪器,最简单的方法是将其与先前版本进行比较。脚本会抓取页面,提取相关文本,并根据这些内容生成一个指纹。下次运行时,它会再次执行相同的步骤,并检查指纹是否仍然匹配。如果不匹配,则说明页面上的某些内容发生了更改。

在本教程中,我们将构建一个 Python 脚本来处理此工作流程。它通过以下方式检索页面 HTML: Crawlbase Crawling API该脚本从页面中提取可读文本,并生成清理后内容的 SHA-256 哈希值。该哈希值存储在本地,以便脚本下次检查页面时进行比较。

到最后,你将拥有一个可用的变更跟踪器,它可以监控一个或多个 URL,存储快照,输出结构化结果,并按计划自动运行。

网站变更跟踪的工作原理

网站变更跟踪遵循可重复的六步流程,将原始页面内容转换为可比较的信号。

  • 步骤 1 — 获取页面内容。 获取目标 URL 的完整 HTML 代码。使用可靠的 API,例如 Crawlbase 避免阻塞并确保包含 JavaScript 渲染的内容。
  • 步骤 2 — 提取要监控的页面部分。 移除导航、脚本、页脚和广告。只保留有意义的正文。
  • 步骤 3 — 规范化文本。 消除空白字符,去除格式瑕疵,并规范编码,以避免因外观变化而触发误报。
  • 步骤 4 — 生成内容指纹。 内容指纹是一种固定长度的加密哈希值(本教程中使用的是 SHA-256),它源自已清理的页面文本。即使单个单词的更改也会产生完全不同的哈希值,因此指纹是一种快速且存储效率高的更新检测方法。
  • 步骤 5 — 与存储的指纹进行比较。 加载上次运行保存的指纹,并将其与刚刚生成的指纹进行比较。如果它们不同,则说明页面已更改。
  • 步骤 6 — 记录或报告结果。 保存新的指纹以供下次运行,并可选择输出差异,以准确显示更改的内容。

主要挑战在于避免误报。原始 HTML 通常包含频繁变化的元素,例如脚本、广告、时间戳或动态组件。与比较原始 HTML 相比,比较清理后的文本可以产生更准确的结果。

为何使用 Crawlbase 用于页面跟踪

您可以使用以下方式构建跟踪脚本 直接 HTTP 请求但许多网站会屏蔽或限制自动请求。有些页面也严重依赖 JavaScript,这意味着标准请求返回的原始 HTML 可能并不包含实际内容。

Crawlbase 它通过自动处理页面检索来解决这些问题。

主要优势包括:

  • 可靠的页面检索 在众多网站上
  • 内置处理 用于阻止、限制和验证码
  • JavaScript 渲染 通过 JS 令牌,
  • 无代理基础设施 管理或维护

一致的 HTML 输出 适用于可重复比较

您的监控脚本仅专注于提取和比较内容,而 Crawlbase 充当检索层。

先决条件和技术要求

开始之前,请确保您的环境包含以下内容。

环境要求:

需求Detail
Python 版本 3.10 或更高版本
Crawlbase API令牌免费套餐包含 1,000 次请求
操作系统Linux、macOS 或 Windows

本教程使用了以下Python包:

小包装目的
要求向 Crawlbase API
美丽的汤4HTML解析和文本提取
哈希库SHA-256 指纹生成
JSON本地快照存储
difflib生成人类可读的差异

步骤1:安装依赖项

从项目目录中下载 requirements.txt然后运行:

1
pip install -r requirements.txt

这将安装 requests (v2.28.0) 和 beautifulsoup4 (v4.11.0) 等依赖项。

步骤 2:使用以下方式获取网页 Crawlbase

下一步是验证您是否能够成功获取页面 HTML。

脚本向……发送请求 Crawlbase Crawling API 并返回响应内容。

在ScraperHub上获取完整的代码示例 - fetch.py

1
2
3
4
5
6
7
8
DEF 获取页面(网址: STR,令牌: STR | 没有 = 没有)-> STR:
api_token = 令牌 or os.environ.get(“CRAWLBASE_TOKEN”, "")
if 不会 api_token:
提高 值错误("Crawlbase 需要令牌:设置 CRAWLBASE_TOKEN 或传递令牌=")
api_url = f"{CRAWLBASE_API_URL}/?token={api_token}&url={quote(url)}"
响应 = requests.get(api_url, timeout=30)
响应.raise_for_status()
回报 响应文本

此功能:

• 阅读 Crawlbase 象征
• 将目标 URL 发送到 Crawling API
• 获取页面 HTML
• 返回待处理的内容

运用 Crawlbase 确保监控和跟踪工具能够接收到可靠的 HTML 输出。

步骤 3:提取要跟踪的内容

直接比较原始 HTML 代码是不可靠的,因为页面包含许多经常变化的元素。

为了减少噪音,该脚本提取可读的页面文本并删除不必要的元素。

ScraperHub 上的代码示例 - 提取.py

1
2
3
4
5
6
DEF 提取可监控文本(的HTML: STR)-> STR:
汤 = BeautifulSoup(html, “html.解析器”)
HPMC胶囊 行李牌 in 汤([“脚本”, “风格”, 导航, “页脚”]):
tag.decompose()
text = soup.get_text(separator=“”,条带=)
回报 “”.join(text.split())

该函数执行以下几个步骤:

• 移除脚本和样式
• 移除导航和页脚元素
• 提取可读文本
• 规范化空白

最终得到页面内容的一致文本表示。

步骤 4:生成内容指纹

该工具不是存储整个页面快照,而是使用加密哈希生成指纹。

哈希值将文本转换为固定长度的字符串。如果内容发生变化,哈希值也会随之改变。

例子 (fingerprint.py):

1
2
DEF 内容指纹(文本: STR)-> STR:
回报 hashlib.sha256(text.encode(“utf-8”).hexdigest()

这创造了一个 SHA-256指纹 已清理文本。

使用哈希值的好处:

• 快速比较
• 最低存储需求
• 能够可靠地检测微小变化

即使文本发生微小的变化,也会产生不同的哈希值。

步骤五:存储之前的快照

为了检测更新,该工具必须记住以前运行的指纹。

这将存储两个快照文件:

  • snapshots.json - 存储 URL → 指纹映射。

  • snapshots_text.json - 存储每页的规范化文本,以便在内容更改时显示差异。

例子 (存储.py):

1
2
3
4
5
6
7
8
9
10
DEF 加载快照(路径: STR 路径)-> 字典[STR, STR]:
p = Path(path)
if 不会 p.exists():
回报 {}
- open(p,编码=“utf-8“) as f:
回报 json.load(f)

DEF 保存快照(快照: 字典[STR, STR], 小路: STR 路径)-> 没有:
- open(路径,“w”,编码=“utf-8“) as f:
json.dump(snapshots, f, indent=2)

当监控器再次运行时,它会加载存储的指纹并将其与新生成的指纹进行比较。

步骤 6:比较当前版本与先前版本

生成当前指纹后,脚本会将其与存储的指纹进行比较。

例子 (monitor.py):

1
2
3
4
5
DEF 检查更改(网址: STR,current_hash: STR快照: 字典[STR, STR])-> 布尔:
previous = snapshots.get(url)
if 以前 is 没有:
回报
回报 previous != current_hash

如果指纹不同,脚本会报告更改。

可能的结果:

更改
没有变化

脚本首次检查 URL 时,总是会报告 更改 因为尚无先前的快照。当前指纹和页面文本将被存储,以供将来比对。

当页面内容发生变化时,该工具还会生成一个 统一差异 显示更改内容。示例输出可能如下所示:

1
2
3
4
- - 以前的
+++ 当前
- 旧句子
+ 新句子

此差异是使用 Python 生成的 difflib 该模块有助于准确识别页面版本之间的变化。

步骤 7:保存更新后的快照

检查完更改后,脚本会更新存储的快照,以便将来运行可以检测到新的更新。

In monitor.py该脚本会同时存储指纹和提取的文本。

1
2
3
4
snapshots[url] = 指纹
snapshot_texts[url] = 文本
save_snapshots(snapshots, path)
save_snapshot_texts(snapshot_texts, path)

保存这两个值可以让工具检测未来的变化并生成可读的差异。

步骤 8:按计划运行监控程序

监控工具在自动运行时最为有效。

有多种日程安排方案可供选择,常用方法包括:

  • Linux 或 macOS 上的 Cron 作业
  • Windows任务调度程序
  • 基于云的作业调度器

该工具还支持内置的定时任务安排功能。

示例 CLI 配置 主文件:

1
2
3
4
5
6
7
8
parser.add_argument(“ - 间隔”, 类型=浮动,metavar=,
帮助=“持续运行:每秒重新检查所有 URL(例如,每小时 3600 次)。按 Ctrl+C 停止。”)
#...
:
results = run_once(args.url, args.snapshots, args.json)
if args.interval is 没有:
打破
time.sleep(args.interval)

用法示例:

1
python main.py https://example.com --interval 3600

完整工作脚本

完整的实施方案将所有组件整合到一个模块化的监控和跟踪工具中。

ScraperHub 代码库 布局:

文件职位
fetch.py使用以下方式获取 HTML Crawlbase
提取.py清理 HTML 并规范化文本
fingerprint.py生成 SHA-256 指纹
存储.py加载并存储快照数据
monitor.py比较快照并检测变化
主文件CLI入口点和调度程序

如何运行脚本

设置你的 Crawlbase 首先是令牌。

1
出口 CRAWLBASE_TOKEN="your_token"

然后运行脚本。

1
python main.py https://targeturl.com

要监控多个页面:

1
python main.py https://targeturl1.com https://targeturl2.com ...

第一次运行总是会报告 更改因为目前还没有快照。

错误处理策略

生产环境中的 Python 网站监控脚本需要优雅地处理三种常见的故障模式。

  • 网络超时:requests.get(timeout=30) 电话提款 requests.exceptions.Timeout 如果 Crawlbase API 在 30 秒内未响应。请将 fetch 调用封装在 try/except 语句中,并实现指数退避重试机制:
1
2
3
4
5
6
7
8
9
10
进口
DEF fetch_with_retry(网址: STR,令牌: STR重试次数: INT = 3退后: 浮动 = 2.0)-> STR:
HPMC胶囊 尝试 in 范围(重试次数):
尝试:
回报 fetch_page(url, token)
requests.exceptions.Timeout:
if 尝试次数 < 重试次数 - 1:
time.sleep(退避**尝试)
其他:
提高

  • HTTP 错误: response.raise_for_status() 将 4xx/5xx 响应作为异常处理。记录状态码和 URL,然后跳过受影响的 URL,而不是停止整个运行。
  • 错误的HTML代码: BeautifulSoup 可以优雅地处理大多数格式错误的 HTML,但对于严重格式错误的页面,可能会生成空文本。因此,在提取后添加一个检查:如果 extract_monitorable_text() 返回空字符串,跳过指纹比较,并记录警告而不是记录虚假更改。

扩展工具以支持多个 URL

本教程侧重于最小实现,但该系统可以扩展以应对更大的监控工作负载。

可能的改进措施包括:

• 同时跟踪多个页面
• 并行请求处理
• 使用数据库而非 JSON 存储
• 添加结构化日志记录和重试机制

这些改变使系统在生产环境中更加稳健。

限制和最佳实践

简单的变更跟踪器对于很多页面来说效果很好,但真正的网站可能会引入一些复杂情况。

动态内容

有些网站会在初始页面请求之后使用 JavaScript 加载内容。如果您想要跟踪的页面部分就是这样生成的,那么通常情况下, Crawlbase 请求可能无法返回全部内容。在这种情况下,请切换到…… Crawlbase JavaScript 令牌 因此,页面会在 HTML 返回之前进行渲染。

认证

对于需要登录的页面,请求必须包含有效的会话 cookie。

修复: 通过以下方式传递已验证的 cookie Crawlbase cookies 参数,以便爬虫访问页面的登录版本。

速率限制

  • 默认限制: 每秒 20 个请求
  • 对于大多数监控工作负载而言,这已经足够了。
  • 联系 Crawlbase 支持 申请提高大规模作业的限额

监测间隔

根据页面实际更改的频率选择检查频率:

  • 新闻网站/仪表盘: 每隔 15-60 分钟
  • 产品列表/定价: 每 1-6 小时
  • 政策页面/文档: 每日或每周

过于频繁地运行检查会增加请求成本,而不会提高检测准确率。

下一步是什么

借助本指南中的脚本,您已经拥有了一个用 Python 构建的、可正常运行的网站变更跟踪器。 Crawlbase在此基础上,您可以根据需要进行扩展。例如,您可以添加警报通知、将结果存储在数据库中,或者并行监控更多 URL。

如果你想自己尝试一下,请创建一个 Crawlbase 注册账号并使用1,000次免费请求 测试跟踪器并立即开始监控和跟踪页面。

常見問題解答

它可以同时监控多个页面吗?

是的。向 CLI 传递多个 URL:python main.py https://site1.com https://site2.com脚本默认按顺序处理它们;启用并行处理请使用 ThreadPoolExecutor 为了更快地处理大型 URL 列表。

检查应该多久进行一次?

这取决于内容更新的频率。对于大多数监控场景,每小时检查一次是一个合理的默认值。高频更新页面(例如实时比分、突发新闻)可能需要每 10-15 分钟检查一次。静态文档页面每天检查一次即可。

它能在大量使用 JavaScript 的网站上运行吗?

是的,只需更改一个配置即可。使用 Crawlbase 使用 JavaScript 令牌而非标准令牌。这会在返回 HTML 之前,先在无头浏览器中渲染整个页面,从而确保捕获动态内容。

当情况发生变化时,它能否发送警报?

核心脚本会将变更结果输出到标准输出(stdout),也可以选择输出到 JSON 文件。集成警报功能需要进行少量扩展——调用电子邮件 API(例如 SendGrid)、向 Slack Webhook 发送消息,或者在发生变更时触发任何 HTTP 端点。 check_for_change() 回报 True.

跟踪数百个网址的最佳存储方案是什么?

使用 SQLite 将默认 JSON 文件替换为 SQLite 文件 sqlite3 标准库模块。它支持并发读取,可扩展到大型 URL 列表,并将所有状态保存在一个可移植的文件中。有关即用型实现,请参阅上文的“扩展”部分。