如何用 Python 解决 Cloudflare 问题(Playwright + Scrapeless)
Expert Network Defense Engineer
TL;DR:
- Cloudflare 评分的是浏览器,而不是访客。 它读取指纹一致性、行为信号和出口 IP,然后为其信任的浏览器设置
cf_clearancecookie——因此在 Python 中解决这个问题意味着成为一个受信任的浏览器,而不是解答一个难题。 - 本地 Python 浏览器在三个方面无法通过评分:
navigator.webdriver标志、无头默认指纹和数据中心出口 IP。手动修补这三者是一个维护的跑步机。 - Scrapeless Scraping Browser 在渲染过程中解决了挑战 —— 真正自研的 Chromium,一个每次会话一致的指纹,和在 195 个以上国家的住宅出口,通过一个 WebSocket 端点连接。
- 你的 Python 保持标准 Playwright。 使用
chromium.connect_over_cdp()连接,等待挑战后的内容,并读取页面——唯一的变化是连接 URL。 - 验证实时: 一个 Python Playwright 会话通过云浏览器清除了 Cloudflare 挑战页面,读取成功标志
You bypassed the Cloudflare challenge! :D,并接收了cf_clearancecookie。 - 免费开始。 新的 Scrapeless 帐户包括免费的 Scraping Browser 运行时——在 app.scrapeless.com 注册。
介绍:在 Python 中解决 Cloudflare 是一个浏览器问题
Cloudflare 挑战不是你解码的图像 CAPTCHA。它在后台运行,并对加载页面的浏览器进行评分——指纹是否内部一致,交互信号是否看起来像人类,以及出口 IP 是否有良好的声誉。当评分通过时,Cloudflare 会设置 cf_clearance cookie,实际页面加载。当没有通过时,你会得到一个插页而不是内容。
这重新定义了 Python 的任务。没有提交的答案——工作是展示一个 Cloudflare 已经信任的浏览器。从 Python 驱动的本地无头 Chromium 不能做到这一点:它通过 the navigator.webdriver property 宣告自动化,使用无头默认的字体和画布行为,并从一个声誉服务已知的 IP 退出。你可以修补每一个,然后保持修补,随着 Chromium 和检测器的变化。这个指南采用了更短的路径:从标准 Playwright 驱动 Scrapeless Scraping Browser,这样指纹、行为和出口 IP 就在服务器端处理,挑战在正常渲染过程中清除。
Cloudflare 实际检查的内容
Cloudflare 自己的文档 描述了一种在不打断访客的情况下运行的验证步骤。实际上,它评分三个方面并授予 cf_clearance cookie——一个标准的 HTTP cookie——当它们通过时:
| Cloudflare 读取的内容 | 本地 Python 浏览器为何无法通过 |
|---|---|
| 指纹一致性 | 无头默认和 webdriver 标志与真实 Chrome 相矛盾 |
| 行为信号 | 没有连贯浏览器表面的脚本化时间 |
| 出口 IP 声誉 | 数据中心 IP 评分低于住宅 IP |
一个连贯、受信任的浏览器比任何单一的规避更重要——这就是为什么将这三者都移到服务器端比堆叠隐蔽补丁更耐用。
为什么选择 Scrapeless Scraping Browser
Scrapeless Scraping Browser 是一个可定制、反检测的云浏览器,专为网络爬虫和人工智能代理设计。专门针对 Cloudflare,它带来了:
- 真正自研的 Chromium,能够像 Chrome 一样准确运行挑战 JavaScript,因此可以解决而不是停滞。
- 每次会话一致的指纹——没有
navigator.webdriver标志,没有无头默认行为泄露。 - 在 195 个以上国家的住宅出口——Cloudflare 对出口 IP 进行评分,而住宅区域的评分干净,而数据中心 IP 则不然。
- 会话持久性,因此可以在同一会话中的请求之间重用
cf_clearance授权。 - 一个连接表面——每个选项都是相同 WebSocket 端点上的查询参数。
在 app.scrapeless.com 免费计划上获取你的 API 密钥。
前提条件
- Python 3.10 或更高版本
- Python 的 Playwright (
pip install playwright) - 一个 Scrapeless 账户和 API 密钥——在 app.scrapeless.com 注册
完整的连接细节可以在 Scraping Browser 文档 中找到。
安装
您连接到一个远程浏览器,因此您不需要为此流程在本地安装 Chromium。
bash
pip install playwright
export SCRAPELESS_API_KEY=your_api_token_here # 免费密钥在 https://app.scrapeless.com
连接并清除挑战
构建端点,使用 chromium.connect_over_cdp() 进行连接,导航并等待挑战后的内容附加。挑战在渲染过程中解决——没有单独的解决调用。
python
import json
import os
from urllib.parse import urlencode
from playwright.sync_api import sync_playwright
params = {"token": os.environ["SCRAPELESS_API_KEY"], "sessionTTL": "180", "proxyCountry": "US"}
endpoint = f"wss://browser.scrapeless.com/api/v2/browser?{urlencode(params)}"
TARGET = "https://www.scrapingcourse.com/cloudflare-challenge"
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(endpoint)
page = browser.new_page()
page.goto(TARGET, wait_until="domcontentloaded", timeout=90000)
# 云浏览器在渲染期间清除 Cloudflare;等待真实内容。
page.wait_for_selector("#challenge-title", timeout=90000)
print("cleared:", page.inner_text("#challenge-title"))
cookies = page.context.cookies()
print("cf_clearance:", any(c["name"] == "cf_clearance" for c in cookies))
browser.close()
该脚本的实时运行打印了 cleared: You bypassed the Cloudflare challenge! :D 和 cf_clearance: True —— 标准的 Python Playwright,通过云浏览器获取。
在免费计划中获取您的 API 密钥: app.scrapeless.com
确认通行并携带通行证
可靠的信号是真实内容的附加——一旦挑战后的元素存在,页面就已清理。Cloudflare 还在通过的会话上设置了 cf_clearance cookie,您可以读取它以在同一会话中的其他请求中携带通行证。
python
cookies = page.context.cookies()
clearance = next((c for c in cookies if c["name"] == "cf_clearance"), None)
print("cf_clearance present:", clearance is not None)
if clearance:
print("domain:", clearance["domain"])
针对可靠清除锁定区域
Cloudflare 会评估出口 IP,因此将 proxyCountry 锁定到住宅区域。将其更改为任何 ISO 国家代码。
python
params = {
"token": os.environ["SCRAPELESS_API_KEY"],
"sessionTTL": "180",
"proxyCountry": "US", # 或 "DE", "JP", "ANY"
}
本地 Python 浏览器停止的地方
本地基于 Playwright 或 requests 的爬虫在 Cloudflare 开始评估浏览器之前是可以的。然后,无头指纹、webdriver 标志和数据中心 IP 都会失败不同的检查,中间页将替换内容。这些是指纹、行为和 IP 问题——云浏览器在服务器端处理这三者。连接到 Scrapeless 将其交给受管理的会话,而您的 Playwright 代码保持标准。
你得到了什么
会话的行为与任何 Python Playwright 会话相同——page.goto、page.wait_for_selector、page.content() 和 cookies 都能正常工作。以下是通过云浏览器清除 Cloudflare 的一些诚实观察:
navigator.webdriver不存在,因此 Cloudflare 运行的第一个检查看起来像是一个真实的 Chrome。- 出口 IP 匹配
proxyCountry——住宅区域远比数据中心 IP 更可靠地清理。 - 通过后存在
cf_clearance——重用同一会话在后续请求中携带授权。 - 为顽固页面加热会话——在同一会话中先加载网站的主页,然后再加载受保护的页面,这样行为表面看起来像正常访问。
结论:清除 Cloudflare,保持您的 Python
在Python中解决Cloudflare并不是解码挑战,而是展示一个Cloudflare信任的浏览器。Scrapeless Scraping Browser处理其评估的三项内容(指纹、行为、出口IP)在服务器端,因此您的Python Playwright代码只需更改其连接URL。将proxyCountry固定在某个居住区域,等待挑战后内容,并读取cf_clearance以确认通过。要使用另一个Python库运行相同的云浏览器,请参见Scrapling生产抓取器指南,并在Scrapeless定价页面上比较计划。
准备建立您的Cloudflare清除管道了吗?
加入我们的社区以申请免费计划并与抓取Cloudflare保护网站的开发人员联系:Discord · Telegram。
在app.scrapeless.com注册以获得免费的抓取浏览器运行时,并将Python Playwright指向在渲染过程中清除Cloudflare的云浏览器。
常见问题
问:我需要单独的CAPTCHA解决服务吗?
在通过的浏览器上不需要。Cloudflare主要在后台评估指纹、行为和IP,并发放cf_clearance cookie。云浏览器旨在在正常渲染过程中通过该评分,因此无需单独的解谜步骤。
问:我需要代理吗?
不需要。居住出口已内置 - 将proxyCountry设置为某个地区或ANY。Cloudflare对出口IP进行评估,因此居住区域比数据中心地址更可靠地清除。
问:某些页面仍然显示挑战 - 有什么帮助?
将proxyCountry固定在某个居住区域,并通过在访问受保护页面之前首先在同一会话中加载网站的主页来预热会话,因此行为表面看起来像是正常访问。
问:我现有的Playwright代码兼容吗?
是的。抓取浏览器支持CDP,因此chromium.connect_over_cdp()不需要更改 - 您只需更改连接URL。
问:清除Cloudflare合法吗?
访问公开可用的数据通常是允许的,但规则因地区和网站而异。请查看目标的服务条款,尊重机器人指令,并就任何敏感问题咨询律师。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



