In this Article
如果您正在研究如何绕过 Cloudflare,请先识别响应类型,确认访问已获授权,再针对出问题的具体层级进行测试。目前并不存在能保证访问成功的通用代理、请求头或浏览器设置。
在本文中,绕过 Cloudflare 指的是通过诊断、兼容的客户端或网站所有者批准的访问方式,来解决自动化访问问题。它不意味着攻击防火墙、为规避防护而查找源站服务器,或越过登录边界。
我们将网络身份、传输层指纹、JavaScript、验证状态和请求行为分开来看。我们在 2026 年 10 月 15 日做的七站快照测试表明,调整某一层可能对某个目标站点有帮助,对另一个站点却毫无变化。
关键事实
- 我们在 2026 年 10 月 15 日的快照中,通过四种客户端与线路组合,向七个受 Cloudflare 保护的网站共发送了 28 个 HTTP 请求。
- 第二轮测试使用默认的无头 Chromium 加载了其中六个网站:没有一次通过验证挑战。
- 在七站对比中,仅更换网络线路没有带来任何不同的 HTTP 结果。
- Coinbase 在两条被测网络线路上通过 curl_cffi 均返回了 HTTP 200。
- 拦截页面变成验证挑战页面,并不等于成功获取了数据。
- 仅使用住宅线路,在七个网站中没有一个改变了结果。
Cloudflare 拦截您时,究竟在检查什么?
Cloudflare 可以评估多种请求与浏览器证据。我们的五层 Cloudflare 信任阶梯用于梳理排查思路;它是一种工程模型,并非每个请求都会遵循的官方文档化流程。
Cloudflare 的文档将请求头、会话特征和浏览器信号列为检测输入。其机器人检测文档说明了为什么只改变单一可见属性是不完整的实验。

