CAPSOLVER
博客
2024年网络爬虫中如何解决Cloudflare问题 | 分步指南

2026年网页爬取时如何解决Cloudflare问题 | 分步指南

Logo of CapSolver

Lucas Mitchell

Automation Engineer

09-Dec-2025

网络爬虫时常见的Cloudflare状态码

错误1020

Cloudflare错误1020表示访问被拒绝。当网站的防火墙规则(由Cloudflare保护)被违反时会触发此错误。例如,向网站发送过多请求等行为可能导致此违规。

解决此问题的常见方法:

  • 使用轮换代理来隐藏你的IP地址。
  • 更改并轮换User-Agent标头。
  • 确保你的HTTP客户端支持TLS,如果使用requests库的话。
  • 使用浏览器自动化工具如Puppeteer、Playwright或Selenium。

错误1015 / 429 速率限制

Cloudflare错误1015发生在你的IP地址因爬虫活动超过网站的速率限制而被Cloudflare标记并禁止时。这可能导致遇到此错误。
解决此问题的常见方法:

  • 使用轮换代理或大型代理池
  • 确保网站无法通过你的标头追踪你,某些标头可能会导致他们追踪你并限制你的请求
  • 确保你没有通过TLS指纹、TCP或其他方式被追踪。

错误403

403状态码是“禁止”的响应状态,由服务器在确认请求有效但拒绝执行时发出。这可能是因为你的请求缺少服务器期望的必要标头,如CORS、JWT或认证标头。

如果网站通常可以访问,但添加正确的标头后问题仍未解决,可能是服务器检测到你的请求是自动化的。
解决此问题的常见方法:

  • 你没有发送正确的标头或请求信息。
  • 代理已被禁止
  • 需要解决JavaScript挑战,查看关于Cloudflare Challenge 5s的博客以了解如何解决
  • 网站不允许任何流量

使用你的CapSolver优惠码

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

识别Cloudflare Challenge 5s和Cloudflare Turnstile验证码

Cloudflare Challenge 5s

Cloudflare挑战看起来像:

有时,此页面可能包含Turnstile

确认你需要解决Cloudflare Challenge 5s而不是Turnstile,如果是仅Turnstile,请继续阅读本博客。

使用Capsolver解决此挑战时有一些要求。

  • 代理
  • Capsolver API密钥

向Capsolver提交任务信息

json 复制代码
POST https://api.capsolver.com/createTask
Host: api.capsolver.com
Content-Type: application/json

{
  "clientKey": "YOUR_API_KEY",
  "task": {
    "type": "AntiCloudflareTask",
    "websiteURL": "https://www.yourwebsite.com",
    "proxy": "158.120.100.23:334:user:pass"
  }
}

正确提交后,API将返回一个taskId

json 复制代码
{
    "errorId": 0,
    "taskId": "014fc55c-46c9-41c8-9de7-6cb35d984edc",
    "status": "idle"
}

获取此taskId值并使用getTaskResult方法来获取结果

获取结果

json 复制代码
POST https://api.capsolver.com/getTaskResult
Host: api.capsolver.com
Content-Type: application/json

{
  "clientKey": "YOUR_API_KEY",
  "taskId": "taskId"
}

根据系统负载,你将在1秒20秒之间收到结果

如果你在响应中收到ERROR_CAPTCHA_SOLVE_FAILED,可能是以下几个原因:

  • 你的代理不需要解决Cloudflare Challenge 5s(某些网站仅对不良代理、机器人操作或任何可能触发请求由机器人发出的情况启用)。有时每次都会启用,这取决于配置。
  • 你的代理被Cloudflare禁止,并陷入无法通过挑战的循环
  • 网站没有使用Cloudflare Challenge,确认它是Challenge而不是Turnstile,查看示例图片。
  • 代理出现超时,这在使用住宅代理时很常见

如果你收到成功响应,将如下所示:

