一句话: 本教程将向您展示如何构建一个 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 |
| 美丽的汤4 | HTML解析和文本提取 |
| 哈希库 | 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 | DEF 获取页面(网址: STR,令牌: STR | 没有 = 没有)-> STR: |
此功能:
• 阅读 Crawlbase 象征
• 将目标 URL 发送到 Crawling API
• 获取页面 HTML
• 返回待处理的内容
运用 Crawlbase 确保监控和跟踪工具能够接收到可靠的 HTML 输出。
步骤 3:提取要跟踪的内容
直接比较原始 HTML 代码是不可靠的,因为页面包含许多经常变化的元素。
为了减少噪音,该脚本提取可读的页面文本并删除不必要的元素。
ScraperHub 上的代码示例 - 提取.py
1 | DEF 提取可监控文本(的HTML: STR)-> STR: |
该函数执行以下几个步骤:
• 移除脚本和样式
• 移除导航和页脚元素
• 提取可读文本
• 规范化空白
最终得到页面内容的一致文本表示。
步骤 4:生成内容指纹
该工具不是存储整个页面快照,而是使用加密哈希生成指纹。
哈希值将文本转换为固定长度的字符串。如果内容发生变化,哈希值也会随之改变。
例子 (fingerprint.py):
1 | DEF 内容指纹(文本: STR)-> STR: |
这创造了一个 SHA-256指纹 已清理文本。
使用哈希值的好处:
• 快速比较
• 最低存储需求
• 能够可靠地检测微小变化
即使文本发生微小的变化,也会产生不同的哈希值。
步骤五:存储之前的快照
为了检测更新,该工具必须记住以前运行的指纹。
这将存储两个快照文件:
snapshots.json - 存储 URL → 指纹映射。
snapshots_text.json - 存储每页的规范化文本,以便在内容更改时显示差异。
例子 (存储.py):
1 | DEF 加载快照(路径: STR 路径)-> 字典[STR, STR]: |
当监控器再次运行时,它会加载存储的指纹并将其与新生成的指纹进行比较。
步骤 6:比较当前版本与先前版本
生成当前指纹后,脚本会将其与存储的指纹进行比较。
例子 (monitor.py):
1 | DEF 检查更改(网址: STR,current_hash: STR快照: 字典[STR, STR])-> 布尔: |
如果指纹不同,脚本会报告更改。
可能的结果:
更改
没有变化
脚本首次检查 URL 时,总是会报告 更改 因为尚无先前的快照。当前指纹和页面文本将被存储,以供将来比对。
当页面内容发生变化时,该工具还会生成一个 统一差异 显示更改内容。示例输出可能如下所示:
1 | - - 以前的 |
此差异是使用 Python 生成的 difflib 该模块有助于准确识别页面版本之间的变化。
步骤 7:保存更新后的快照
检查完更改后,脚本会更新存储的快照,以便将来运行可以检测到新的更新。
In monitor.py该脚本会同时存储指纹和提取的文本。
1 | snapshots[url] = 指纹 |
保存这两个值可以让工具检测未来的变化并生成可读的差异。
步骤 8:按计划运行监控程序
监控工具在自动运行时最为有效。
有多种日程安排方案可供选择,常用方法包括:
- Linux 或 macOS 上的 Cron 作业
- Windows任务调度程序
- 基于云的作业调度器
该工具还支持内置的定时任务安排功能。
示例 CLI 配置 主文件:
1 | parser.add_argument(“ - 间隔”, 类型=浮动,metavar=秒, |
用法示例:
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 | 进口 次 |
- 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 列表,并将所有状态保存在一个可移植的文件中。有关即用型实现,请参阅上文的“扩展”部分。