- 第 1 层:网络身份。记录出口 IP、网络运营商或 ASN 以及所在位置。对比不同线路时,不要预设每次拒绝都是 IP 信誉问题。
- 第 2 层:传输层与 HTTP 身份。检查客户端协议栈、TLS 握手和 HTTP 行为。请求头里的浏览器名称只是证据之一。
- 第 3 层:JavaScript 执行。判断该工作流是否需要浏览器环境,而不是仅靠一个 HTTP 响应。
- 第 4 层:验证状态。区分组件令牌与特定浏览器会话所持有的通行许可。
- 第 5 层:行为与频率。跟踪请求间隔、并发、重复失败和会话连续性。
Cloudflare 的 JA3 和 JA4 文档介绍了由 TLS 客户端发起连接的方式所衍生的指纹。修改 User-Agent 既不会改变这次握手,也不会执行 JavaScript。请把 TLS 和 HTTP/2 行为一并纳入您的诊断清单,但不要想当然地认为某个特定指纹导致了拒绝。
这个阶梯有助于拆分问题。换一个网络,结果变了吗?换一个 HTTP 客户端,结果变了吗?浏览器执行后能否显示预期内容?每个答案都会缩小排查范围,但没有哪一个能证明您拥有采集数据的许可。
这是 Cloudflare 验证挑战,还是普通的 403?
Cloudflare 挑战页面带有 cf-mitigated: challenge,并使用 text/html,即使所请求的资源是 JSON。仅凭带有 cf-ray 的 403 并不能确定原因。
请结合 Cloudflare 的挑战响应文档、403 故障排查指南和 HTTP 请求头参考一起使用。文档区分了源站权限失败与多种边缘安全响应;Ray ID 有助于关联某个请求,但并不会指出拒绝它的具体规则。
| 观察到的现象 | 解读 | 下一步诊断操作 |
|---|---|---|
| 「Just a moment…」中间页 | 可能是挑战页面 | 检查 cf-mitigated 和内容类型。 |
| Turnstile 组件 | 嵌入页面中的验证 | 将组件验证与页面获取分开处理。 |
| 带 cf-ray 的 403 | 原因仍未确定 | 检查响应正文,并请所有者核对日志。 |
| 无挑战证据的 403 | 可能是源站拒绝,也可能是边缘拦截 | 没有证据时,不要将其定性为 IP 封禁。 |
| 错误 1020 | 防火墙规则拒绝了访问 | 把 Ray ID 和时间戳提供给所有者。 |
| 错误 1015 | 速率限制 | 停止重试,并复查被允许的请求速率。 |
| 错误 1010 | 浏览器签名被拒绝 | 请所有者检查浏览器完整性检查设置。 |
这些错误说明参考了 Cloudflare 官方页面:1020、1015 和 1010。
请把状态码、最终 URL、响应头以及经过脱敏的正文分类结果一并保存。状态码显示成功,但返回的是意外的验证页面,仍然属于提取失败。对于其他权限和应用层失败,请参阅我们的 403 爬取诊断指南。
在研究如何绕过 Cloudflare 之前,您能否安排获得授权的访问?
API、数据导出或范围明确的所有者例外规则,可以从根本上消除访问问题。在投入精力修改客户端之前,请先明确被允许的数据集、频率、身份标识和数据留存要求。
向所有者发送一份具体的请求:所需字段、URL 模式、预期的采集计划、拟采用的并发数以及联系邮箱。如有可能,请附上失败请求的时间戳和 Ray ID。可以请对方提供经过认证的集成方式,或一个他们能够识别并随时撤销的已批准爬虫身份。
对网站所有者而言,Cloudflare 的误报处理指南指出,WAF 跳过规则可以豁免 Super Bot Fight Mode,但无法跳过 Bot Fight Mode。请将例外规则限定在已批准的工作流内,并在更改防护设置之前确认对应的安全事件。
Cloudflare 的已验证机器人文档自 2026 年 7 月 1 日起,将原先的签名代理区分方式并入了直接访问与中介访问元数据。验证并不能凌驾于所有者的政策之上。我们的爬虫测试文章提供了相关背景。
公开可见并不等于完整的法律评估。RFC 9309 明确将 robots.txt 规则与访问授权区分开来。隐私监管机构关于数据爬取的联合声明指出,公开可访问的个人信息仍然受隐私和数据保护法律约束。
第九巡回上诉法院的 2022 年 hiQ 判决意见针对的是一起特定的公开个人资料纠纷和初步禁令。美国司法部的 CFAA 起诉政策用于指导联邦检察官;它既不是一揽子许可,也不能使您免受民事索赔。英国的未授权访问规定和版权访问控制需要另行考量,包括《计算机滥用法》第 1 条和 DMCA 第 1201 条。
请与适当的法律顾问一起审查服务条款、登录边界、个人数据和预期的再利用方式。本文不构成法律意见;我们的网络爬取法律概述有助于您梳理相关问题。
在更换客户端之前,如何诊断 Python 请求?
先发起一次受控请求并记录挑战证据,然后再添加重试或更换网络。请在测试会话中保留 Cookie,设置超时,并避免打印 Cookie 值或凭据。
下面的诊断脚本采用了 Requests 文档中记载的会话与请求头处理方式。请提供一个您拥有或已获准测试的 HTTPS URL。该脚本不会跟随重定向,因此首个响应一目了然。
python -m pip install requests
python diagnose.py https://example.com/
# Save as diagnose.py
import json
import sys
from urllib.parse import urlsplit
import requests
url = sys.argv[1]
if urlsplit(url).scheme != "https":
raise SystemExit("Use an authorized HTTPS URL")
with requests.Session() as session:
session.headers.update({
"User-Agent": "AuthorizedDiagnostics/1.0",
"Accept": "application/json, text/html;q=0.9",
})
# The session retains cookies issued during this workflow.
response = session.get(
url,
timeout=(10, 25),
allow_redirects=False,
)
print(json.dumps({
"status": response.status_code,
"content_type": response.headers.get("content-type"),
"cf_mitigated": response.headers.get("cf-mitigated"),
"cf_ray": response.headers.get("cf-ray"),
"challenge": (
response.headers.get("cf-mitigated", "").lower()
== "challenge"
),
"cookie_count": len(session.cookies),
}, indent=2))
接下来,可以在获得授权的前提下通过更换传输层客户端来做对比。curl_cffi 项目记载了对浏览器 TLS 和 HTTP/2 的模拟;示例固定使用 0.16.3 版本,也就是我们在 2026 年 10 月 15 日测试中运行的版本。
python -m pip install curl_cffi==0.16.3
python transport_check.py https://example.com/
# Save as transport_check.py
import sys
from curl_cffi import requests
response = requests.get(
sys.argv[1],
impersonate="chrome",
timeout=25,
allow_redirects=False,
)
print({
"status": response.status_code,
"content_type": response.headers.get("content-type"),
"cf_mitigated": response.headers.get("cf-mitigated"),
"cf_ray": response.headers.get("cf-ray"),
})
这种对比改变的是客户端行为,可能包括默认请求头,因此无法将 TLS 单独隔离为唯一原因。它也无法完全复现我们的测量环境。请记录版本和请求设置,检查预期内容,并在完成计划内的对比后停止。
研究如何绕过 Cloudflare 时,哪些方法对应哪些层级?
请针对您实际测得的故障选择方法。网络变更、传输层兼容、浏览器执行和会话连续性分别解决不同的问题,运营成本也各不相同。
住宅或移动线路
更换线路会改变呈现给目标站点的网络身份。它不能提供 JavaScript 执行、验证状态或授权。
DataImpulse 提供 IP 层服务,支持轮询或粘滞会话以及国家定位。它不是爬取 API,不是托管式解封服务,也不是 VPN。在评估依赖连续性的工作流时,请保持同一会话的网络线路一致。
传输层兼容的 HTTP 客户端
curl_cffi 针对的是 TLS 和 HTTP/2 客户端模拟,这一点见其官方项目说明。它不会把 HTTP 请求变成执行页面的浏览器。
有关底层概念,请参阅我们的 TLS 指纹指南。响应发生变化,只能作为客户端配置的证据,并不能证明某一项指纹检测就是原因。
cloudscraper
cloudscraper 项目提供了一个 Python 客户端,旨在处理受支持的反机器人验证流程。它的存在并不能说明它与某个站点当前的防护兼容。
请把它作为有限范围兼容性测试的候选方案,而不是万能答案。我们的 cloudscraper 与代理教程涵盖了具体实现,此处不再重复。
浏览器执行与专用工具
浏览器可以运行应用并呈现渲染结果。但仅有浏览器执行,并不能保证生产环境的验证会接受该会话。
| 工具 | 解决的问题 | 尚未解决的问题 |
|---|---|---|
| nodriver | 通过其官方仓库所述的接口实现浏览器自动化。 | 不保证通过验证挑战。请参阅我们的 nodriver 代理设置。 |
| Camoufox | 根据其官方文档,这是一个专注于指纹控制的浏览器环境。 | 本次快照中没有可展示的结果。请参阅我们的 Camoufox 代理指南。 |
| FlareSolverr | 一种由浏览器驱动、返回 HTML 和 Cookie 的服务,详见其官方仓库。 | 浏览器资源成本和验证挑战失败的问题依然存在。返回的 Cookie 并非在任何环境下都可移植。 |
| 验证码识别服务 | CapSolver 等服务商记载了 Turnstile 任务处理方式。 | 令牌不等于通用的站点访问权限、所有者许可或有保证的通行许可。 |
会话连续性与放慢采集速度
保留有效会话可避免无谓地丢弃其状态。但这并不能让该状态在任意设备间复用,也不能使请求免于后续检查。
降低并发和重复请求,解决的是负载和重复失败的问题,并不能化解明确的访问拒绝。请缓存被允许获取的结果,采用增量采集,并设定有限的重试预算,而不是对每次拒绝都重试。
为什么 Playwright 或 Puppeteer 会卡在「Just a moment」,又该如何测试 Turnstile?
运行 JavaScript 并不能保证通过生产环境的验证挑战。Cloudflare 将包括 Playwright 和 Puppeteer 在内的自动化浏览器列为不支持解决生产环境验证挑战。
这一区分见于其支持的浏览器文档。更长的超时时间可能会暴露出应用加载延迟,但反复等待并不能证明验证循环会自行解除。请检查页面的实际内容,并设定一个有限的停止点。
在您自己的网站上,请使用 Cloudflare 的测试用 sitekey 和 secret key。它们可提供可控的测试结果,而生产环境的密钥会拒绝测试令牌。请将前端测试 sitekey 与后端测试 secret 配套配置。
请测试提交成功、验证失败、重复令牌处理以及应用的错误提示。把测试凭据保留在测试环境中,并确认生产配置没有继承它们。这样既能测试您的集成,又不会让 CI 依赖于破解真实的验证挑战。
对于获得授权的浏览器联网,我们的 Playwright 代理指南涵盖了连接层。代理配置与生产环境验证挑战的支持情况是两个独立的问题。
可以复用 cf_clearance 或 Turnstile 令牌吗?
正当获得的通行许可应在其原始会话内保留,但不要把它当作可转让的访问凭据。Turnstile 令牌与 cf_clearance 的用途不同。
Cloudflare 的通行许可文档指出,Turnstile 通常会签发一个供服务端验证的一次性令牌。启用预通行许可后,它还可以另外签发一个通行许可 Cookie;该 Cookie 与访客及其设备绑定。
在工作流期间,请保持获得授权的浏览器上下文及其网络条件稳定。把 Cookie 复制到另一台机器或另一个客户端,并不是可靠的延续策略。请将过期或再次出现的验证挑战记录为会话事件,并且切勿把 Cookie 值写入共享的诊断日志。
通行许可也不是对未来流量不受限制的承诺。请将采集器设计为在访问条件发生变化时暂停并上报,而不要假定先前被接受的响应就授权了之后的所有请求。
我们的七站线路快照显示了什么?
仅更换网络线路,没有改变七个网站中任何一个的 HTTP 结果。更换 HTTP 客户端确实改变了部分响应,但变化后的拦截页面不一定是可用内容。
来源与日期:DataImpulse 测量,2026 年 10 月 15 日,UTC 时间 15:00 至 15:30。这些结果是观察性快照,而非基准测试。
方法:每个站点、客户端与线路的组合各发一次 GET,共计 28 个 HTTP 请求。请求使用相同的 Chrome 请求头;curl_cffi 使用 impersonate=chrome。数据中心线路使用的是我们托管服务器的 IP。住宅线路使用 DataImpulse 的美国出口,每个组合使用新会话。两种 HTTP 客户端都没有执行页面 JavaScript。
另做了一项对比,通过 Playwright 使用默认的无头 Chromium,不带隐身处理:每个组合加载一次,等待 25 秒,并检查最终标题。它涵盖六个站点和两条线路,共计 12 次加载。Discord 没有浏览器测量。
| 站点 | 数据中心:requests / curl_cffi | 住宅:requests / curl_cffi | 无头浏览器:两条线路 |
|---|---|---|---|
| g2.com | 403 未分类 / 403 未分类 | 403 未分类 / 403 未分类 | 403,未分类的拦截页面 |
| indeed.com | 403 挑战 / 403 挑战 | 403 挑战 / 403 挑战 | 仍被挑战或拦截 |
| glassdoor.com | 403 挑战 / 403 挑战 | 403 挑战 / 403 挑战 | 仍被挑战或拦截 |
| capterra.com | 403 拦截 / 403 挑战 | 403 拦截 / 403 挑战 | 仍被挑战或拦截 |
| discord.com | 200 / 200 | 200 / 200 | 未测试 |
| crunchbase.com | 403 拦截 / 403 拦截 | 403 拦截 / 403 挑战 | 仍被挑战或拦截 |
| coinbase.com | 403 挑战 / 200 | 403 挑战 / 200 | 仍被挑战或拦截 |
住宅 + requests:7 个中有 1 个
数据中心 + curl_cffi:7 个中有 2 个
住宅 + curl_cffi:7 个中有 2 个
Coinbase 在两条线路上使用 curl_cffi 均返回了 200。Capterra 在使用该客户端时,从拦截页面变成了验证挑战页面。Crunchbase 只有在住宅线路加 curl_cffi 时才进入验证挑战。这些是不同的观察结果,不应共用同一个「通过」标签。
G2 在所有线路上(包括浏览器)都返回了不带 cf-mitigated 的 403,因此不能将其拒绝归因于 Cloudflare 验证挑战。浏览器对比没有在任何站点上产生通过验证挑战的结果。
我们的测试按每个组合记录了状态、响应头和页面标题。生产环境的采集器应记录 cf-mitigated、内容类型、Ray ID、时间戳以及预期内容校验结果。站点设置未知、每个组合只有一次观察,以及浏览器仅检查标题,这些都限制了因果结论。
应该使用代理还是托管式解封服务?
使用代理时,线路发生变化,而客户端行为仍由您的应用负责。托管式访问服务则承担更多的获取流程,但它的会话模型和计费单位需要另行评估。
下面的服务商能力来自各服务商的官方产品文档,核查时间为 2026 年 10 月。它们描述的是服务边界,而不是经过独立测量的成功率。
| 方案 | 由谁运行浏览器并处理验证挑战? | 会话稳定性 | 计费单位 |
|---|---|---|---|
| 数据中心代理 | 您的应用 | 取决于出口分配方式和您的客户端 | 请查看所选套餐按 IP 还是按流量计费 |
| 住宅代理 | 您的应用 | 请审慎选择轮询或粘滞路由 | 本文所讨论的产品按流量计费 |
| 移动代理 | 您的应用 | 请在实际网络切换的情况下验证连续性 | 请查看所选套餐 |
| Zyte API | 服务商托管的获取流程,带浏览器选项 | 请评估所选的 API 工作流 | 按成功响应计费,因请求类型和档位而异 |
| Bright Data Web Unlocker | 服务商托管的重试与验证码处理 | 购买前请先验证所需的工作流 | 请求数 |
| Oxylabs Web Unblocker | 带 JavaScript 渲染的服务商服务 | 提供会话控制 | GB |
| Decodo Site Unblocker | 服务商托管的解封服务 | 提供会话控制 | 请求数 |
来源:Zyte 定价文档、Bright Data Web Unlocker 定价、Oxylabs Web Unblocker 定价和 Decodo Site Unblocker。
请比较每条有效记录的总成本:流量传输、渲染、重试、提取失败和维护。被计为成功的响应,可能仍需要您自行进行数据结构和时效性检查。
| 方法 | 适合使用 X 的情况 | 应避免使用 X 的情况 | 主要运营成本 |
|---|---|---|---|
| 住宅或移动线路 | 当获得授权的对比表明问题出在网络身份时,可以调整线路。 | 当尚未解决的问题是应用权限或 JavaScript 时,应避免靠调整线路解决。 | 流量和会话管理 |
| curl_cffi | 当 HTTP 获取已经足够,且需要测试客户端兼容性时,可以使用 curl_cffi。 | 当工作流需要浏览器执行时,应避免把 curl_cffi 当作唯一答案。 | 集成和回归检查 |
| cloudscraper | 当有限范围的测试确认其兼容时,可以使用 cloudscraper。 | 当它的名气是您唯一的依据时,应避免使用 cloudscraper。 | 兼容性维护 |
| 浏览器工具 | 当您需要渲染后的应用行为时,可以使用浏览器。 | 应避免仅仅因为假定 JavaScript 能保证被接受而使用浏览器。 | 计算、内存和调试 |
| 验证码识别集成 | 仅在明确获得授权的工作流中评估验证码识别服务。 | 测试您自己的 Turnstile 集成时应避免使用,因为此时适用测试密钥。 | 服务费用和校验工作 |
| 会话复用 | 在原始的授权上下文内,可以复用会话以保持连续性。 | 应避免在互不相关的客户端之间转移通行许可。 | 状态管理 |
| 放慢采集速度 | 放慢采集速度可遵守约定的速率,并减少重复工作。 | 应避免将其视为应对明确拒绝的补救措施。 | 完成时间更长 |
| 托管式访问 | 当外包获取流程符合您的需求时,可以使用托管式访问。 | 在测试内容质量和会话需求之前,应避免购买。 | 服务费用和服务商集成 |
哪些限制应当让您停止继续重试?
当缺少许可、重复尝试没有带来新的证据,或获取到的内容未通过校验时,就应停止。某一个 URL 上的成功实验,不足以证明整个站点都可靠。
| 检查点 | 仅在以下条件下继续 | 出现以下情况时停止或上报 |
|---|---|---|
| 许可 | 有明确且已批准的采集范围 | 工作流越过了未经批准的登录或数据边界 |
| 诊断 | 针对具体假设的有限测试 | 重试只是在重复同样的拒绝,没有新信息 |
| 内容 | 字段符合预期,时效性可接受 | 200 响应中包含验证页面或无关的 HTML |
| 运营 | 约定的速率和有限的重试预算 | 成本或请求量超出计划 |
请让结论局限于证据所及的范围。我们的快照没有测试移动线路、专用浏览器、托管式解封服务或验证码识别服务,也没有基于完整数据集验证提取的准确性。只有在使用场景需要时,才应另行评估这些方面。
常见问题
如何判断 Cloudflare 是否对我的 Python 请求发起了验证挑战?
在尝试解析预期数据之前,先检查 cf-mitigated 的值是否为 challenge。Cloudflare 记载了这一标记,以及挑战页面使用的 text/html 响应类型(见上文的官方诊断资料)。仅凭状态码,原因仍无法确定。
为什么用住宅代理也无法绕过 Cloudflare?
住宅线路改变的是网络身份,而客户端和应用工作流可能仍然不兼容。在我们的快照中,仅切换线路没有改变七个网站中任何一个的 HTTP 结果。在购买更多流量之前,请先诊断其余层级。
为什么我的无头浏览器一直显示「Just a moment」?
浏览器执行与验证挑战被接受是两个独立的结果。Cloudflare 将自动化浏览器列为不支持解决生产环境验证挑战(见上文其支持的浏览器文档)。请设定有限的等待时间,并如实报告尚未解决的访问状况。
如何在自己的网站上用 Playwright 或 Puppeteer 测试 Turnstile?
在测试环境中使用文档记载的测试 sitekey,并搭配对应的测试 secret。生产环境的密钥会拒绝测试令牌(见上文 Cloudflare 的测试文档)。请同时测试验证被接受和被拒绝两条路径。
为什么页面提示「please unblock challenges.cloudflare.com to proceed」?
请检查是否有浏览器扩展或网络策略阻止了验证资源的加载。网站所有者还应检查其内容安全策略:Cloudflare 记载了针对 challenges.cloudflare.com 的脚本和框架权限。官方参考页面是 https://developers.cloudflare.com/turnstile/reference/content-security-policy/。
如何关闭 Cloudflare 验证码?
作为访客,您无法更改其他网站的安全配置。请让所有者检查该问题;所有者可以调整相关设置,具体见 Cloudflare 的误报处理指南。
公开可访问或 robots.txt 允许,就意味着爬取合法吗?
两者都不能构成采集和再利用的完整法律依据。请综合考虑授权、合同限制、隐私义务以及适用的版权规则。授权访问部分所列的一手资料分别涉及这项评估的不同方面。
带着明确的假设测试 IP 层
如果您获得授权的诊断指向网络身份,可以使用 DataImpulse 住宅代理对一小批受控工作负载进行对比。该代理起价为每 GB 1 美元($1 per GB),支持国家定位以及轮询或粘滞会话。扩大规模之前,请先校验返回的内容:代理提供的是线路,而获取流程和会话行为仍由您的应用负责。
最后更新:2026 年 10 月 15 日。
