🎯 一款可定制、具备反检测功能的云浏览器,由自主研发的 Chromium驱动,专为网页爬虫AI 代理设计。👉立即试用
返回博客

如何在网页抓取时解决 Cloudflare Turnstile 问题

Sophia Martinez
Sophia Martinez

Specialist in Anti-Bot Strategies

08-Jul-2026

TL;DR:

  • Cloudflare Turnstile 评分的是浏览器,而不是用户。 它在后台读取指纹一致性、行为信号和出口 IP,然后将 cf_clearance cookie 发给一个它信任的浏览器——所以解决办法是成为一个受信任的浏览器,而不是回答一个难题。
  • 本地无头浏览器在三个方面同时失败于 Turnstile: navigator.webdriver 标识、无头默认指纹和数据中心出口 IP。手动修补这三方面是一个维护的无尽循环。
  • 无遗漏抓取浏览器在渲染时通过 Turnstile — 真正自开发的 Chromium,一个持续的会话指纹,以及在195多个国家的住宅出口,通过一个 WebSocket 端点。
  • 你的自动化代码保持不变。 它使用 CDP,因此 puppeteer.connect()chromium.connectOverCDP() 照常工作;你指向云浏览器的连接并读取挑战后的 DOM。
  • Turnstile 有三种模式 — 非互动、隐形和管理复选框——这三种模式在通过的浏览器上都会以相同的 cf_clearance 授权结束。
  • 免费开始。 新的 Scrapeless 账户包括免费的抓取浏览器运行时——在 app.scrapeless.com 注册。

介绍:Turnstile 评分的是浏览器,而不是难题

Cloudflare Turnstile 并不是一个图像 CAPTCHA。它在后台运行,并对加载页面的浏览器进行评分:指纹是否内部一致、交互信号是否看起来是人类的、出口 IP 是否具有良好的声誉。当分数通过时,Cloudflare 会设置一个 cf_clearance cookie,真实页面加载。当不通过时,你会得到一个插页而不是内容。

这改变了“解决 Turnstile”意味着什么。没有答案可以提交——工作是在呈现一个 Cloudflare 已经信任的浏览器。一个本地无头的 Chromium 是做不到的:它通过the navigator.webdriver 属性 宣布自动化,带有无头默认字体和画布行为,并从声誉服务已经知道的 IP 退出。你可以在本地修补其中的每一个,然后在 Chromium 和检测器改变时不断修补。

本指南选择了更短的路径:使用你已经在用的 Puppeteer 或 Playwright 驱动无遗漏抓取浏览器——一个反检测的云浏览器,因此指纹、行为表面和出口 IP 由服务器处理,Turnstile 在正常渲染时通过。


Turnstile 实际检查的内容

Cloudflare 的 Turnstile 文档 描述了一个在不打扰访客的情况下验证访客的小部件。实际上,它以三种模式运行,且同一云浏览器处理所有这些模式,因为它呈现一个一致的真实浏览器,而不是一个修补过的浏览器:

模式 访客看到的内容 评分内容
非互动 一个无需点击的验证小部件 指纹 + 被动行为信号
隐形 没有渲染内容 纯背景评分
管理 一个“验证你是人类”的复选框 以上内容加上一个交互事件

所有三种模式最终都会产生一个 cf_clearance cookie——一个标准的HTTP cookie——设置在一个通过的浏览器上。Turnstile 还利用了在IETF 隐私通行证签发协议中定义的类似于隐私通行证的令牌,这就是为何一个一致的、受信任的浏览器比任何单一的规避方法都更重要。

为什么选择无遗漏抓取浏览器

无遗漏抓取浏览器 是一个可定制的、反检测的云浏览器,专为网络爬虫和 AI 代理而设计。专门针对 Turnstile,它提供了:

  • 真实自开发的 Chromium,可以像 Chrome 一样精确运行小部件的 JavaScript,因此挑战会得到解决,而不是停滞。
  • 一致的会话指纹——没有 navigator.webdriver 标识,没有无头默认值泄露。
  • 在195多个国家的住宅出口——Turnstile 评分出口 IP,而住宅区域的声誉良好,数据中心 IP 则不然。
  • 会话持久性,这样 cf_clearance 授权可以在同一会话中的请求之间重用。
  • 一个连接表面——每个选项都是同一个 WebSocket 端点上的查询参数。

app.scrapeless.com 的免费计划中获取你的 API 密钥。


先决条件

  • Node.js 18 或更高版本
  • Scrapeless 账户和 API 密钥——在 app.scrapeless.com 注册
  • 对Puppeteer或Playwright以及终端的基本熟悉

下面的示例已针对Scraping Browser的文档CDP服务进行了验证。要全程运行它们,需要一个实时的Scrapeless会话;添加您的API密钥以执行每个示例。完整的连接详情可在Scraping Browser文档中找到。


安装

bash Copy
npm install puppeteer-core        # 或: playwright-core
export SCRAPELESS_API_KEY=sk_...   # 免费密钥在 https://app.scrapeless.com

配置连接

所有内容都是wss://browser.scrapeless.com/api/v2/browser上的查询参数。将proxyCountry固定为住宅区域,因为Turnstile会对出口IP进行评分。

javascript Copy
import puppeteer from "puppeteer-core";

const params = new URLSearchParams({
  token: process.env.SCRAPELESS_API_KEY,
  sessionTTL: "180",
  proxyCountry: "US",
});
const browser = await puppeteer.connect({
  browserWSEndpoint: `wss://browser.scrapeless.com/api/v2/browser?${params}`,
});

