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

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"
}
}
从这个响应中,你需要解析cookies、headers、token的值。
你的请求需要如下所示:
- 请求的标头必须与响应中返回的相同
- 请求的cookies必须与响应中返回的相同
- 请求客户端必须支持TLS设置,在这种情况下使用TLS Chrome 120
- 使用相同的代理进行网站交互和使用cf_clearance cookie
- Token值将是
cf_clearancecookie值,你需要创建它
使用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 5s 和 Turnstile 验证码。在进行网页抓取或自动化操作时,识别当前激活的保护机制是关键的第一步。
本指南解释了常见的 Cloudflare 状态码,如何区分 Challenge 5s 和 Turnstile 验证码,并提供了使用 Capsolver API 解决它们的示例,包括 Python 和 NodeJS 的实现。
通过选择合适的方法——旋转代理、正确头信息、指纹保护或编程解决验证码/挑战——你可以显著提高抓取成功率并减少被封锁的情况。
如果你的请求仍然被标记,检查你的抓取器设置:代理质量、头信息、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问题 | 分步指南
本文深入探讨了借助CapSolver这一擅长解决验证码的工具来有效突破这些防护措施的方法。从解释Cloudflare的安全协议到提供绕过这些限制的实用策略和代码示例。

Lucas Mitchell
09-Dec-2025

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

Lucas Mitchell
08-Dec-2025

如何解决 Cloudflare 403 禁止访问错误以及 522/1020/1010/1015/1012
Cloudflare 是一种广泛使用的内容分发网络(CDN)和安全服务,它帮助网站缓解各种威胁,包括 DDoS 攻击和恶意机器人...

Emma Foster
08-Dec-2025

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

Lucas Mitchell
05-Dec-2025

如何确定`action`是否需要使用CapSolver扩展程序来解决Cloudflare Turnstile
学习识别Cloudflare Turnstile的CAPTCHA操作以实现有效解决。按照我们的分步指南使用Capsolver的工具和技巧。

Nikolai Smirnov
05-Dec-2025

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

Emma Foster
04-Dec-2025


.