服务对象与地域限制
PuppyIP 仅面向海外合规企业及其授权人员提供服务,不面向中国大陆地区开放或提供代理服务。本服务仅限用于中国大陆境外的合法业务活动,严禁在中国大陆境内使用本服务。
代理 IP 或服务器位于境外,不改变上述限制。不得通过中转、转接、共享或转售向中国大陆境内的最终使用者提供本服务。使用前请阅读用户服务协议。
本文要点
- POST 的 job id 是异步任务凭据;取得 records 还要在任务完成后调用 GET。
- job status 描述整次任务,records 中的 URL status 描述单个地址状态,outcome 补充处理结果;旧记录可能没有 outcome。
- robots 数组只汇报此次爬取遇到的前 50 个 origin,不能当作全部站点来源清单。
- 先检查 robots.txt、Content Signals、配置筛选和账户限制,不要尝试绕过 CAPTCHA、Turnstile 或访问资格规则。
先把三层状态分开看
Browser Run 的 /crawl 是异步接口。创建任务的 POST 会立即返回 job id,供后续查询;这份确认不代表爬虫已读取页面,也不代表每个 URL 都能返回内容。GET job id 查询整次 crawl 的状态,包括 running、completed、errored、cancelled_by_user、cancelled_due_to_limits 和 cancelled_due_to_timeout。
取回结果后,再看 records 中每个地址自己的 status,例如 queued、completed、disallowed、skipped、errored 或 cancelled。job status 说明整项任务走到哪一步,URL status 说明单个地址状态,outcome 说明具体处理结果。任务 completed 不等于每个页面都成功。
确认结果已经读全,再判断缺页
轮询时可在 GET 请求中加 limit=1,减少返回记录,让轮询响应保持轻量;任务到达终态后,去掉这个参数读取 records。完整响应超过 10 MB 时会返回 cursor,继续用 cursor 分页;也可用 limit 控制每页记录数、用 status 筛选 URL 状态,逐页保存检查。
文档说明单个 crawl 最长可运行七天,完成后的结果保留十四天。排查历史任务时先核对 job id、终态和分页是否完整;过期数据不能从接口取回,也不要用第一次 POST 的确认响应替代最终结果。
用 outcome 识别单页处理原因
URL 的 status 是状态,outcome 是处理原因。当前文档列出的 outcome 包括 success、robots_disallowed、crawl_purpose_disallowed、content_use_disallowed、connection_error、timeout、browser_unavailable、format_generation_error、unsupported_content_type、unclassified_error、page_error 和 too_large。它们提示成功、robots 或 Content Signals 拒绝、连接或超时问题、浏览器不可用、格式生成失败、不支持的响应类型、页面错误或内容过大。
2026 年 11 月 3 日的更新为每个 URL 增加可选 outcome 字段,但较早记录可能不含它。缺少 outcome 不是成功凭据;对旧结果应结合 URL status、响应信息和已返回内容判断。HTTP 错误记录可用 status=errored 筛选,再检查记录携带的响应信息。
把 robots 数组当作 origin 级诊断
job 结果顶部的 robots 数组按 origin 汇总 robots.txt 检查,覆盖本次任务最先遇到的 50 个 origin。每项含 origin 和 state:available 表示获得可用规则,absent 表示没有可用规则,fetch_failed 表示获取规则失败。数组有数量上限,也不保证覆盖后来遇到的所有站点。
请求 robots.txt 时若收到 HTTP 响应,条目会带 status;没有收到 HTTP 响应时会省略该字段。fetch_failed 和 absent 都不等于站点明确禁止某个 URL。应按对应 URL 的 disallowed 状态或 robots_disallowed outcome 判断规则拒绝,不要把网络读取失败当成 robots 禁止。
robots.txt、Content Signals 与站点保护
Browser Run 会遵守目标站点的 robots.txt,包括 crawl-delay,并将不允许抓取的 URL 标为 disallowed。它也遵守 robots.txt 中的 Content Signals:默认 crawlPurposes 包含 search、ai-input 和 ai-train,默认 contentUse 为 full。若站点拒绝了所声明的用途,或允许的 use 级别低于 full,创建请求可能以 400 拒绝。
只在真实用途确实更窄时,才用 crawlPurposes 申明所需用途,并将 contentUse 设为站点允许的级别;Content Signals 是对站点所有者的用途声明,不是绕过限制的参数。Browser Run 不会绕过 CAPTCHA、Turnstile 或其他反机器人保护,目标站点设置的控制规则仍适用。
用当前账户限制解释 cancelled_due_to_limits
Workers Free 对 /crawl 另有限制:每天最多五个 crawl job,每次最多一百页;Browser Run 免费用量还受每天十分钟浏览器时长限制,并按 UTC 日界重置。job 数、单次页数与浏览器时长是不同上限;出现 cancelled_due_to_limits 或限流时,应对照当时计划、任务用量和对应限制排查。
计费页把 /crawl 所属的 Quick Actions 按浏览器时长计费,各种 Browser Run 调用方式共用浏览器时长用量;直接控制浏览器的 Browser Sessions 另有并发浏览器计费。Workers Paid 与 Free 的限额不同,操作前应核对当前计划和用量。JSON 格式提取默认使用 Workers AI,还会产生相应 AI 用量。这里没有执行真实抓取或账单测试,不能据此推定某个任务的费用。
资料来源
常见问题
提交排错工单时应该保留哪些信息?
保留 job id、查询时间、相关 URL 的 status 和 outcome、对应 origin 的 robots state,以及确有返回的 HTTP status。说明是否取完 cursor 分页、用了哪些结果筛选;分享记录时去掉 API token 和认证头。这样能把结果缺失、处理失败和规则拒绝分开讨论。
把创建任务的 limit 设为 100000,Free 就能抓十万页吗?
不能。创建任务的 limit 通用参数默认是 10、最大是 100000,但它不会扩大套餐资格;Workers Free 仍受每次一百页、每天五个任务及每天十分钟浏览器时长限制。创建任务的页数上限也不同于 GET 结果分页的 limit。
一个 timeout 或 page_error 就能证明是出口 IP 的问题吗?
不能。这些 outcome 描述该 URL 的处理结果,不单独证明网络路径或出口 IP 是根因。先看同一记录的响应信息、站点规则和任务配置,再按具体证据排查;更换 IP 不能绕过站点资格或反机器人保护。
返回失败的 URL 是否都不计费?
不能这样推断。计费页明确说明的是 Quick Actions 请求因 waitForTimeout 错误失败时,该浏览器会话不计费;不能把这条说明扩展成所有 timeout、page_error 或失败 outcome 均免费。核对实际用量和当前计费条款,本文没有验证真实账单。