CAPSOLVER
博客
如何使用 Python 解决 Cloudflare 挑战

如何使用 Python 解决 Cloudflare 挑战

Logo of CapSolver

Anh Tuan

Data Science Expert

19-Dec-2025

TL;DR

Cloudflare的5秒挑战可能会通过阻止初始请求来中断自动化Python工作流。本指南展示了如何使用Python和CapSolver程序化处理Cloudflare挑战。通过结合配置正确的代理、TLS指纹识别和CapSolver的AntiCloudflareTask,您可以可靠地获取访问受保护页面所需的头部信息和Cookie。

引言

Cloudflare的保护机制被广泛用于缓解滥用流量和自动化访问。一种常见的机制是Cloudflare的5秒挑战,它在授予网站访问权限前验证浏览器行为。对于构建数据收集、监控或自动化工作流的开发者来说,这个挑战可能导致重复的403响应并中断流程。

本文将通过一个实际的Python方法来处理Cloudflare挑战。使用CapSolver的API以及支持TLS的HTTP客户端,您将学习如何检测挑战、请求解决方案,并成功完成验证后的请求。

⚙️ 前提条件

  • 可用的代理服务器
  • 已安装Python
  • CapSolver API密钥

🤖 第1步:安装必要的包

领取CapSolver优惠码

立即提升您的自动化预算!
在充值CapSolver账户时使用优惠码 CAPN,每次充值可额外获得 5% 的奖励 —— 没有限制。
现在在您的CapSolver仪表板中领取

执行以下命令安装所需包:

python 复制代码
pip install capsolver
pip install os
pip install requests

👨‍💻 第2步:使用Python解决Cloudflare 5秒挑战

以下是一个Python示例脚本,用于完成任务:

python 复制代码
# -*- coding: utf-8 -*-
import requests
import time
import tls_client

# TODO:您的API密钥
API_KEY = ""
proxy = ""

# TODO:您的目标网站网址:
page_url = ""


def call_capsolver():
    data = {
        "clientKey": API_KEY,
        "task": {
            "type": 'AntiCloudflareTask',
            "websiteURL": page_url,
            "proxy": proxy,
        }
    }
    uri = 'https://api.capsolver.com/createTask'
    res = requests.post(uri, json=data)
    resp = res.json()
    task_id = resp.get('taskId')
    if not task_id:
        print("未获取到taskId:", res.text)
        return
    print('已创建taskId:', task_id)

    while True:
        time.sleep(1)
        data = {
            "clientKey": API_KEY,
            "taskId": task_id
        }
        response = requests.post('https://api.capsolver.com/getTaskResult', json=data)
        resp = response.json()
        status = resp.get('status', '')
        if status == "ready":
            print("成功 => ", response.text)
            return resp.get('solution')
        if status == "failed" or resp.get("errorId"):
            print("失败! => ", response.text)
            return


def request_site(solution):
    session = tls_client.Session(
        client_identifier="chrome_120",
        random_tls_extension_order=True
    )
    return session.get(
        page_url,
        headers=solution.get('headers'),
        cookies=solution.get('cookies'),
        proxy=proxy,
    )


def main():
    solution = {
        "headers": {
            "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
            "upgrade-insecure-requests": "1",
            "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",
            "sec-fetch-site": "none",
            "sec-fetch-mode": "navigate",
            "sec-fetch-user": "?1",
            "sec-fetch-dest": "document",
            "accept-encoding": "gzip, deflate, br",
            "accept-language": "en-US,en;q=0.9",
        }
    }
    # 第一次请求(检查您的代理):
    res = request_site(solution)
    print('1. 响应状态码:', res.status_code)
    if res.status_code != 403:
        print("您的代理正常,未触发Cloudflare挑战")
        return
    elif 'window._cf_chl_opt' not in res.text:
        print('==== 代理被封锁 ==== ')
        return

    # 调用CapSolver:
    solution = call_capsolver()
    if not solution:
        return

    # 第二次请求(验证解决方案):
    res = request_site(solution)
    print('2. 响应状态码:', res.status_code)


if __name__ == '__main__':
    main()

⚠️ 修改这些变量

  • 代理服务器: 使用您的代理详细信息更新。格式应为 http://username:password@ip:port。
  • capsolver.api_key: 从CapSolver仪表板获取您的API密钥。
  • 目标网站URL: 替换为希望解决CloudFlare挑战的网站URL。

Cloudflare挑战的外观

Cloudflare挑战

同时,如果您想测试脚本的机器人特征,BrowserScan的机器人检测工具可以帮助您识别并优化脚本中的机器人行为。

结论

在Python中处理Cloudflare挑战需要的不仅仅是标准的HTTP请求。通过将CapSolver与支持TLS的客户端和稳定的代理集成,开发者可以程序化完成Cloudflare的验证步骤,并继续正常的请求流程。

这种方法特别适用于依赖于稳定访问Cloudflare保护资源的应用程序,例如监控工具、数据聚合服务和自动化测试流程。通过适当的配置和错误处理,整个过程可以实现端到端自动化,同时保持稳定和可扩展性。

常见问题

1. 什么是Cloudflare 5秒挑战?

Cloudflare 5秒挑战是一种浏览器验证步骤,在允许访问前检查访客是否像真实浏览器一样行为。它通常以临时插页页面的形式出现,并可能向自动化脚本返回HTTP 403响应。

2. 为什么需要支持TLS的客户端?

Cloudflare会评估TLS指纹、头部顺序和类似浏览器的行为。像tls_client这样的库有助于模拟真实浏览器的TLS特性,这对于通过初始请求并验证CapSolver返回的解决方案至关重要。

3. 我是否始终需要代理?

强烈建议使用代理。干净且一致的代理可以降低被立即封锁的可能性,并确保挑战解决请求和验证请求源自同一IP地址。

4. 解决挑战后CapSolver会返回什么?

CapSolver 提供的解决方案包含代表已验证浏览器会话的头部和Cookie。这些必须在后续请求中重复使用,以成功访问目标页面。

5. 这种方法可以扩展到大规模自动化吗?

可以。通过添加任务队列、重试逻辑和代理轮换,可以将相同的流程集成到更大的Python系统中,使其适用于可扩展的自动化和数据访问场景。

合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。

更多