json 复制代码
{
    "errorId": 0,
    "taskId": "d8d3a8b4-30cc-4b09-802a-a476ca17fa54",
    "status": "ready",
    "solution": {
        "accept-language": "en-US,en;q=0.9",
        "cookies": {

        },
        "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",
            "accept-encoding": "gzip, deflate, br",
            "accept-language": "en-US,en;q=0.9",
            "cache-control": "max-age=0",
            "content-type": "application/x-www-form-urlencoded",
            "origin": "",
            "referer": "",
            "sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"",
            "sec-ch-ua-arch": "\"arm\"",
            "sec-ch-ua-bitness": "\"64\"",
            "sec-ch-ua-full-version": "\"120.0.6099.71\"",
            "sec-ch-ua-full-version-list": "\"Not_A Brand\";v=\"8.0.0.0\", \"Chromium\";v=\"120.0.6099.71\", \"Google Chrome\";v=\"120.0.6099.71\"",
            "sec-ch-ua-mobile": "?0",
            "sec-ch-ua-model": "\"\"",
            "sec-ch-ua-platform": "\"macOS\"",
            "sec-ch-ua-platform-version": "\"10.14.6\"",
            "sec-fetch-dest": "document",
            "sec-fetch-mode": "navigate",
            "sec-fetch-site": "same-origin",
            "sec-fetch-user": "?1",
            "upgrade-insecure-requests": "1",
            "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
        },
        "proxy": "your proxy",
        "token": "cf clearance token",
        "type": "challenge",
        "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    }
}

从这个响应中,你需要解析cookiesheaderstoken的值。

你的请求需要如下所示:

  • 请求的标头必须与响应中返回的相同
  • 请求的cookies必须与响应中返回的相同
  • 请求客户端必须支持TLS设置,在这种情况下使用TLS Chrome 120
  • 使用相同的代理进行网站交互和使用cf_clearance cookie
  • Token值将是cf_clearance cookie值,你需要创建它

使用Python解决Cloudflare Challenge的示例

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

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

# TODO: 你的目标网站URL:
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()

Cloudflare Turnstile验证码

Cloudflare Turnstile验证码看起来像:

  • 托管挑战

  • 非交互式挑战

  • 不可见挑战
    不可见,你可以通过检查网络/脚本加载情况来确认是否使用了Turnstile

确认你需要解决Cloudflare Turnstile验证码而不是Cloudflare Challenge 5s,如果是仅Cloudflare Challenge,请继续阅读本博客。

使用Capsolver解决此挑战时有一些要求。

  • Capsolver API密钥

向Capsolver提交任务信息

json 复制代码
POST https://api.capsolver.com/createTask
Host: api.capsolver.com
Content-Type: application/json

{
  "clientKey": "YOUR_API_KEY",
  "task": {
    "type": "AntiTurnstileTaskProxyLess",
    "websiteURL": "https://www.yourwebsite.com",
    "websiteKey": "0x4XXXXXXXXXXXXXXXXX",
    "metadata": {
       "action": "login",  //可选
       "cdata": "0000-1111-2222-3333-example-cdata"  //可选
    }
  }
}

"action"和"cdata"是可选的,有时需要,有时不需要。
这取决于网站的配置。
action是Turnstile元素的data-action属性值(如果存在)。
cdata是Turnstile元素的data-cdata属性值(如果存在)。
正确提交后,API将返回一个taskId

json 复制代码
{
    "errorId": 0,
    "taskId": "014fc55c-46c9-41c8-9de7-6cb35d984edc",
    "status": "idle"
}

获取此taskId值并使用getTaskResult方法来获取结果

获取结果

json 复制代码
POST https://api.capsolver.com/getTaskResult
Host: api.capsolver.com
Content-Type: application/json

{
  "clientKey": "YOUR_API_KEY",
  "taskId": "taskId"
}

根据系统负载,你将在1秒20秒之间收到结果

如果你在响应中收到ERROR_CAPTCHA_SOLVE_FAILED,可能是以下几个原因:

  • 你的代理不需要解决Cloudflare Challenge 5s(某些网站仅对不良代理、机器人操作或任何可能触发请求由机器人发出的情况启用)。有时每次都会启用,这取决于配置。
  • 你的代理被Cloudflare禁止,并陷入无法通过挑战的循环
  • 网站没有使用Cloudflare Challenge,确认它是Challenge而不是Turnstile,查看示例图片。
  • 代理出现超时,这在使用住宅代理时很常见

如果你收到成功响应,将如下所示:

