一个月前还能正常运行的爬虫,开始返回 403、挑战页面,或者数据缺失的 HTTP 200 响应。人们首先怀疑的通常是 Cloudflare、DataDome 或 Akamai 新推出的反机器人更新,有时这种判断确实没错。但同样常见的原因是页面模板改了、会话 Cookie 过期了、多出了一次新的重定向,或者某个工作进程池悄悄把并发翻了一倍。

在轮换代理或重建浏览器指纹之前,先弄清楚故障究竟发生在哪里。这一点在 2026 年比以往更加重要,因为检测越来越不局限于单个请求:会话行为、浏览器完整性,以及客户端在一段时间内如何在网站中移动,都可能决定下一个请求是被放行还是被挑战。

本文介绍这三家厂商在 2026 年实际公开记录了哪些变化、每项变化对抓取管道意味着什么,以及一套诊断故障、有选择地升级并衡量恢复效果的实用方法。代码位于 ScraperHub/what-changed-in-cloudflare-datadome-and-akamai-bot-detection-in-2026,这是一个用 Python 编写的诊断框架,用于对响应进行分类并报告可用结果。它不会破解挑战,也不会更改请求身份,本文中的任何内容同样不会这样做。

简要概括
  • 2026 年的变化关乎三点:决策在何时做出(贯穿整个会话,而非一次性判定)、依据哪些证据(浏览器的实际执行,而非少量重放的输出),以及运营方如何为不同类型的自动化流量制定策略。
  • 发布公告不等于实际部署。这些功能大多需要主动启用或取决于服务等级,因此发布日期无法说明某个具体目标网站的情况。
  • 从保存下来的失败响应入手进行诊断,将 Crawlbase 的判定、目标网站的状态和你自己的字段校验分开看待,并以每个经过验证的结果的成本来评判修复方案。

2026 年机器人检测发生了哪些变化

相关进展中没有哪一项是某种全新的指纹或某个强制性挑战。它们改变的是决策在 何时 做出、决策依据 哪些 证据,以及网站运营方 如何 对待不同类型的自动化流量。

厂商 2026 年公开记录的进展 对爬虫意味着什么
Cloudflare Precursor 会话级检测,7月13日发布 通过了第一个请求或挑战,并不意味着会话中的后续请求能保持同样的信任度。
Cloudflare Adaptive Intelligence,8月31日发布 模型可能持续重新训练,因此你对目标网站防护策略的假设会更快过时。
Cloudflare 独立的 Search、Agent 和 Training 控制项,7月至9月 声明的身份和用途越来越多地决定策略,与浏览器行为无关。
DataDome 基于虚拟机的挑战混淆(2月11日)和 Proof of Browser(6月17日公开介绍) 复现少量 JavaScript 输出,并不等同于展现一致的浏览器执行过程。
DataDome Agent Trust(5月5日)和 3.0 边缘模块(8月至9月) 经过验证的身份和集成设置可能改变防护行为,但两者都不是全面的策略变更。
Akamai Content Protector Advanced Validation Framework(AVF),3月10日发布 被动证据无法定论时,可能触发进一步的设备或行为验证。
Akamai 更细粒度的 AI 机器人类别,8月至9月公开记录 运营方可以区别对待训练类、搜索类以及获取器或智能体类流量。
按日期排列的 2026 年变化。每一项都是公告或发布,并不能证明某个网站已经启用。

这些是有文档记录的公告和发布,并不能证明每个受保护的网站都在运行它们。其中几项能力在发布时没有公开的正式可用日期。

Cloudflare:检测在第一个请求之后仍在继续

Precursor于7月推出,在整个会话期间评估浏览器信号和行为信号。Cloudflare 的 文档 说明,不断演进的评估会更新存储在 cf_clearance Cookie 中的会话状态,而该状态可能被降级或作废。对爬虫而言,通过第一次挑战已不再是稳定的结果:在启用了 Precursor 的区域上,后续请求可能改变判定。

可用性需要按区域逐一核实。官方 发布更新日志 提到会向所有客户推出,而公告则将 Precursor 定位为 Enterprise Bot Management 的一部分,在今年晚些时候正式可用之前免费提供。

Adaptive Intelligence 随后于8月31日推出。其模型基于实时流量持续重新训练,Enterprise Bot Management 客户可通过 Auto Update Machine Learning 启用它,这使得定期发布带编号的模型版本不再那么具有标志性意义。公告将一次性、短生命周期的规则描述为尚待推出的组件,因此应将其视为计划中的功能,而非已上线的功能。

