Puppeteer 免费额度用完怎么办:限额、重置与升级
Puppeteer 免费额度用完通常不是 Puppeteer 本身“欠费”,而是承载浏览器的云服务触发了并发、请求数或时长限制。截至 2026-07-29 的公开资料,Puppeteer 官方仓库提供的是浏览器自动化 API;额度规则取决于你使用的云浏览器服务。当前最值得排查的方向是:先区分本地 Puppeteer 与云端浏览器,再确认具体限制、会话是否被占用,以及额度何时重置。
先分清:Puppeteer 本身没有统一免费额度
Puppeteer 是一个用于控制 Chrome 或 Firefox 的 JavaScript 库,默认以无可见界面的 headless(无头浏览器)方式运行。官方安装方式有两种:
npm i puppeteer
这会下载与当前包版本兼容的 Chrome;如果只需要把 Puppeteer 当作库使用,并使用系统已有的浏览器,则安装:
npm i puppeteer-core
因此,如果你是在本地运行 puppeteer.launch(),看到“额度”“配额”“并发会话”等词,通常说明项目连接的是某个云浏览器或浏览器托管服务,而不是 npm 包本身。解决顺序应该是:
| 场景 | 需要检查的限制 | 优先处理方式 |
|---|---|---|
| 本地执行 Puppeteer | 浏览器是否安装、运行时是否能启动 | 检查浏览器下载和启动错误 |
| 云端 Browser Rendering | 每日浏览器时间、并发会话、每分钟请求数 | 关闭闲置会话,降低并发 |
| 使用 API Key 的云服务 | 每月请求额度、速率限制 | 等待月度重置,或按服务商规则调整方案 |
这张表的意义是避免一看到“额度用完”就去修改 Puppeteer 配置。若错误发生在 page.goto() 或云端会话创建阶段,限制通常在服务端;若发生在 puppeteer.launch() 之后打开网页之前,则要先排查本地浏览器环境。
免费层到底限制了什么
官方 limits 与定价页给出的现行额度:Workers Free 浏览器时长 10 分钟/天、并发浏览器 3 个/账户(新实例每 20 秒 1 个、浏览器空闲超时 60 秒);Workers Paid 每月 10 小时(超出 $0.09/小时)、并发浏览器定价页口径为月均含额 10 个(超出 $2.00/个),limits 页标注单账户硬上限 200 个 —— 两页口径不同(含额 vs 硬上限),以各自页面说明为准。原补充资料(API Commons 转录文件)里的付费层数值(30 并发、每分钟 180 请求等)是脚手架默认值,与官方现行值不一致 —— 一律以官方页为准。
这些数字不是 Puppeteer 官方仓库统一规定的额度,而是该资料针对云浏览器服务的具体记录。实际使用时,至少要确认三件事:
- 你连接的服务是不是该资料描述的 Browser Rendering 服务。
- 当前账号是否真的处于 Free Tier(免费层)。
- 你的应用是否把“请求数”“会话数”和“浏览器运行时间”混成了一个额度概念。
如果本地脚本只是反复打开网页,但云端不断创建新的浏览器实例,最先撞到的往往是并发会话限制,而不是每月请求额度。Puppeteer 的一个 browser 可以包含多个 page(标签页),在任务允许的情况下,优先复用同一个 browser,再创建多个 page,通常比不断 launch() 更省资源。
额度耗尽时的可执行处理步骤
1. 先确认安装方式和浏览器环境
在项目目录执行:
npm i puppeteer
然后运行:
npx puppeteer browsers install
这条命令来自 Puppeteer 官方仓库 README,适用于安装脚本被现代包管理器阻止、导致浏览器没有下载的情况。安装后可以运行:
node -e "const p=require('puppeteer'); p.launch().then(async b=>{console.log('Puppeteer browser launched'); await b.close()}).catch(e=>{console.error(e.message); process.exit(1)})"
成功标志是输出 Puppeteer browser launched。如果这里就失败,问题还停留在本地浏览器、权限或系统依赖层面,不应先排查云端额度。
2. 在创建会话前读取额度
针对支持 puppeteer.limits() 的云端环境,资料中的检查方式是:
const limits = await puppeteer.limits(env.MYBROWSER);
// { remaining: 540000, total: 600000, concurrent: 2 }
这里需要替换 env.MYBROWSER 为实际使用的云端浏览器连接配置。不要把示例中的 remaining 和 total 当成固定额度,它们只是返回对象示例;真正有意义的字段是当前服务返回的剩余量、总上限和当前并发数。
更稳妥的应用流程是:
const limits = await puppeteer.limits(env.MYBROWSER);
if (!limits.allowedBrowserAcquisitions) {
throw new Error("Rate limit reached");
}
const browser = await puppeteer.launch(env.MYBROWSER);
这段逻辑的含义是:先查询当前服务是否允许创建新的浏览器获取请求,再启动 browser。若不允许创建新会话,程序应立即停止继续堆积任务,转入等待或复用已有会话。
3. 复用会话、限制并发并正确清理
资料建议的优先顺序是:检查额度、复用会话、执行任务、成功后断开连接,出错时关闭 browser。对于短任务,可以把多个页面放进同一个 browser:
const browser = await puppeteer.launch(env.MYBROWSER);
try {
const pages = await Promise.all([
browser.newPage(),
browser.newPage(),
]);
await Promise.all(
pages.map((page) => page.goto("https://example.com"))
);
} finally {
await browser.close();
}
这能减少重复创建云端会话,但页面数量仍要控制在服务商允许的并发范围内。最常见的误区是只写 browser.close(),却没有处理异常路径,导致脚本失败后 browser 仍占用并发名额;try/finally 可以保证无论任务是否抛错都执行清理。
4. 遇到 429 时按响应等待,不要立即重试
限速资料列出的响应码包括 429 和 503,并建议客户端遵守 Retry-After 响应头,并使用带抖动的指数退避。带抖动的指数退避,是每次等待时间逐步增加,同时加入随机偏移,避免多个任务在同一时刻再次冲击服务端。
在 Node.js 中可以把 Retry-After 转换为等待时间,并设置上限:
async function waitBeforeRetry(response: Response) {
const retryAfter = response.headers.get("retry-after");
const seconds = retryAfter ? Number(retryAfter) : 60;
await new Promise((resolve) =>
setTimeout(resolve, Math.min(seconds, 300) * 1000)
);
}
这不是 Puppeteer 内置命令,而是根据响应头实现的重试等待逻辑。若你的云服务返回 Retry-After,优先按它等待(示例代码把等待上限设为 300 秒);没有该响应头时,示例代码退到固定等待 60 秒 —— 上面那条”指数递增 + 随机抖动”是资料建议的更优做法,示例为求直白没有实现,需要时可自行扩展。
免费额度什么时候重置,要按限制类型判断
转录资料给出的 API Commons Rate Limits 规则是:每分钟、每秒窗口采用滑动窗口;月度额度在每个日历月开始时按 UTC 重置;免费层默认每分钟请求上限为 10、短时突发 20、月度 1000。注意出处已失效:该转录文件所在仓库已被清空(2026-11-04 实测根目录仅剩 README),这些数值是写稿时抓取的快照,需自行核对;官方现行的限流口径见 limits 页 —— 触发限流返回 429,按其 Retry-After 值退避重试。
因此,不能笼统地说“额度过几天就恢复”:
- 每分钟请求数超限,通常应等待当前速率窗口恢复。
- 并发会话超限,应关闭闲置 browser,而不是只等待重置。
- 每日浏览器时间超限,需要等该日额度恢复,或者减少运行时间。
- 月度请求额度超限,应等下个日历月开始时按 UTC 重置。
需要特别注意:这份规范文件明确标注其中部分默认值是脚手架值,不能自动等同于任何服务商的正式承诺。最终判断应优先看当前服务返回的额度对象、响应头和服务控制台状态。
升级前先排除这几种误判
报错:Session limit exceeded
资料给出的原因是并发会话过多。处理方式是关闭不用的 browser,并尽量用多个 page 代替多个 browser;如果仍无法创建会话,先查询 puppeteer.limits(),再决定等待还是复用。
报错:返回 429
这表示请求速率超限。不要立刻重复发送同一请求;读取 Retry-After,按上面给出的等待逻辑等待,并减少并发任务。
报错:返回 503
资料把 503 与限流响应一起列出,说明它可能是服务暂时不可用或达到速率限制后的响应。先按上面的等待逻辑等待,再重试;如果持续出现,检查是否存在已创建但未关闭的 browser,以及服务账号是否已经耗尽月度额度。
报错:Could not find Chrome (ver. ...) 或浏览器启动失败
这类错误不是额度问题。执行:
npx puppeteer browsers install
如果使用的是 puppeteer-core,则还要确认系统中存在可用的 Chrome 或 Firefox,并让代码通过 executablePath 指向该浏览器。
什么时候该升级方案
只有确认错误来自云服务额度,并且免费层无法满足任务时,才需要升级。升级前先看服务控制台中的当前计划、用量、并发会话和账单页;不要只看“请求数”,还要同时确认浏览器分钟数,因为免费层的每日浏览器时间可能先耗尽。
升级后做一次最小验证:创建浏览器、打开页面、关闭浏览器,再观察控制台用量是否增长。成功标志是限额查询不再显示额度为零、任务不再返回 429 或 Session limit exceeded,并且异常路径结束后没有残留会话。
如果服务方没有提供可核实的套餐名称、价格或升级按钮路径,就不能把某个具体套餐金额写成 Puppeteer 的官方价格;实际付款前应以该云服务当前控制台为准。
延伸入口与最终核验路径
- Puppeteer 官方仓库与安装说明:https://github.com/puppeteer/puppeteer/tree/main#readme
- Puppeteer 官方首页:https://pptr.dev/
- Browser Rendering 限制与错误处理参考:https://github.com/pedronauck/skills/blob/17886f6f66c2d51adb9ad0a3974da9b961c89be9/skills/community/cloudflare/references/browser-rendering/gotchas.md
- Cloudflare Browser Rendering 限额(官方现行):并发、浏览器时长、空闲超时与 429 退避的出处
最终核验顺序可以压缩成三步:先在项目目录执行 npx puppeteer browsers install 排除本地环境问题;再运行 puppeteer.limits(env.MYBROWSER) 查看服务实际额度;最后根据 429、503 或 Session limit exceeded 的具体响应,分别执行等待、复用会话或升级方案。这样能把“额度用完”和“浏览器没装好”彻底分开处理。
参考来源
- Browser Rendering Gotchas
- Cloudflare Browser Rendering 定价(官方现行):Free/Paid 的时长与并发额度(原 API Commons 转录文件已随仓库清空失效,2026-11-04 实测)
评论区
登录后可评论。