返回博客

使用 Scrapeless 处理 Cloudflare Turnstile 保护的页面

Sophia Martinez
Sophia Martinez

Specialist in Anti-Bot Strategies

24-Sep-2026

TL;DR:

  • Cloudflare Turnstile 和中间挑战页面是不同的表面。 表单小部件可以出现在已经可访问的页面上。
  • Scrapeless Web Unlocker 文档支持 Turnstile 和 Cloudflare 挑战处理。 您的应用程序在该步骤后仍然负责操作。
  • 成功的 HTTP 请求并不证明目标内容是可用的。 需要页面元素或业务状态来定义您的任务的成功。
  • HTML 检索并不能确定受保护的表单是否成功提交。 将内容访问、小部件完成和应用接受视为不同的结果。
  • 自由开始。 在扩展工作量之前,使用 Scrapeless 账户的可用信用评估已批准的目标。

引言:在解析之前确认页面状态

爬虫可以接收到 HTML,但仍然没有可用的任务数据。文档可能是一个挑战屏幕、登录页面或包含预期标题但没有请求信息的应用响应。

Turnstile 添加了另一个区别。页面可以显示普通内容,而小部件保护特定的表单操作。该小部件的存在并不意味着整个页面被阻止,检索页面也不能证明一个受保护的操作已被接受。

本教程解释了如何使用文档化的 Scrapeless Web Unlocker 路径来处理受 Cloudflare 保护的内容,以及如何验证返回的内容。经过身份验证的示例是一个集成模板,需要您的账户和已批准的目标;这并不意味着已完成 Turnstile 解锁。

Turnstile 和挑战页面需要不同的检查

Turnstile 是一个嵌入式验证机制,而中间挑战页面则中断对请求资源的访问。区分这两者可以防止收集器应用错误的成功条件。

观察到的状态 确定的内容 未确定的内容
预期的页面内容存在 可以检查内容 受保护的表单操作成功
Turnstile 小部件存在 页面使用了嵌入式验证步骤 整个页面被阻止
挑战页面替换了目标 目标内容尚不可用 最终响应将是可用的
应用程序确认了预期的操作 操作达到了应用程序的结果 其他无关操作的权限

Cloudflare 为中间挑战暴露了响应信号:挑战页面响应头 使用 cf-mitigated: challenge。在可用时将该信号应用于原始目标响应。托管服务可以返回自己的信封或头;不要假设 API 响应暴露每个原始目标头。

HTML 标记可以提供支持证据,但它们不是通用分类器。技术文章可以提到挑战脚本而不被阻止。相反,一个页面可以在没有包含可识别的挑战标记的情况下加载其预期内容失败。

Scrapeless Web Unlocker 处理的内容

Scrapeless Web Unlocker 文档自动辅助处理 Turnstile 和 Cloudflare 挑战。受支持的挑战行为 还指定后续操作仍由应用程序负责。

Web Unlocker 访问服务 是下面示例中使用的唯一产品。其 JavaScript 渲染配置请求对需要脚本执行的页面进行浏览器渲染的结果。本文不会在不相关的 API 产品之间切换,也不会假设存在单独的令牌求解端点。

干净的内容响应对只读提取任务是有用的结果。涉及受保护表单的工作流需要额外的应用特定确认。不要将令牌的出现或小部件的消失视为提交成功的充分证据。

前提条件和特定目标的成功合同

您需要 Python、Requests、一个有效的 Scrapeless API 密钥和一个您有权访问的目标。使用 python -m pip install requests 安装依赖项,并在您的运行时环境中设置 SCRAPELESS_API_KEY。

将 TARGET_URL 设置为已批准的页面。将 EXPECTED_TEXT 定义为其预期内容中的一个独特短语。如果您知道该目标使用的确切中间标记,请将 CHALLENGE_MARKERS 设置为以逗号分隔的列表。保持列表特定于目标并审查模糊匹配。
经过身份验证的请求和真实的 Turnstile 结果仍然是此示例的前提条件。没有主张目标已被解决,或每个 Cloudflare 配置都受到支持,或者代码可以完成受保护的表单。

