track_changes
保存页面快照,随后可随时将实时页面与其对比。返回结果包括:是否发生变更、变更幅度、新增或删除了哪些文本行,以及一个用于判断标记本身是否被重构的结构相似度评分。
使用场景
在抓取器失效前发现问题
structural_similarity 偏低意味着页面标记已被重构,而这正是选择器失效的真正原因——在提取管道开始返回空结果之前就能发现。
监控竞争对手的定价页面
用 selector 将范围限定到定价表格,按自己的节奏对比,并通过新增和删除的文本行查看具体变动。
追踪法律与政策文档
对比服务条款、隐私政策或监管页面,并保留一份可审计的记录,精确说明哪些行发生了变化。
捕捉 API 文档中的破坏性变更
为供应商的参考文档或更新日志页面建立基线,在每次发版前进行对比。
验证部署只改动了预期内容
发布前建立基线,发布后进行对比,确认差异与预期改动一致。
Endpoint
/api/v1/tools/track_changesParameters
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"` 会返回 501——定时监控是 MCP 服务器的功能。其他任何取值都会以 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 上。 Example: 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
}'响应示例
{ "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 抓取。
定时监控不可用 (501 OPERATION_NOT_AVAILABLE)
托管 REST API 未实现 operation: "monitor"。请按自己的节奏调用 compare,或使用 CrawlForge MCP 服务器。
参数无效 (400 VALIDATION_ERROR)
URL 格式错误,或 operation 不在 create_baseline、compare 和 monitor 之内。响应中的 details 数组会指出出错的字段。
存储不可用 (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。失败的调用不计费。REST API 没有调度器,因此对比频率——以及由此产生的成本——完全由您掌控。成本明细:
create_baseline:3 credits,每个 (url, selector) 组合一次,有效期 90 天
compare:每次调用 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 方案: 50,000 credits/月 = 约 138 个 URL 每 6 小时对比一次($99/月)