track_ changes
保存页面快照,随后可随时将实时页面与其对比。返回结果包括:是否发生变更、变更幅度、新增或删除了哪些文本行,以及一个用于判断标记本身是否被重构的结构相似度评分。或者传入 operation: "monitor",让 CrawlForge 按计划为您检查页面。
使用场景
在抓取器失效前发现问题
structural_similarity 偏低意味着页面标记已被重构,而这正是选择器失效的真正原因——在提取管道开始返回空结果之前就能发现。
监控竞争对手的定价页面
用 selector 将范围限定到定价表格,按自己的节奏对比,并通过新增和删除的文本行查看具体变动。
追踪法律与政策文档
对比服务条款、隐私政策或监管页面,并保留一份可审计的记录,精确说明哪些行发生了变化。
捕捉 API 文档中的破坏性变更
为供应商的参考文档或更新日志页面建立基线,在每次发版前进行对比。
验证部署只改动了预期内容
发布前建立基线,发布后进行对比,确认差异与预期改动一致。
Endpoint
/api/v1/tools/track_changesParameters
该端点接受八个参数;schedule、notify_emails 和 webhook_url 仅在 operation: "monitor" 时生效。早期示例会传入 trackingOptions、monitoringOptions 和 storageOptions 对象——托管 REST API 会接受这些键但忽略它们,因此传入不会产生任何效果。对应的控制项存在于 CrawlForge MCP 服务器。
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
url | string | Required | - | 要捕获或对比的页面。 Example: https://competitor.com/pricing |
operation | string | Optional | compare | 取值为 `"create_baseline"`、`"compare"` 或 `"monitor"` 之一。`monitor` 会为该 URL 创建一个[托管监控](/docs/api-reference/monitors),且该次调用不计费。其他任何取值都会以 400 拒绝。 Example: compare |
selector | string | Optional | - | 用于将追踪范围限定到页面局部的 CSS 选择器,例如 `.pricing-table`。基线按 (url, selector) 组合分别存储,因此同一个 URL 可以在多个范围上独立追踪。若选择器未匹配到任何元素,返回 422。 Example: .pricing-table |
update_baseline | boolean | Optional | false | 仅用于 `compare`。对比完成后,用刚刚抓取到的内容覆盖已存储的基线。适用于滚动对比场景:每次调用报告的是自上次调用以来的变更,而非自最初捕获以来的变更。 Example: false |
respect_robots | boolean | Optional | true | 遵守目标站点的 robots.txt。保持 `true` 时,robots.txt 对 `CrawlForge` 禁止的路径会在抓取之前以 403 拒绝,且不扣除 credits。仅在你与目标站点另有约定时才设为 `false`——此时响应会带上一条 `warnings`,并且该覆盖会记录到你的 API key 上。托管监控始终遵守 robots.txt。 Example: true |
schedule | string | Optional | 0 * * * * | 仅用于 `monitor`。托管监控运行所依据的五段式 cron 表达式,按 UTC 计算。相邻两次运行至少间隔 5 分钟,否则调用会以 400 拒绝。 Example: */15 * * * * |
notify_emails | string[] | Optional | - | 仅用于 `monitor`。最多 5 个邮箱地址,当一次检查发现新增、变更、被拦截或出错的页面时收到邮件。 Example: ["alerts@example.com"] |
webhook_url | string | Optional | - | 仅用于 `monitor`。接收已签名的 `monitor.page` 和 `monitor.check.completed` 事件的公网 `https` URL。系统会生成一个 `webhook_secret` 并随监控一起返回。 Example: https://example.com/hooks/crawlforge |
操作
创建一次基线,之后可随意多次对比——或者把页面交给托管监控。
schedule(默认每小时)、UTC 时区和 30 天保留期,并在 data.monitor 中返回它——包括 webhook_secret。调用本身不计费;每次计划检查按每个已对比目标收取 3 credits,被拦截或出错的目标免费。可通过监控 API 或控制台管理。本地或托管
计划监控可以在两个地方之一运行,运行位置决定了由谁来维持进程存活,以及您如何收到通知。
operation: "create_scheduled_monitor",会把监控存储在 ~/.crawlforge/monitors 下并在进程内触发,因此检查只在服务器进程存活期间运行;错过的运行会在重启时补跑,而由系统 cron 执行的 crawlforge monitor:run-due 才是有保证的路径。它从您的机器通过 webhook 或 Slack 发送通知,从不发送邮件。您运行的每次本地检查收取 3 credits。operation: "monitor" 创建,也可通过 /api/v1/monitors 创建,或从 MCP 服务器用 hosted: true 创建。CrawlForge 自己的调度器负责抓取、对比并记录每一次检查,无需您的任何进程,并通过邮件和已签名的 webhook 发送通知。每次检查按每个已对比目标收取 3 credits,被拦截或出错的目标免费。可在控制台中管理。如何解读对比结果
两个评分回答的是不同问题,结合起来比单看任何一个都更有价值。
检测基于文本:页面通过 HTTP 抓取且从不执行 JavaScript,因此客户端渲染的内容对该端点不可见。如需无需自有进程、按计划运行并带有 webhook 和检查历史的检查,请创建托管监控。如需浏览器渲染的追踪,请使用 CrawlForge MCP 服务器,它也可以用 hosted: true 把监控交给托管调度器。
当已存储的基线早于该字段引入时,structural_similarity 为 null 而非 0。零是一个真实评分,表示结构上没有任何内容留存,因此未测量的对比会返回 null。重新执行 create_baseline,或传入一次 update_baseline,即可开始为其评分。
请求示例
# Step 1: capture the baseline (once per url + selector, kept 90 days)
curl -X POST https://crawlforge.dev/api/v1/tools/track_changes \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://competitor.com/pricing",
"operation": "create_baseline",
"selector": ".pricing-table"
}'
# Step 2: compare against it, as often as you like
curl -X POST https://crawlforge.dev/api/v1/tools/track_changes \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://competitor.com/pricing",
"operation": "compare",
"selector": ".pricing-table"
}'
# Rolling comparison: diff against the previous call, not the original capture
curl -X POST https://crawlforge.dev/api/v1/tools/track_changes \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://competitor.com/pricing",
"operation": "compare",
"selector": ".pricing-table",
"update_baseline": true
}'
# Hosted monitor: CrawlForge checks the page every 15 minutes on its own
# scheduler and posts signed webhooks. Creating it costs nothing; each check
# bills 3 credits per compared target.
curl -X POST https://crawlforge.dev/api/v1/tools/track_changes \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://competitor.com/pricing",
"operation": "monitor",
"selector": ".pricing-table",
"schedule": "*/15 * * * *",
"webhook_url": "https://example.com/hooks/crawlforge"
}'响应示例
{ "success": true, "data": { "operation": "compare", "url": "https://competitor.com/pricing", "selector": ".pricing-table", "changed": true, "change_percent": 12.5, "structural_similarity": 0.9713, "added_count": 4, "removed_count": 2, "added_samples": [ "Pro $79 / month", "Includes 50,000 credits", "Enterprise", "Contact sales" ], "removed_samples": [ "Pro $99 / month", "Includes 25,000 credits" ], "baseline_captured_at": "2026-08-01T12:00:00.000Z", "compared_at": "2026-08-26T14:30:00.000Z", "baseline_updated": false }, "credits_used": 3, "credits_remaining": 997, "processing_time": 1180}data.changed当内容哈希与基线不同时为 true——如果只需要是或否的判断,这是最快的检查方式。data.change_percent新增行加删除行占较大文档的百分比,范围 0-100。data.structural_similarity0-1 的标记相似度。当基线早于该字段引入时为 null。data.added_samples最多 20 条新增行,每条截断至 500 个字符。这不是完整差异——真实总数请看 added_count。data.removed_samples最多 20 条删除行,限制与 added_samples 相同。data.baseline_updated本次调用是否覆盖了基线,与 update_baseline 参数对应。credits_used3 credits,按成功调用计费。失败的调用不计费。错误处理
未找到基线 (404 BASELINE_NOT_FOUND)
您在存储基线之前调用了 compare,或 90 天的基线已过期。请先针对完全相同的 (url, selector) 组合执行 create_baseline。
选择器未匹配到内容 (422 SELECTOR_NOT_FOUND)
该 CSS 选择器没有返回任何元素。请对照实时标记检查——在 JavaScript 执行后于开发者工具中有效的选择器,未必存在于该端点抓取到的原始 HTML 中。
目标不可达 (502 FETCH_FAILED)
页面返回了非 2xx 状态。有反爬保护的站点通常会落到这里——请改用 stealth_mode 抓取。
参数无效 (400 VALIDATION_ERROR)
URL 格式错误,或 operation 不在 create_baseline、compare 和 monitor 之内。响应中的 details 数组会指出出错的字段。schedule 不是五段式 cron 表达式,或触发频率高于每 5 分钟一次,同样会以该错误码拒绝。
存储不可用 (503 STORAGE_UNAVAILABLE)
无法访问基线存储。请重试——失败的调用不会扣除 credits。
被 robots.txt 拦截(403 Forbidden)
目标站点的 robots.txt 对 CrawlForge 禁止了该路径。若你与目标站点另有约定,可设置 respect_robots: false 予以覆盖——该覆盖会记录到你的 API key 上。该覆盖不适用于列入 CrawlForge 永久排除名单的主机——无论 respect_robots 取何值,这类主机一律被拒绝。
请用 selector 限定范围,而不是追踪整个页面。整页基线会把导航栏、页脚、Cookie 横幅和轮播内容都纳入其中,而这通常正是每次对比都出现变更的原因。
credits 消耗
create_baseline 和 compare 均消耗 3 credits。失败的调用不计费。调用 monitor 不计费;它创建的托管监控在每次计划检查中按每个已对比目标收取 3 credits,被拦截或出错的目标免费。按自己的节奏调用 compare 时,对比频率——以及由此产生的成本——完全由您掌控。成本明细:
create_baseline:3 credits,每个 (url, selector) 组合一次,有效期 90 天
compare:每次调用 3 credits
monitor:创建 0 credits;每次计划检查按每个已对比目标 3 credits
轮询成本示例(每个 URL):
每小时: 24 次调用/天 = 72 credits/天
每 6 小时: 4 次调用/天 = 12 credits/天
每天: 1 次调用/天 = 3 credits/天
方案建议:
Free 方案: 1,000 个一次性试用 credits = 约 5 个 URL 每 6 小时对比一次,可用一个月
Hobby 方案: 5,000 credits/月 = 约 13 个 URL 每 6 小时对比一次($19/月)
Professional 方案: 100,000 credits/月 = 约 276 个 URL 每 6 小时对比一次($99/月)
相关工具
准备好试用 track_changes 了吗?免费注册,获得 1,000 credits,为您的第一批页面建立基线。