托管浏览器
只需一次 API 调用,就能在我们的服务器上启动一个 Clearcote 浏览器,并通过 Chrome DevTools Protocol 从 Playwright、Puppeteer 或任意 CDP 客户端驱动它。你无需自行安装或运行任何东西。流量默认经住宅 IP 出网,按 GB 从预付余额中扣费。
- 住宅 IP,而非数据中心 IP。网站看到的是来自普通家用宽带运营商的真实家庭网络连接,而不是主机托管或云服务的地址。
- 真实硬件,而非 VPS。浏览器运行在我们自有的独立物理服务器上,而不是共享的云虚拟机。
托管浏览器的更多内容:本地与云端共用一个 SDK(launch(cloud=True))、智能体任务(输入一个任务,输出 JSON)、录像与事件时间线、Cookie 同步、密钥与 2FA,以及交给真人处理与 Webhook。免费连接 GitHub 即可免费获得 €5 流量。无需信用卡。
一次性赠送,每个 GitHub 账号限领一次。GitHub 账号须注册满 30 天。
1. 获取 API 密钥
在“API keys”页面创建一个。密钥以 cc_live_ 开头,作为 bearer token 发送。请妥善保管:任何持有它的人都能花掉你的余额。
2. 启动浏览器并连接
POST /api/v1/browsers 会返回一个 connectUrl:指向该浏览器的一次性 WebSocket URL。请在两分钟内连接;它不能重复使用。浏览器会在你连接的那一刻启动,通常几秒内即可就绪;但如果设置了 country,会先查询出口 IP 的位置,最长可能需要半分钟左右。Playwright 默认 30 秒后放弃连接,因此示例中都传入了两分钟的 timeout。
javascript
// Node.js + Playwright
import { chromium } from "playwright";
const res = await fetch("https://www.clearcotelabs.com/api/v1/browsers", {
method: "POST",
headers: { authorization: "Bearer cc_live_...", "content-type": "application/json" },
body: JSON.stringify({ identity: "account-1", country: "us" }),
});
const { connectUrl, id, error } = await res.json();
if (error) throw new Error(error);
const browser = await chromium.connectOverCDP(connectUrl, { timeout: 120_000 }); // the browser starts as you connect
const context = browser.contexts()[0];
const page = context.pages()[0] ?? (await context.newPage());
await page.goto("https://example.com");
await browser.close(); // ends the sessionjavascript
// Puppeteer: the same connectUrl
const browser = await puppeteer.connect({ browserWSEndpoint: connectUrl, defaultViewport: null });python
# Python + Playwright
import requests
from playwright.sync_api import sync_playwright
r = requests.post("https://www.clearcotelabs.com/api/v1/browsers",
headers={"authorization": "Bearer cc_live_..."},
json={"identity": "account-1", "country": "de"}).json()
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(r["connectUrl"], timeout=120_000)
page = browser.contexts[0].new_page()
page.goto("https://example.com")
browser.close()创建调用返回 201,响应中包含你的代码连接浏览器和了解价格所需的全部信息:
json
{
"id": "bs_…", // use it with GET / DELETE /api/v1/browsers/<id>
"connectUrl": "wss://…/v1/connect/bs_…?token=…",
"expiresAt": "2026-09-24T10:02:00.000Z", // connect before this (two minutes)
"worker": "w_…",
"pricing": { "eurPerGb": 1, "eurPerHour": 0 },
"limits": { "maxSeconds": 14400, "idleSeconds": 300 } // plus maxBytes when capped
}最佳实践
- 只连接,不启动。用
connectOverCDP或puppeteer.connect连接connectUrl;chromium.launch()则会在你自己的机器上启动一个浏览器。 - 用现成的。使用
browser.contexts()[0]及其第一个页面,而不是新建 context:新 context 不带 Profile 的 cookie 和存储,而且 Playwright 会给它一个模拟的 1280×720 视口,与浏览器窗口不一致。 - 在创建时设定身份画像,而不是在脚本里。国家、时区和语言应该放在创建调用中。在脚本里覆盖 user agent、视口或 navigator 属性,恰恰会制造出检测所要寻找的那种不一致。
- CDP 钩子范围要尽量小。宽泛的监听器、对每个请求的拦截以及 init 脚本,本身就是自动化的指纹。原版 Playwright 和 Puppeteer 可以直接使用,只有两个调用例外(setContent 和 exposeFunction):引擎会让
Runtime.enable的副作用不触及页面本身,因此像 Patchright 这样的修补版驱动是可选项,而非必需。 - 一个会话,多个页面。启动浏览器是最慢的环节;请在同一个浏览器内导航。用 Profile 登录一次即可,不必每次运行都登录。
- 务必停止。在
finally中关闭浏览器,并根据任务设置maxGb和idleTimeoutSec,这样即使代码有 bug,也不会让浏览器一直用你的余额运行下去。 - 先观察,再加代码。当某个站点表现异常时,先在实时画面中观察(或接管控制),再考虑添加等待和变通方案。