与此同时,Cloudflare 将 AI 爬虫策略拆分为独立的 Search、Agent 和 Training 控制项。自9月15日起 新区域会获得推荐预设,对依赖广告收入的网站更为严格,运营方可以随时更改。这些是运营方的选择,并非禁止所有自动化请求,而且 Bot Preference Sync 可以将所选偏好写入 robots.txt.

单点检查在入口处一次性做出判定。会话级评估则持续打分,并可能在几个请求之后推翻先前的判定。

DataDome:挑战完整性与浏览器证据

DataDome 的 基于虚拟机的混淆 将 Device Check 和 Slider 的逻辑编译为字节码,由浏览器内的自定义解释器运行。其主要作用是让挑战更难被逆向工程和低成本重放,而不是新增一类网络指纹。

其 Proof of Browser 技术文章 介绍了结合渲染、WebGL、DOM 变更和时序的检查。这些是厂商自述的机制,本文和配套仓库都没有对其检测效果做基准测试。其 Device Check 文档 说明了检测结果如何触发挑战。

DataDome 还推出了 Agent Trust 方案(5月5日),此前的 Web Bot Auth 支持 则已于1月上线。身份证据可以来自签名认证或其他可信机制。照搬某个知名爬虫的用户代理,既不能确立身份,也不能获得许可。

最后,3.0 版本的 DataDome Apache, Nginx, Cloudflare Worker 和 Fastly 模块更改了路径处理和静态资源排除逻辑。这些是集成层面的变更,取决于每个运营方是否升级,并不是新推出的 TLS 或 HTTP/2 检测器。

Akamai:自适应验证与更细粒度的机器人策略

3月,Akamai 宣布了 Content Protector 的增强功能,其中包括原生应用保护和 Advanced Validation Framework。当被动分析无法得出结论时,AVF 可以请求更多设备或行为数据,并可选择启用交互式挑战。公告没有给出公开的正式可用日期。

Akamai 还将其 AI 机器人流量拆分为 更细粒度的类别:Training Crawlers、Search Crawlers 以及 Fetchers and Agents,并在 Web Security Analytics中提供了相应的筛选器。它们让运营方获得更精细的控制,但并不规定默认操作。

本文查阅的资料 没有公开依据 能证明 Akamai 推出了新的核心 Bot Manager 模型、新的 _abck 格式或新的住宅代理检测器(均指 2026 年内)。同样的审慎也适用于其他领域的常见技术:TLS 指纹、浏览器指纹和 IP 信誉依然重要,但它们的存在并不是 2026 年的新公告。

先诊断故障,再修改爬虫

从一个保存下来的失败响应开始。记录它的时间戳、请求的 URL 和最终 URL、响应头和响应体、爬虫版本、出口位置、会话标识(如适用)以及并发数,并将其与一份已知正常的抓取记录进行比较。缺少这些维度,把一次故障归因于某个厂商的发布基本上就是猜测。

首先排除常见的应用层故障:

  1. 标记或解析器漂移: 预期的元素是否仍存在于原始 HTML 中?
  2. JavaScript 渲染: 数据是否只有在客户端执行之后,或在之后的某个网络响应中才出现?
  3. 身份验证: 请求是否被重定向到登录页、丢失了某个 Cookie,或遇到了过期的 CSRF 令牌?
  4. 流量模式: 工作进程数量、请求速率或出口位置是否发生了变化?
  5. 重定向和变体: 规范 URL、语言区域、设备版本或内容类型是否发生了变化?

然后对响应本身进行分类,而不是对解析器抛出的异常进行分类。

观察到的结果 可能的原因 下一步诊断
带有明确拦截证据的 403 或 429 访问策略、限流、信誉、身份验证 比较响应头和响应体;在低并发下重试,不要随意更改身份相关变量
携带挑战页面的 200 或 403 浏览器或会话验证 查找挑战标记,并检查预期内容是否到达
字段为空或不合理的 200 渲染、DOM 漂移、错误的变体、被刻意改写的响应 对照已知正常的页面校验必需字段
早期请求正常,后续请求变差 会话评估、速率策略、信誉变化 按请求顺序、会话和出口绘制可用结果分布

厂商标记可以缩小排查范围,但单凭它们并不能可靠地归因。Cloudflare 的文档记录了 cf-mitigated: challenge;单独一个 cf-ray 请求头并不能说明请求被拦截,因为每个经过代理的响应都带有它。DataDome 的 Cookie 或挑战端点能提供更多背景信息,而与 Akamai 相关的 Cookie 名称,例如 _abck 和 bm_sz 并不能证明任何具体的防护决策。

