在 Python 爬虫实战中,Cloudflare 的反爬机制堪称 “拦路虎”,尤其是其推出的 Turnstile 验证(俗称 “隐形验证码”),让传统的 requests+BeautifulSoup 组合束手无策。相比于旧版的 reCAPTCHA,Turnstile 更隐蔽、检测维度更丰富,普通的 IP 代理和请求头伪装很难突破。

但作为爬虫工程师,我们总有应对之法 —— 今天就来分享一个实战方案:用 playwright-stealth 插件伪装浏览器指纹,配合 Playwright 的自动化能力,轻松绕过 Cloudflare Turnstile 验证。全程基于 Python 实现,新手也能跟着操作!

一、先搞懂:Cloudflare Turnstile 到底在检测什么?

在动手之前,我们得先明白 Turnstile 的核心检测逻辑,才能针对性突破:

  1. 浏览器指纹验证:检测是否为真实浏览器环境(如 Canvas 绘图、WebGL 渲染、User-Agent 一致性等),爬虫的无头浏览器(Headless Chrome)默认会暴露特征;
  2. 行为模式检测:判断用户是否有真实的交互行为(如鼠标移动、点击延迟),纯 API 请求或机械性操作会被标记为异常;
  3. 网络环境检测:检查 IP 是否为黑名单、是否有代理痕迹,单一 IP 高频请求容易触发验证;
  4. 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 拉黑,或伪装参数不够全面。
  • 解决方案:
    1. 更换高质量代理 IP(建议使用住宅 IP,避免数据中心 IP);
    2. 扩展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")
    

五、注意事项:合法爬虫的边界

  1. 遵守网站 robots.txt 协议:爬取前先查看目标网站的 robots.txt,避免爬取禁止访问的内容;
  2. 控制爬取频率:即使绕过了反爬,也应设置合理的请求间隔(如time.sleep(1)),避免给服务器造成压力;
  3. 仅用于合法场景:本教程仅用于学习和技术研究,严禁用于爬取敏感数据、商业机密或违反法律法规的行为;
  4. 动态适配反爬策略:Cloudflare 会不断更新检测规则,若后续方案失效,可尝试更新 playwright-stealth 版本或调整伪装参数。

六、总结

Cloudflare Turnstile 虽然强大,但并非不可突破 —— 核心思路是模拟真实用户的浏览器环境和行为。playwright-stealth 插件帮我们解决了 “指纹伪装” 的关键问题,再配合 Playwright 的自动化能力,就能轻松绕过大部分 Turnstile 验证。

对于爬虫初学者来说,这个方案的优势在于:无需深入理解反爬原理,只需调用现成工具,就能快速实现效果。建议大家先从测试网站练手,熟悉后再应用到实际项目中。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