在执行之前,决定什么才算成功。对于公共参考页面,它可能是特定的标题和内容部分。对于产品页面,它可能是有效的标识符加可解析的价格。避免可能出现在页面和错误信息中的通用短语。

第一步:通过 Web 解锁器请求呈现的内容

下面的请求使用了文档化的 Web 解锁器 Actor 和 JavaScript 渲染配置。将其保存为 fetch_protected_page.py。

注意:此脚本需要您的 Scrapeless API 密钥和已批准的目标。身份验证的调用和挑战结果在该环境中尚未经过验证。在您的目标上运行它,然后在依赖提取结果之前检查返回的主体。

python Copy
import hashlib
import json
import os
from pathlib import Path

import requests

url = os.environ["TARGET_URL"]
expected = os.environ["EXPECTED_TEXT"].casefold()
markers = [part.strip().casefold()
           for part in os.environ.get("CHALLENGE_MARKERS", "").split(",")
           if part.strip()]
response = requests.post(
    "https://api.scrapeless.com/api/v2/unlocker/request",
    headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
    json={
        "actor": "unlocker.webunlocker",
        "input": {
            "url": url,
            "method": "GET",
            "redirect": False,
            "jsRender": {
                "enabled": True,
                "waitUntil": "domcontentloaded",
                "response": {"type": "html"},
            },
        },
        "proxy": {"country": "ANY"},
    },
    timeout=120,
)
response.raise_for_status()
body = response.text
Path("page-response.txt").write_text(body)
content_type = response.headers.get("content-type", "").lower()
if "text/html" not in content_type:
    outcome = "inspect_service_response"
elif any(marker in body.casefold() for marker in markers):
    outcome = "review_challenge_marker"
elif expected not in body.casefold():
    outcome = "expected_content_missing"
else:
    outcome = "content_candidate"
record = {
    "requested_url": url,
    "service_http_status": response.status_code,
    "content_type": content_type,
    "response_sha256": hashlib.sha256(response.content).hexdigest(),
    "outcome": outcome,
}
Path("page-observation.json").write_text(json.dumps(record, indent=2))
print(json.dumps(record))
if outcome != "content_candidate":
    raise SystemExit(1)

设置来自于 Web 解锁器请求合同 和 JavaScript 渲染配置。客户端等待是配置的超时,而不是性能声明。

该示例将非 HTML 响应视为需要检查的内容。它不会在未知响应信封中猜测嵌套的 HTML 字段。只有在检查返回到您帐户的实际结果后,才能调整解析器。

使用 Scrapeless 开始抓取

使用 Scrapeless 提升您的网络抓取和自动化工作流程!
今天注册并获取 5 美元的免费余额 — 无需信用卡。

立即在 Scrapeless 仪表盘 申请您的免费余额。

第二步:验证内容,而不仅仅是传输

内容验证应独立于请求状态测试页面预期的信息。HTTP 状态模型 描述了协议级别的响应;您的提取标准确定它是否满足任务。

该脚本报告 content_candidate,而不是解决的挑战。这个名称是故意的:短语检查只是初步过滤。解析预期的内容区域,验证所需字段,并拒绝恰好包含匹配短语的错误页面。

如果配置的挑战标记出现,请检查保存的响应。匹配可以是一个真实的插页或一个假阳性。保持这种区分,而不是自动删除每个提到 Cloudflare 的页面。

对于成功的提取记录,保留目标 URL、捕获时间、使用的验证规则和接受的字段。避免在普通日志中保留完整的 cookies、请求凭证或小部件令牌。

第三步:将受保护的操作与页面检索分开

页面检索工作流程应在接受的内容处停止,除非任务明确要求并授权进一步操作。读取公共页面和完成受保护的账户表单具有不同的成功条件。