将获取判定与内容成功分开看待

借助 Crawling API 可以清楚地观察到这一区别。cb_status 是 Crawlbase 对响应的判定,包括其自身的拦截检查和内容检查。original_status 通常是目标网站发送的状态码。最终的 url 会暴露重定向;使用 format=json 时,这些字段会与响应体以及 domain_complexity 定价等级一同返回。向 https://example.com/ 发出的请求在2026年10月7日返回了:

json
{
  "original_status": 200,
  "pc_status": 200,
  "cb_status": 200,
  "url": "https://example.com/",
  "domain_complexity": "standard"
}

这些状态码都不能说明产品标题、价格或任何其他业务字段是有效的。稳健的管道会将这些字段的显式校验作为第三层。

三个独立的问题:Crawlbase 是否接受了响应,目标网站返回了什么,以及你需要的字段是否真的存在。

配套仓库的分类器位于 final/bot_diag/classify.py,它把这一区别具体化了:

python
# final/bot_diag/classify.py
def classify_response(
    status: int | None,
    body: str,
    headers: Mapping[str, str] | None = None,
    expected_fields: Sequence[str] | None = None,
) -> str:
    header_map = _header_map(headers)
    text = body or ""
    lowered = text.lower()
    if _is_cloudflare_challenge(lowered, header_map) or _is_datadome_challenge(lowered, header_map):
        return LABEL_CHALLENGED
    is_blocked = (
        _is_akamai_block(text, lowered)
        or _is_cloudflare_block(lowered, header_map)
        or _is_datadome_block(status, lowered, header_map)
        or (status in {401, 403, 429} and bool(text.strip()))
    )
    if is_blocked:
        return LABEL_BLOCKED
    return _content_label(status, text, expected_fields)

这是一段摘录,不是可独立运行的代码片段:导入、标签和辅助函数都位于包中的其他位置。它返回四种标签之一,分别是 blocked, challenged, invalid_content 和 ok。字段校验器刻意保持精简,只支持简单的 JSON 和 HTML 模式,而非生产级的数据模式,因此在将其用于你的数据之前,请先阅读 第 3 步 及其测试夹具。

一个实用的扩展是不只校验字段是否存在,还要校验字段类型、合理范围、跨字段一致性和新鲜度。这样可以发现文章 静默响应投毒中所述的故障:抓取在技术上成功,返回的值却不可用或具有误导性。

排除应用层原因,对响应进行分类,针对该类别选择补救措施,然后衡量经过验证的结果,再进入下一轮。

按故障类别选择恢复方式

不同的故障需要不同的干预措施。盲目轮换和无条件重试会让证据更难解读,还会增加负载和成本。

请求与会话一致性。 所声明的浏览器身份必须与其传输层、请求头、Cookie 历史和导航顺序保持一致。仅仅更换用户代理或出口 IP,对浏览器完整性检查或会话级评估几乎没有帮助。如果工作流依赖已登录或有状态的导航,请保持出口稳定。

浏览器执行。 当你需要的字段依赖 JavaScript 时再进行渲染。渲染成本更高、速度更慢:在 Crawling API 上,JavaScript 请求按标准费率的两倍计费。渲染并不等于获得了访问目标网站的许可,也不是通用的挑战解决方案。关于运维层面的取舍,请参阅 无头浏览器与抓取 API 的对比.

重试与升级。 对临时性故障进行有上限的退避重试。修正无效的 URL 和选择器,而不是原样重试。对于已确认的拦截,应展开调查,而不是用同样的请求反复冲击。在 Crawling API 上,以下是你最常遇到的状态码以及首先应采取的措施:

你看到的 含义 是否计费 首要应对
cb_status 200 成功。original_status 可能是 200、404、410 或重定向。 是 检查 original_status,然后校验字段。
cb_status 207 目标网站返回了 200,但响应体为空。 是 如果你预期有内容,请使用 JavaScript token 重试。
cb_status 503 Crawlbase 识别出了拦截页面或 CAPTCHA 页面。 否 如果尚未使用 JavaScript token,先尝试它,然后退避。
cb_status 705 或 706 目标网站返回了 403 或 429。 否 降低请求速率,并在重试之前先调查原因。
cb_status 704 目标网站返回了其他非成功状态码。 否 读取 original_status 并将其作为目标网站的响应来处理。
cb_status 400 缺失、未编码或无效的 url,或参数有误。 否 修正请求;不要重试。
cb_status 595 未找到 css_click_selector 指定的元素。 否 修正选择器或改用备用方案。
其他 5xx 和 6xx 状态码 Crawlbase 内部故障。 否 有上限地重试;如果问题持续存在,请将请求 ID 发送给支持团队。

