跳到正文
监控高级3 credits

track_changes

保存页面快照,随后可随时将实时页面与其对比。返回结果包括:是否发生变更、变更幅度、新增或删除了哪些文本行,以及一个用于判断标记本身是否被重构的结构相似度评分。或者传入 operation: "monitor",让 CrawlForge 按计划为您检查页面。

使用场景

在抓取器失效前发现问题

structural_similarity 偏低意味着页面标记已被重构,而这正是选择器失效的真正原因——在提取管道开始返回空结果之前就能发现。

监控竞争对手的定价页面

用 selector 将范围限定到定价表格,按自己的节奏对比,并通过新增和删除的文本行查看具体变动。

追踪法律与政策文档

对比服务条款、隐私政策或监管页面,并保留一份可审计的记录,精确说明哪些行发生了变化。

捕捉 API 文档中的破坏性变更

为供应商的参考文档或更新日志页面建立基线,在每次发版前进行对比。

验证部署只改动了预期内容

发布前建立基线,发布后进行对比,确认差异与预期改动一致。

Endpoint

POST/api/v1/tools/track_changes
Auth Required
Free 方案 1 次请求/秒
3 credits

Parameters

NameTypeRequiredDefaultDescription
url
stringRequired-
要捕获或对比的页面。
Example: https://competitor.com/pricing
operation
stringOptionalcompare
取值为 `"create_baseline"`、`"compare"` 或 `"monitor"` 之一。`monitor` 会为该 URL 创建一个[托管监控](/docs/api-reference/monitors),且该次调用不计费。其他任何取值都会以 400 拒绝。
Example: compare
selector
stringOptional-
用于将追踪范围限定到页面局部的 CSS 选择器,例如 `.pricing-table`。基线按 (url, selector) 组合分别存储,因此同一个 URL 可以在多个范围上独立追踪。若选择器未匹配到任何元素,返回 422。
Example: .pricing-table
update_baseline
booleanOptionalfalse
仅用于 `compare`。对比完成后,用刚刚抓取到的内容覆盖已存储的基线。适用于滚动对比场景:每次调用报告的是自上次调用以来的变更,而非自最初捕获以来的变更。
Example: false
respect_robots
booleanOptionaltrue
遵守目标站点的 robots.txt。保持 `true` 时,robots.txt 对 `CrawlForge` 禁止的路径会在抓取之前以 403 拒绝,且不扣除 credits。仅在你与目标站点另有约定时才设为 `false`——此时响应会带上一条 `warnings`,并且该覆盖会记录到你的 API key 上。托管监控始终遵守 robots.txt。
Example: true
schedule
stringOptional0 * * * *
仅用于 `monitor`。托管监控运行所依据的五段式 cron 表达式,按 UTC 计算。相邻两次运行至少间隔 5 分钟,否则调用会以 400 拒绝。
Example: */15 * * * *
notify_emails
string[]Optional-
仅用于 `monitor`。最多 5 个邮箱地址,当一次检查发现新增、变更、被拦截或出错的页面时收到邮件。
Example: ["alerts@example.com"]
webhook_url
stringOptional-
仅用于 `monitor`。接收已签名的 `monitor.page` 和 `monitor.check.completed` 事件的公网 `https` URL。系统会生成一个 `webhook_secret` 并随监控一起返回。
Example: https://example.com/hooks/crawlforge

操作

创建一次基线,之后可随意多次对比——或者把页面交给托管监控。

create_baseline
抓取页面,将其归约为规范化的可见文本,并连同内容哈希和结构签名一起存储。基线按 API 账户保留 90 天。请先执行该操作——没有基线直接对比会返回 404。
compare
重新抓取页面,并与已存储的基线逐行比对。返回变更百分比、结构相似度、计数,以及新增和删除文本行的样本。这是默认操作。
monitor
创建一个以 URL 主机名命名的托管监控,包含这一个目标、schedule(默认每小时)、UTC 时区和 30 天保留期,并在 data.monitor 中返回它——包括 webhook_secret。调用本身不计费;每次计划检查按每个已对比目标收取 3 credits,被拦截或出错的目标免费。可通过监控 API 或控制台管理。

本地或托管

计划监控可以在两个地方之一运行,运行位置决定了由谁来维持进程存活,以及您如何收到通知。

在您的机器上:MCP 服务器
在 CrawlForge MCP 服务器 上执行 operation: "create_scheduled_monitor",会把监控存储在 ~/.crawlforge/monitors 下并在进程内触发,因此检查只在服务器进程存活期间运行;错过的运行会在重启时补跑,而由系统 cron 执行的 crawlforge monitor:run-due 才是有保证的路径。它从您的机器通过 webhook 或 Slack 发送通知,从不发送邮件。您运行的每次本地检查收取 3 credits。
托管:CrawlForge 的调度器
可在此处用 operation: "monitor" 创建,也可通过 /api/v1/monitors 创建,或从 MCP 服务器用 hosted: true 创建。CrawlForge 自己的调度器负责抓取、对比并记录每一次检查,无需您的任何进程,并通过邮件和已签名的 webhook 发送通知。每次检查按每个已对比目标收取 3 credits,被拦截或出错的目标免费。可在控制台中管理。

如何解读对比结果

两个评分回答的是不同问题,结合起来比单看任何一个都更有价值。

change_percent:文本变动了多少
新增行加删除行占较大文档的比例,范围 0-100。任何真实的内容更新都会使其升高;带时间戳、访问计数或轮播推荐语的页面同样会偏高,因此动态页面会有一个较高的噪声基准。
structural_similarity:标记是否仍然一致
0-1 的评分,比较标签词汇与嵌套深度。change_percent 高而 structural_similarity 也高,说明是同一套布局配上了新文案。评分偏低则说明页面被重构了,而这正是选择器失效的原因。

请求示例

terminalBash
# 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"
  }'

响应示例

200 OK1,180ms
{
"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
}
Field Descriptions
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 取何值,这类主机一律被拒绝。

credits 消耗

3 credits
每次调用 3 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/月)

相关工具