在测试自己的表单时,提交后验证应用响应。客户端小部件的完成是一个中间事件。网站的服务器端验证和业务逻辑决定操作是否被接受。

此 Web 解锁器示例不会在不相关的会话之间转移小部件令牌,提供网站所有者的秘密,或发明特定应用的提交调用。如果您的用例在加载页面后需要浏览器交互,请单独设计和验证该工作流程,使用支持的产品接口。

有关页面访问和持续浏览器会话之间区别的背景,Cloudflare 挑战工作流程 提供了相关上下文。在采用旧示例的代码之前,请验证当前产品接口。

诊断您实际观察到的状态

有用的诊断记录识别失败条件而不声称未观察到的原因。缺失的预期文本可能是由插页、页面更改、重定向或解析器假设造成的。

观察 下一个诊断步骤 成功证据
响应不是 HTML 检查文档化的服务响应形状 验证返回类型的提取路径
已知挑战标记出现 在上下文中读取捕获的主体 预期内容存在且被接受
预期短语缺失 检查目标、重定向行为和页面结构 必需内容区域与任务匹配
小部件存在于正常内容旁边 决定任务是否需要受保护的行为 读取任务完成,或单独验证授权行为
解析器返回部分字段 将解析器假设与当前标记进行比较 必需字段与页面验证一致

保持测试简小,避免自动扩展目标范围。每个主机的起始上限为三个工作者是一个保守的应用设置,更严格的目标或账户限制优先考虑。

即使内容在技术上可以访问,访问政策仍然相关。 机器人排除协议 表达爬虫指令;它并不取代授权或确定所有允许使用收集数据的情况。

在推出工作流程之前,测量您实际目标上的接受内容,并将服务使用情况与 Scrapeless 定价 进行比较。不要基于单个页面或演示环境发布普遍解决率。

结论:在应用层定义成功

处理受 Cloudflare 保护的页面需要支持的访问路径,并检查预期内容是否实际可用。转盘小部件、中间挑战和应用提交应在该检查中保持独立状态。

使用文档中的 Web 解锁器请求作为起始点,针对批准的目标运行,并在启用下游提取之前检查结果。接受记录应描述获取的信息,而不仅仅是 HTTP 请求完成的事实。

准备好构建您的网络数据管道了吗?

加入在 Discord 和 Telegram 上从事网页数据收集的开发人员。

创建一个 Scrapeless 账户 并将工作流程调整为您自己批准的数据源。

常见问题

问:Scrapeless Web 解锁器能处理 Cloudflare Turnstile 吗?

Web 解锁器文档提供对 Turnstile 和 Cloudflare 挑战处理的支持。适用性和最终结果必须在您的授权目标上验证;后续操作仍由您的应用负责。

问:HTTP 200 响应是否意味着 Turnstile 已解决?

不。响应可能包含中间页面或与任务无关的内容。检查返回的状态和所需内容。

问:每个带有转盘小部件的页面都会阻止读取吗?

不。嵌入的小部件可以保护特定操作,同时页面其余部分可见。将检查与您正在执行的任务匹配。

问:您需要为此示例添加单独的浏览器代理吗?

不启动本地浏览器。使用 Web 解锁器请求中的文档代理选项,并验证在目标上的结果访问行为。

问:如果目标更改其 HTML 呢?

重新检查预期内容规则和下游使用的任何选择器。挑战处理服务并不定义您的应用认为有效的页面字段。

问:这可以在没有 AI 代理的情况下运行吗?

可以。Python 请求和内容检查是确定性的,并不需要语言模型。

问:挑战处理是否获得收集任何受保护数据的权限?

不。仅在您被授权执行的访问范围和数据使用中使用工作流程,并查看相关网站条款和适用要求。

问:示例可以提交受保护的表单吗?

不。该示例检索并检查内容。表单工作流程需要单独实现和验证的应用行为。

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录