失败的调用还会返回 HTTP 状态码 520。这是状态行,而不是 cb_status,因此务必根据响应中的 cb_status 来决定分支。仓库中的 升级步骤 以 520 和 525 作为 JavaScript 升级的触发条件,并添加了 page_wait=2000 和 ajax_wait。复用之前,请先将其与上表对照:遇到 503 或意外的 207,就进行升级;同时将 705 和 706 视为应当放慢速度的信号。这些等待参数有助于处理延迟渲染的内容,但并不能补救失败的挑战。

身份与策略。 对于具名的合法智能体,签名身份和注册可能比模仿任意浏览器流量更合适。Cloudflare Web Bot Auth、DataDome Agent Trust 以及 Akamai 与智能体相关的控制项都属于这一层。经过验证的身份仍然不能保证获得授权。

托管式获取。 Crawlbase 的 Crawling API 适合请求式集成;现有的代理兼容客户端可以直接使用 Smart AI Proxy 接入;而 Enterprise Crawler 则适合排队的批量任务和数据交付。托管基础设施让你无需自行运行浏览器集群和代理池,但支持的目标网站、延迟、额度消耗和失败率仍需实际测量。

Crawlbase Crawling API

通过一个 JSON 响应同时获取页面、目标网站的真实状态码、Crawlbase 自身的判定和最终 URL,需要时还可在浏览器中渲染。失败的请求不计费。注册即可获得最多 5,000 次免费请求,无需绑卡。

用配套项目评估恢复效果

配套 仓库 需要 Python 3.10+,并在 steps/ 下提供六个循序渐进的脚本,另有一个 bot_diag 包,位于 final/目录下。它是一个诊断框架,而 不是针对任何厂商的实时绕过基准测试。 其流程如下:

  1. 先使用 Normal token 发起一个 Crawling API 请求,并带上 format=json.
  2. 检查 cb_status, original_status、最终 URL 和内容。
  3. 对响应进行分类,并校验必需字段。
  4. 仅在故障策略确有需要时才重试或升级。
  5. 将每个 URL 的一条结果保存到 CSV,并汇总可用结果和重试开销。
  6. 按域名展示在 Smart AI Proxy 与 Crawling API 之间的选择。

运行可复现的基线

克隆仓库,安装依赖,然后从无需 token 的合成数据路径开始。在 final 目录中运行:

bash
python -m bot_diag evaluate urls.example.txt --fields price,title --dry-run

进行实时运行时,请设置 CRAWLBASE_TOKEN 以及用于 JavaScript 升级的 CRAWLBASE_JS_TOKEN 环境变量,提供一份你有权抓取的 URL 列表,然后运行:

bash
python -m bot_diag evaluate urls.txt --fields price,title \
  --concurrency 4 --max-retries 2 --out sample_results.csv

评估器将并发上限设为八。它会报告基于输入 URL 计算的 ok 比率、按请求尝试计算的最近秩 p50 和 p95 延迟,以及重试开销。延迟数据不包含重试退避的休眠时间,而 CSV 中每个 URL 只有一行汇总记录,而不是每次尝试一行。将这些数字与生产任务的实际耗时进行比较时,这两点都很重要。

要进行有意义的比较,请在具有代表性的页面类型中抽取大约 100 到 200 个 URL,对每种获取方式应用相同的校验规则,并在不止一天内重复测试。按域名、页面类别、地理位置和渲染模式对结果进行细分。合成测试夹具只能检验程序流程;只有经授权的实时样本才能衡量目标网站的可靠性。

有针对性地为失败域名调整路由

仓库中的 路由示例 按规范化后的主机名统计观察到的挑战次数。低于默认阈值三次时,它继续使用 Smart AI Proxy;达到或超过该阈值时,则将该域名切换到 Crawling API:

python
# final/bot_diag/routing.py
def route_domain(
    domain: str,
    challenge_counts: Mapping[str, int],
    *,
    threshold: int = DEFAULT_CHALLENGE_THRESHOLD,
) -> str:
    """Return ``api`` after ``threshold`` challenges, otherwise ``proxy``.

    ``proxy`` means the caller's existing HTTP client should keep using
    ``smartproxy.crawlbase.com:8013``. ``api`` means that domain should move
    to the Crawling API. Counts must already be keyed by ``domain_key``.
    """
    if threshold < 1:
        raise ValueError("threshold must be at least 1")
    key = domain_key(domain)
    if challenge_counts.get(key, 0) >= threshold:
        return API
    return PROXY