清除Turnstile并读取令牌

Scrapeless Scraping Browser在渲染期间自动解决Turnstile — 没有明确的解决调用。您导航后,等待Turnstile令牌出现,这是小部件已解析的信号。后续的抓取工作由您自己完成。

javascript Copy
import puppeteer from "puppeteer-core";

const TARGET = "https://www.scrapingcourse.com/cloudflare-challenge";
const params = new URLSearchParams({
  token: process.env.SCRAPELESS_API_KEY,
  sessionTTL: "180",
  proxyCountry: "US",
});

const browser = await puppeteer.connect({
  browserWSEndpoint: `wss://browser.scrapeless.com/api/v2/browser?${params}`,
});
const page = await browser.newPage();
await page.goto(TARGET, { waitUntil: "domcontentloaded", timeout: 60000 });

// 浏览器自动解决Turnstile;等待令牌以确认其已解析。
await page.waitForFunction(
  () => window.turnstile && window.turnstile.getResponse(),
  { timeout: 60000 }
);
const token = await page.evaluate(() => window.turnstile.getResponse());

console.log("turnstile令牌 ->", token.slice(0, 24) + "...");
console.log("标题 ->", await page.title());
await browser.close();

在免费计划中获取您的API密钥: app.scrapeless.com

在Playwright中的相同流程

Playwright通过CDP连接到相同的云浏览器;会话在渲染期间会自动解决Turnstile,您以相同的方式等待令牌。

javascript Copy
import { chromium } from "playwright-core";

const params = new URLSearchParams({
  token: process.env.SCRAPELESS_API_KEY,
  sessionTTL: "180",
  proxyCountry: "US",
});
const browser = await chromium.connectOverCDP(
  `wss://browser.scrapeless.com/api/v2/browser?${params}`
);
const page = await browser.newPage();
await page.goto("https://www.scrapingcourse.com/cloudflare-challenge", {
  waitUntil: "domcontentloaded",
});
await page.waitForFunction(() => window.turnstile && window.turnstile.getResponse());
console.log("标题 ->", await page.title());
await browser.close();

确认通过

可靠的信号是Turnstile令牌 — 一旦window.turnstile.getResponse()返回一个值,小部件就已经解决,您可以继续。Cloudflare还在通过的会话中设置了cf_clearancecookie,如果您需要将清除权限带到其他请求,可以读取。

javascript Copy
const token = await page.evaluate(() => window.turnstile && window.turnstile.getResponse());
console.log("turnstile令牌存在 ->", Boolean(token));

const cookies = await page.cookies();
console.log("cf_clearance存在 ->", cookies.some((c) => c.name === "cf_clearance"));

您获得的回报

  • navigator.webdriver信号缺失 — 云浏览器不宣布自动化,因此Turnstile进行的第一次检查看起来像一个真实的Chrome。
  • 出口IP与proxyCountry一致 — 住宅区域的清除比数据中心IP更可靠,Turnstile对其评分较低。
  • 通过后cf_clearance存在 — 重新使用相同的会话以在后续请求中携带权限。
  • 为顽固页面预热会话 — 在访问受保护页面之前,先在同一会话中加载网站的主页,以便行为表面看起来更像正常访问。

结论:清除Turnstile,保留您的代码

解决 Turnstile 并不是回答一个挑战——而是展示一个 Cloudflare 值得信任的浏览器。Scrapeless Scraping Browser 处理 Turnstile 评分的三项内容(指纹、行为、出口 IP)在服务器端,因此您的 Puppeteer 或 Playwright 代码只需更改连接 URL。将 proxyCountry 固定到一个住宅区域,在首页加热会话,并读取 cf_clearance 确认通行。有关插页式和小部件之间的区别,请参见 Cloudflare challenge vs Turnstile,并在 Scrapeless 定价页面 比较计划。


准备好构建您的 Turnstile 清除管道了吗?

加入我们的社区以申请免费计划,并与抓取受 Turnstile 保护网站的开发者连接:Discord · Telegram

app.scrapeless.com 注册以获取免费的 Scraping Browser 运行时,并将 Puppeteer 或 Playwright 定位到在呈现期间清除 Turnstile 的云浏览器。


常见问题解答

问:Turnstile 是我需要通过求解服务解决的 CAPTCHA 吗?
在通过的浏览器上不是。Turnstile 主要在后台评分指纹、行为和 IP,并发出 cf_clearance cookie。云浏览器被设计为在正常呈现期间通过该评分,因此没有单独的难题需要回答。

问:它是否也处理不可见和非交互模式?
是的。所有三种 Turnstile 模式最终都会得到相同的 cf_clearance 授权,受管理的会话处理被动评分的方式与处理复选框变体的方式相同。

问:我需要代理吗?
不需要。住宅出口已内置——将 proxyCountry 设置为一个区域或 ANY。Turnstile 会评分出口 IP,因此住宅区域的清除效果比数据中心地址更可靠。

问:在某些页面上仍然会出现挑战——有什么帮助吗?
proxyCountry 固定到住宅区域,并在加载受保护页面之前在同一会话中首先加载网站的首页,以便行为表面看起来像是正常访问。

问:我的 Puppeteer 或 Playwright 代码兼容吗?
是的。Scraping Browser 使用 CDP,因此 puppeteer.connect()chromium.connectOverCDP() 仍然可以正常工作——您只需更改连接 URL。

问:清除 Turnstile 合法吗?
访问与网站条款和适用法律一致的公共可用数据。这些技术适用于您已获得许可的授权自动化、测试和研究。

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录