json 复制代码
{
    "errorId": 0,
    "taskId": "d1e1487a-2cd8-4d4a-aa4d-4ba5b6c65484",
    "status": "ready",
    "solution": {
        "token": "0.cZJPqwnyDxL86HvAXSk4lUTQhjwfyXDcR3qpVwFofuzosoKr1otKj_A-utazXx_Tnp1B2V6womrltBpRw9HbY851ktpaF7sBN-gQwtoRUew4Wj5PO4-WLYPnNRpXxludXzyQ.1oHJhu7619fb8c07ab942bd1587bc76e0e3cef95c7aa75400c4f7d3",
        "type": "turnstile",
        "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    }
}

从这个响应中,你需要解析token的值,这将是你要提交给网站的验证码解决方案。

使用Python解决Cloudflare挑战的示例

python 复制代码
import time
from curl_cffi import requests

CAPSOLVER_API_KEY = "你的CAPSOLVER.COM API密钥"
PAGE_URL = ""
WEBSITE_KEY = ""

def solvecf(metadata_action=None, metadata_cdata=None):
    url = "https://api.capsolver.com/createTask"
    task = {
        "type": "AntiTurnstileTaskProxyLess",
        "websiteURL": PAGE_URL,
        "websiteKey": WEBSITE_KEY,
    }
    if metadata_action or metadata_cdata:
        task["metadata"] = {}
        if metadata_action:
            task["metadata"]["action"] = metadata_action
        if metadata_cdata:
            task["metadata"]["cdata"] = metadata_cdata
    data = {
        "clientKey": CAPSOLVER_API_KEY,
        "task": task
    }
    response_data = requests.post(url, json=data).json()
    print(response_data)
    return response_data['taskId']


def solutionGet(taskId):
    url = "https://api.capsolver.com/getTaskResult"
    status = ""
    while status != "ready":
        data = {"clientKey": CAPSOLVER_API_KEY, "taskId": taskId}
        response_data = requests.post(url, json=data).json()
        print(response_data)
        status = response_data.get('status', '')
        print(status)
        if status == "ready":
            return response_data['solution']

        time.sleep(2)


def main():
    start_time = time.time()
    
    taskId = solvecf()
    solution = solutionGet(taskId)
    if solution:
        user_agent = solution['userAgent']
        token = solution['token']

    print("User_Agent:", user_agent)
print("解决Turnstile验证码,令牌:", token)

    end_time = time.time()
    elapsed_time = end_time - start_time
    print(f"解决验证码所用时间:{elapsed_time} 秒")

if __name__ == "__main__":
    main()

用NodeJS解决Cloudflare挑战的示例

js 复制代码
const axios = require('axios');

const CAPSOLVER_API_KEY = "";
const PAGE_URL = "";
const WEBSITE_KEY = "";

async function solvecf(metadata_action = null, metadata_cdata = null) {
    const url = "https://api.capsolver.com/createTask";
    const task = {
        type: "AntiTurnstileTaskProxyLess",
        websiteURL: PAGE_URL,
        websiteKey: WEBSITE_KEY,
    };
    if (metadata_action || metadata_cdata) {
        task.metadata = {};
        if (metadata_action) {
            task.metadata.action = metadata_action;
        }
        if (metadata_cdata) {
            task.metadata.cdata = metadata_cdata;
        }
    }
    const data = {
        clientKey: CAPSOLVER_API_KEY,
        task: task
    };
    const response = await axios.post(url, data);
    console.log(response.data);
    return response.data.taskId;
}

async function solutionGet(taskId) {
    const url = "https://api.capsolver.com/getTaskResult";
    let status = "";
    while (status !== "ready") {
        const data = { clientKey: CAPSOLVER_API_KEY, taskId: taskId };
        const response = await axios.post(url, data);
        console.log(response.data);
        status = response.data.status;
        console.log(status);
        if (status === "ready") {
            return response.data.solution;
        }
        await new Promise(resolve => setTimeout(resolve, 2000));
    }
}

async function main() {
    const start_time = Date.now();
    
    const taskId = await solvecf();
    const solution = await solutionGet(taskId);
    if (solution) {
        const user_agent = solution.userAgent;
        const token = solution.token;

        console.log("User_Agent:", user_agent);
        console.log("解决Turnstile验证码,令牌:", token);
    }

    const end_time = Date.now();
    const elapsed_time = (end_time - start_time) / 1000;
    console.log(`解决验证码所用时间:${elapsed_time} 秒`);
}

main().catch(console.error);

🏁 结论

Cloudflare 实施了多种保护机制——从标准的 HTTP 阻止如 1020、403、429 (1015) 到更高级的挑战,如 Cloudflare Challenge 5sTurnstile 验证码。在进行网页抓取或自动化操作时,识别当前激活的保护机制是关键的第一步。

本指南解释了常见的 Cloudflare 状态码,如何区分 Challenge 5s 和 Turnstile 验证码,并提供了使用 Capsolver API 解决它们的示例,包括 PythonNodeJS 的实现。

通过选择合适的方法——旋转代理、正确头信息、指纹保护或编程解决验证码/挑战——你可以显著提高抓取成功率并减少被封锁的情况。

如果你的请求仍然被标记,检查你的抓取器设置:代理质量、头信息、TLS 指纹和请求频率往往和验证码解决器本身一样重要。


❓ 常见问题 (FAQs)

1. 我如何知道我面对的是 Cloudflare Challenge 5s 还是 Turnstile 验证码?

检查界面或网络请求。

  • 如果出现 5 秒的“验证您的浏览器…”页面 → Challenge 5s
  • 如果出现验证小部件(或不可见的令牌生成)→ Turnstile 验证码

2. 即使我解决了挑战,为什么我还是被封锁?

可能的原因包括:

  • 代理被封或质量差
  • 重用解决方案时缺少或错误的头信息
  • 未在整个请求过程中保持相同的代理
  • TLS 指纹不匹配

3. 解决 Cloudflare 时我是否总是需要代理?

  • Challenge 5s 需要代理
  • Turnstile 可以不使用代理,但代理可能有助于绕过敏感网站的限制

4. 我能否大规模自动化解决 Cloudflare?

可以。通过使用高质量的代理、旋转指纹和令牌重用逻辑,你可以扩展抓取——确保遵守网站条款和当地法律法规。

5. Turnstile 难度是否比 Challenge 5s 更高?

Turnstile 通常更容易解决,因为它通常返回一个单一的令牌。Challenge 5s 需要 cookies、头信息和代理一致性,使其更加复杂。

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

更多

2026年如何解决Cloudflare网页抓取问题 | 逐步指南
2026年网页爬取时如何解决Cloudflare问题 | 分步指南

本文深入探讨了借助CapSolver这一擅长解决验证码的工具来有效突破这些防护措施的方法。从解释Cloudflare的安全协议到提供绕过这些限制的实用策略和代码示例。

Cloudflare
Logo of CapSolver

Lucas Mitchell

09-Dec-2025

如何用 NodeJS 解决 Cloudflare Turnstile 验证码
如何使用 NodeJS 解决 Cloudflare Turnstile 验证码

在本文中,我们将向您展示如何使用 Node.js 解决 Cloudflare Turnstile 验证码。

Cloudflare
Logo of CapSolver

Lucas Mitchell

08-Dec-2025

Cloudflare 403 禁止访问
如何解决 Cloudflare 403 禁止访问错误以及 522/1020/1010/1015/1012

Cloudflare 是一种广泛使用的内容分发网络(CDN)和安全服务,它帮助网站缓解各种威胁,包括 DDoS 攻击和恶意机器人...

Cloudflare
Logo of CapSolver

Emma Foster

08-Dec-2025

Cloudflare 错误 1006, 1007, 1008
Cloudflare 错误 1006、1007、1008 解决方法 | 如何修复

遇到 Cloudflare 错误 1006、1007 或 1008?学习解决这些访问被拒绝问题的实用方法,提升您的网络爬虫体验。

Cloudflare
Logo of CapSolver

Lucas Mitchell

05-Dec-2025

如何确定在使用CapSolver扩展解决Cloudflare Turnstile时是否需要`action`
如何确定`action`是否需要使用CapSolver扩展程序来解决Cloudflare Turnstile

学习识别Cloudflare Turnstile的CAPTCHA操作以实现有效解决。按照我们的分步指南使用Capsolver的工具和技巧。

Cloudflare
Logo of CapSolver

Nikolai Smirnov

05-Dec-2025

如何在 Selenium 中自动解决 Cloudflare 验证
如何在 Selenium 中自动化解决 Cloudflare 验证

掌握在 Selenium 中解决 Cloudflare 验证的终极策略。使用 Undetected-Chromedriver、行为模拟和 CapSolver 的 API 实现可靠的网页自动化

Cloudflare
Logo of CapSolver

Emma Foster

04-Dec-2025