第 6 步 只会打印决策结果,它 不会 打开代理连接,也不会自动进行故障切换。Smart AI Proxy 的 HTTPS 端点是 smartproxy.crawlbase.com:8013 并采用基于令牌的代理认证,相关的 Smart AI Proxy 文档 介绍了其 CrawlbaseAPI-Parameters 请求头,包括 JavaScript 选项。在该示例中,Crawling API 的升级使用单独的 JavaScript token。

真正的路由服务还需要会过期的计数器、可观测性、熔断机制,以及回到更便宜路由的路径。没有这些,短短三次挑战就会让一个主机名的流量永久切换。

按每个可用结果衡量成本,而不是按每个 HTTP 200

当同一组经过验证的 URL 样本分别通过两种方式运行之后,请将可靠性和总运营成本放在一起比较。

text
url_completion_rate    = urls_with_valid_final_result / input_urls
attempt_success_rate   = successful_attempts / all_fetch_attempts
cost_per_usable_result = total_allocated_cost / validated_results

分母不同是有意为之。URL 完成率衡量的是任务完成了多少;尝试成功率衡量的是获取路径的效率。不要把两者并列,并都称为“成功率”。

统计代理和计算支出、托管服务商的额度、重试开销、浏览器基础设施和工程维护成本,同时避免重复计算托管费率中已包含的部分。在 Crawlbase 上,只有成功的调用才会计费:目标网站返回的 200、404、410 和重定向、空的 200 响应体(cb_status 207),以及你主动设为成功的任何状态码(通过 custom_success_codes)。拦截和内部故障均不收费。domain_complexity 是定价等级,会对每个计费请求进行倍乘,因此请以账户用量和 Crawlbase 定价 为准查看实际消耗,而不要根据请求数量估算。

在可预测的目标网站上,或在必须完全控制浏览器时,自管客户端可能更经济。当维护特定域名的变通方案开始占用大量工程时间时,托管式获取就更有吸引力。两种方式都不能免去校验返回数据的必要。

结论

2026 年的重要变化集中在 持续性证据、浏览器完整性和更精细的运营方策略。它们都没有让旧的故障模式退出舞台:失效的选择器、过期的会话、失控的并发以及不完整的渲染。

把抓取可靠性当作一个可观测的系统来对待:保留原始响应,将获取判定与目标网站的响应分开,保守地对故障进行分类,有选择地升级,并以经过验证的数据来评判结果。本文的 配套仓库 是实践这一工作流的起点。如果你的抓取基础设施正在成为维护瓶颈,不妨 用 Crawlbase 运行同一批具有代表性的 URL 并在调整架构之前,比较每个可用结果的成本。

主要参考资料

常见问题(FAQ)

为什么爬虫通过了挑战,之后却失败了?

在采用会话级评估的网站上,后续活动可能改变信任判定。在认定第一次挑战是唯一的防护点之前,请先比较请求顺序、Cookie、会话连续性、速率和出口行为。

HTTP 200 是否意味着抓取成功?

不是。它只确认了某一层上有响应返回。挑战页面、空壳页面、被重定向的页面,或看似合理但实际错误的数据,都可能伴随 200 一起返回。在将某个 URL 标记为完成之前,请校验字段及其含义。

住宅代理对现代机器人检测仍然有用吗?

它们有助于解决 IP 信誉和地理访问问题,但解决不了缺失浏览器执行或会话信号不一致的问题。激进的逐请求轮换反而可能让有状态的工作流更不连贯。

哪些 Crawling API 响应会计费?

只有成功的响应,即 cb_status 为 200 的响应(包括目标网站返回的 404、410 和重定向)、空的 200 响应体(报告为 cb_status 207),以及你主动设为成功的状态码(通过 custom_success_codes)。503、704、705 和 706 等拦截以及内部故障都不计费。

Crawlbase 能否保证访问受 Cloudflare、DataDome 或 Akamai 保护的网站?

没有任何服务商能保证覆盖所有目标网站和配置。正确的测试方式是使用一组可重复、经授权的 URL 样本,进行字段级校验,并统计延迟和额度消耗,而不是看单次请求是否成功。

开始构建

大规模爬取任何站点,无需与基础设施对抗。

Crawlbase 负责处理代理、指纹和 CAPTCHA,让你的团队专注于交付数据流水线,而非维护爬取管道。1,000 次请求免费,无需信用卡。

自助开通 · 无需销售通话 · 提供企业级爬取量