绕不过的Cloudflare Turnstile?我用playwright-stealth轻松拿下
在 Python 爬虫实战中,Cloudflare 的反爬机制堪称 “拦路虎”,尤其是其推出的 Turnstile 验证(俗称 “隐形验证码”),让传统的 requests+BeautifulSoup 组合束手无策。相比于旧版的 reCAPTCHA,Turnstile 更隐蔽、检测维度更丰富,普通的 IP 代理和请求头伪装很难突破。
但作为爬虫工程师,我们总有应对之法 —— 今天就来分享一个实战方案:用 playwright-stealth 插件伪装浏览器指纹,配合 Playwright 的自动化能力,轻松绕过 Cloudflare Turnstile 验证。全程基于 Python 实现,新手也能跟着操作!
一、先搞懂:Cloudflare Turnstile 到底在检测什么?
在动手之前,我们得先明白 Turnstile 的核心检测逻辑,才能针对性突破:
- 浏览器指纹验证:检测是否为真实浏览器环境(如 Canvas 绘图、WebGL 渲染、User-Agent 一致性等),爬虫的无头浏览器(Headless Chrome)默认会暴露特征;
- 行为模式检测:判断用户是否有真实的交互行为(如鼠标移动、点击延迟),纯 API 请求或机械性操作会被标记为异常;
- 网络环境检测:检查 IP 是否为黑名单、是否有代理痕迹,单一 IP 高频请求容易触发验证;
- JavaScript 执行环境:检测是否禁用 JS、是否加载 Cloudflare 的验证脚本,传统爬虫的静态爬取方式直接失效。
传统的 requests 库无法模拟浏览器的 JS 执行和交互行为,而普通的 Playwright 如果不做伪装,其 Headless 模式的指纹特征也会被 Turnstile 识别。这时候,playwright-stealth就派上用场了 —— 它能自动清除 Playwright 的自动化痕迹,让浏览器指纹变得 “真实可信”。
二、环境准备:3 步搭建实战环境
1. 安装核心依赖
首先安装 Playwright 和 playwright-stealth,注意 Playwright 需要额外安装浏览器驱动:
bash
运行
# 安装Playwright(自带Python客户端)
pip install playwright
# 安装playwright-stealth(指纹伪装插件)
pip install playwright-stealth
# 安装浏览器驱动(默认安装Chrome、Firefox、Safari,可指定只装Chrome)
playwright install chrome
2. 验证环境是否正常
运行以下测试代码,若能正常启动 Chrome 并访问百度,则环境搭建成功:
python
运行
from playwright.sync_api import sync_playwright
from playwright_stealth import stealth
with sync_playwright() as p:
# 启动Chrome,无头模式(headless=False可显示浏览器)
browser = p.chromium.launch(headless=False)
page = browser.new_page()
# 应用stealth伪装(关键步骤)
stealth(page)
# 访问百度,打印页面标题
page.goto("https://www.baidu.com")
print("页面标题:", page.title())
browser.close()
三、核心实战:绕过 Cloudflare Turnstile 验证
以一个被 Cloudflare 保护的测试网站(https://nowsecure.nl/ ,该网站专门用于测试反爬绕过效果)为例,演示完整的绕过流程。
1. 完整代码实现
python
运行
from playwright.sync_api import sync_playwright
from playwright_stealth import stealth
import time
def bypass_cloudflare_turnstile():
with sync_playwright() as p:
# 启动Chrome,配置忽略证书错误、禁用GPU(减少指纹特征)
browser = p.chromium.launch(
headless=False, # 开发时显示浏览器,上线后可改为True
args=[
"--ignore-certificate-errors",
"--disable-gpu",
"--no-sandbox", # 非沙箱模式,避免权限问题
"--disable-blink-features=AutomationControlled" # 禁用自动化标识
]
)
page = browser.new_page()
# 关键:应用stealth伪装,清除自动化痕迹
stealth(page,
languages=["en-US", "en"], # 设置浏览器语言
vendor="Google Inc.", # 设置浏览器厂商
platform="Win32", # 设置操作系统
webgl_vendor="Intel Inc.", # 设置WebGL厂商
renderer="Intel Iris OpenGL Engine", # 设置WebGL渲染器
fix_hairline=True # 修复浏览器样式漏洞
)
# 访问被Cloudflare保护的网站
page.goto("https://nowsecure.nl/")
# 等待Turnstile验证完成(根据网络情况调整等待时间)
# 若出现手动验证按钮,可添加点击逻辑(示例中网站自动验证)
page.wait_for_selector("body:not([data-cloudflare=true])", timeout=30000)
# 验证是否绕过成功:打印页面内容
print("绕过成功!页面内容预览:")
print(page.content()[:500]) # 打印前500个字符
# 可选:保存页面截图作为证据
page.screenshot(path="bypass_success.png")
print("截图已保存为 bypass_success.png")
# 停留5秒,观察浏览器状态
time.sleep(5)
browser.close()
if __name__ == "__main__":
bypass_cloudflare_turnstile()
2. 关键步骤解析
(1)playwright-stealth 的核心作用
stealth(page, ...) 会自动执行一系列伪装操作,核心包括:
- 清除
navigator.webdriver标识(爬虫最容易暴露的特征); - 伪装 Canvas、WebGL 指纹(避免被识别为同一台机器);
- 隐藏 Headless 模式的特征(如窗口大小、UA 后缀);
- 模拟真实的浏览器语言、厂商、操作系统信息。
(2)浏览器启动参数优化
--disable-blink-features=AutomationControlled:禁用 Chrome 的自动化控制标识,这是 Turnstile 的重要检测点;--no-sandbox:非沙箱模式,避免 Linux 环境下的权限问题;--disable-gpu:禁用 GPU 加速,减少不同设备的指纹差异。
(3)等待验证完成的逻辑
page.wait_for_selector("body:not([data-cloudflare=true])") 表示等待页面 body 元素不再包含data-cloudflare=true属性(即 Cloudflare 验证通过),超时时间设置为 30 秒,避免无限等待。
四、常见问题与解决方案
1. 启动浏览器时提示 “权限不足”
- 解决方案:在
launch()中添加--no-sandbox和--disable-dev-shm-usage参数,完整配置:python
运行
browser = p.chromium.launch( headless=False, args=[ "--ignore-certificate-errors", "--disable-gpu", "--no-sandbox", "--disable-dev-shm-usage", "--disable-blink-features=AutomationControlled" ] )
2. 验证超时,无法绕过
- 可能原因:IP 地址被 Cloudflare 拉黑,或伪装参数不够全面。
- 解决方案:
- 更换高质量代理 IP(建议使用住宅 IP,避免数据中心 IP);
- 扩展
stealth()的伪装参数,如添加user_agent指定真实浏览器 UA:python
运行
stealth(page, languages=["en-US", "en"], vendor="Google Inc.", platform="Win32", webgl_vendor="Intel Inc.", renderer="Intel Iris OpenGL Engine", fix_hairline=True, user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" )
3. 出现手动点击验证按钮(如 “我不是机器人”)
- 解决方案:添加自动点击逻辑,通过
page.click()定位按钮并点击:python
运行
# 等待验证按钮出现并点击(根据实际页面的选择器调整) page.wait_for_selector("#challenge-stage > div > label", timeout=10000) page.click("#challenge-stage > div > label")
五、注意事项:合法爬虫的边界
- 遵守网站 robots.txt 协议:爬取前先查看目标网站的 robots.txt,避免爬取禁止访问的内容;
- 控制爬取频率:即使绕过了反爬,也应设置合理的请求间隔(如
time.sleep(1)),避免给服务器造成压力; - 仅用于合法场景:本教程仅用于学习和技术研究,严禁用于爬取敏感数据、商业机密或违反法律法规的行为;
- 动态适配反爬策略:Cloudflare 会不断更新检测规则,若后续方案失效,可尝试更新 playwright-stealth 版本或调整伪装参数。
六、总结
Cloudflare Turnstile 虽然强大,但并非不可突破 —— 核心思路是模拟真实用户的浏览器环境和行为。playwright-stealth 插件帮我们解决了 “指纹伪装” 的关键问题,再配合 Playwright 的自动化能力,就能轻松绕过大部分 Turnstile 验证。
对于爬虫初学者来说,这个方案的优势在于:无需深入理解反爬原理,只需调用现成工具,就能快速实现效果。建议大家先从测试网站练手,熟悉后再应用到实际项目中。
更多推荐
所有评论(0)