采集公开数据时如何过 Cloudflare

发布:2026 年 7 月 23 日 · 阅读约 7 分钟

一句话总结: Cloudflare 不是一道检查,是好几道——IP/ASN 信誉、TLS 和 HTTP/2 指纹、交互式 JS 挑战(Managed Challenge / Turnstile)。要过就每层对症:IP 用住宅代理,指纹用浏览器级 TLS 指纹(curl_cffi 或真实浏览器),挑战页用会执行 JavaScript 的真实浏览器。需要哪种组合,取决于到底是哪一层拦了你。只采公开数据,礼貌限速。

Cloudflare 不是一堵墙,是三堵

大家谈「绕过 Cloudflare」时,好像它是一把锁。不是。Cloudflare 的机器人管理跑好几道独立检查,请求必须全部满足。被拦时,有用的问题不是「怎么绕过 Cloudflare」,而是「我没过它哪道检查?」——因为每道的解法都不一样。

查什么怎么栽的解法
IP 信誉出口 IP 的 ASN从机房网段发请求住宅代理
TLS / HTTP2 指纹你的 ClientHello(JA3/JA4)Python/库的指纹curl_cffi 或真实浏览器
JS 挑战JavaScript 是否运行没有 JS 引擎(裸 HTTP)会执行 JS 的真实浏览器

第一层:IP 信誉——从代码里假不了的那层

在看你客户端发的任何东西之前,Cloudflare 先给你的出口 IP 打分。机房 ASN(AWS、Hetzner、OVH)自带一个固定扣分,因为真实访客几乎不从那里上网。没有任何请求头、指纹技巧或浏览器能改变你出口 IP 的 ASN——只有走另一个网络才行。

住宅代理给 Cloudflare 一个真实家庭宽带 IP 去打分。在主要靠 IP 信誉的站上,光这一个改动往往就是全部解法。在更难的站上,它必要但不充分——你还有第二、三层要过。

第二层:TLS 指纹——静默的封锁

TLS 握手期间,Cloudflare 把你的 ClientHello 哈希成 JA3/JA4 指纹。Python 的 requestshttpx 产生的指纹是任何真实浏览器都没有的,所以 Cloudflare 能在页面一个字节都还没发时就静默拦你——没有可见挑战,就是个 403 或卡住。

如果你是用 HTTP 请求脚本而非浏览器,用 curl_cffi 补回浏览器级指纹。配上住宅代理,一个脚本就过了第一、二层:

from curl_cffi import requests

proxies = {"https": "http://USER:PASS@gw.roamproxy.com:41080"}
r = requests.get("https://target.example", impersonate="chrome124", proxies=proxies)
print(r.status_code)

第三层:JS 挑战——需要真实浏览器的时候

有些 Cloudflare 配置会弹交互式挑战——「正在检查你的浏览器…」中间页,或 Turnstile 组件。它们的原理是给客户端一段 JavaScript,让真正的浏览器执行以证明自己是浏览器。指纹修复在这里没用,因为 HTTP 库里没有 JavaScript 引擎去跑挑战。

可靠的答案是用会执行 JS 的真实浏览器——Playwright 驱动的无头 Chromium,或在其之上的 LLM agent。让这个浏览器走同一个住宅代理,三层一次全过。浏览器加代理的配法见 用 browser-use 配住宅代理;同样的代理 dict 对裸 Playwright 也适用。

按层选工具

住宅 IP 加 curl_cffi 能搞定时,别动不动上完整无头浏览器——它更慢更重。只按目标的实际防护往上升级。爬虫为什么被封的更全清单,见 网页采集如何避免被封

负责任地采集公开数据。本文技术针对以合理速率采集公开可访问的页面。遵守适用的 robots.txt 和站点条款,不访问你无授权的数据,并限速到永远不影响站点真实用户。

常见问题

同一个请求,浏览器能打开、脚本却不行,为什么?

因为浏览器通过了 Cloudflare 全部三道检查,你的脚本一道都没过。浏览器从你家住宅 IP 出去、发真实 Chrome 的 TLS 指纹、自动执行 JS 挑战。一个从云服务器跑的普通 requests 脚本,每一项都相反。解法不是某个单一技巧,而是把这三样属性逐一补回来。

光靠住宅代理能过 Cloudflare 吗?

看站点主要靠哪一层。住宅 IP 能过信誉检查,在只对 IP 打分的站上往往就够了。但如果站点还做 TLS 指纹或弹 JS 挑战,光有干净 IP 也没用——你没处理的那层照样拦你。防护强的目标通常要 IP 修复指纹或真实浏览器修复一起上。

TLS 检查和 JS 挑战有什么区别?

TLS 检查在握手期间静默发生——Cloudflare 在任何页面加载前就读你的 JA3/JA4 指纹,可以不弹任何挑战就直接拦。JS 挑战是可见的「正在检查你的浏览器」/ Turnstile 页:Cloudflare 发一段 JavaScript,让真实浏览器执行以证明自己是浏览器。指纹修复(curl_cffi)过第一种;只有会执行 JS 的真实浏览器能过第二种。

采集 Cloudflare 保护的站点合法吗?

采集公开可得的数据在很多司法辖区大体是允许的,但不是无限制的权利。稳妥起见:只采公开数据,遵守站点的 robots.txt 和适用条款,绝不采集你无权访问的登录后数据,并礼貌限速、不影响真实用户使用。本文的技术是给合法数据采集用的,不是拿来压垮站点的。

IP 这一层是你从代码里假不了的,也是 Cloudflare 最先查的。Roam 住宅 IP——轮换 $2/GB、静态 $4/IP/月,HTTP 与 SOCKS5——给 Cloudflare 一个真实家庭宽带 ASN 去打分,而不是机房网段。注册账号即送 300MB 试用流量,拿你的目标站测。