使用Scrapeless Scraping浏览器处理Akamai保护的页面
Advanced Bot Mitigation Engineer
TL;DR:
- 将与Akamai相关的抓取失败视为表示问题。 在更改客户端之前,记录最终URL、标题、内容类型、cookies和所需的业务标记。
- 代理仅改变网络源层。 Akamai产品还可以评估传输、HTTP、JavaScript、浏览器、会话和行为信号。
- 当所需的公共页面需要JavaScript和连续性时,请使用浏览器会话。 在一个有限的Scrapeless Scraping Browser会话内保持地理、指纹、cookies和导航。
- 验证内容,而不仅仅是状态代码。 正常状态仍然可能包含挑战、同意外壳或不相关页面。
- 不要将此工作流程视为许可。 使用公共或明确授权的页面,保持请求量成比例,并在登录、访问控制或合同边界处停止。
一个受Akamai保护的页面可以为普通浏览器和直接HTTP客户端返回不同的内容。脚本可能会收到挑战文档、重定向或缺少必要字段的应用外壳。
工程任务是识别到达的表示,并选择返回预期公共内容的复杂性最小的允许获取路线。本教程使用Scrapeless Scraping Browser处理真正需要JavaScript、cookies和会话连续性的页面。它不提供利用或访问受限制资源的说明。
Akamai机器人保护评估内容
Akamai提供边缘安全、应用保护和机器人管理产品。一个网站可以将这些控制与其自有的身份验证、授权、速率限制和业务规则结合。
Akamai的 网页抓取保护文档 解释说,网站可以部署内容保护检测以防止抓取活动。
该产品上下文并未识别单个响应的原因。一个网站可能由于区域、同意状态、应用政策、账户状态、流量历史或安全决定而返回备用页面。在将返回的内容归因于单个信号之前,请先进行诊断。
Akamai保护页面的常见症状
| 症状 | 确定了什么 | 仍然未知的内容 |
|---|---|---|
| 重定向到验证页面 | 普通页面未直接返回 | 是哪个层级触发了重定向 |
| 正常状态带有挑战文本 | HTTP传输完成 | 是否存在业务内容 |
| 直接HTTP失败而浏览器正常工作 | 浏览器状态影响表示 | 哪个浏览器或会话信号重要 |
| 首个页面加载后后续导航更改 | 序列或会话状态影响结果 | 是否是cookies、路线或政策引起的 |
| 页面因市场而异 | 地理或本地化影响内容 | 其他地方是否被拒绝访问 |
| DOM存在但选择器返回空 | 解析器没有找到预期字段 | 页面、时机或选择器是否出错 |
为每个测试保存一个小的诊断记录:请求的URL、最终URL、页面标题、内容类型、规范URL、所需标记和短的主体哈希。当这些字段足以比较结果时,避免收集完整的无控制页面。
可能影响结果的信号
IP来源和地理
明显的源地址、网络类型、国家和连接历史可以影响本地化或访问政策。住宅代理可以提供市场特定的源。它不执行JavaScript,不创建浏览器存储,也不授予权限。
TLS和传输行为
TLS协商揭示了与客户端堆栈相关的协议行为。TLS 1.3规范 定义了握手和协商参数。因此,两个请求相同URL的客户端在考虑HTTP头之前看起来可能不同。
HTTP语义
方法、头、重定向、内容协商和中介塑造请求和响应。HTTP语义规范 定义了这些字段。
将浏览器的 User-Agent 字符串复制到直接客户端中不会重现周围的头集、传输行为、cookie状态、JavaScript运行时或导航序列。
JavaScript和浏览器状态
浏览器执行脚本,加载依赖资源,暴露运行时属性,更新DOM,并维护存储。仅在批准的内容需要它时使用该功能。接受条件应命名所需的内容标记,而不是依赖任意延迟。
Cookies和会话连续性
Cookies 在导航之间保持状态。HTTP 状态管理规范 定义了服务器如何设置 cookies 以及用户代理如何返回它们。
当一个公共工作流从首页移动到搜索页面,再到详细页面时,请在一个浏览器会话中保持这些步骤。中途更改地理位置、网络路线或浏览器身份可能会改变返回的表示。
行为和应用策略
导航顺序、请求速率、表单使用、账户状态和自定义应用规则也可能很重要。如果所需内容在登录或明确限制后面,请停止并获取批准的访问方式。
选择获取路线
| 路径 | 使用时机 | 团队拥有 | 接受检查 |
|---|---|---|---|
| 直接 HTTP | 所需字段存在于开放的服务器渲染 HTML 中 | Headers、cookies、解析、验证 | 响应中出现所需标记 |
| 自管理浏览器 | 页面需要 JavaScript 或允许的交互 | 浏览器生命周期、路由、会话、更新 | 渲染的 DOM 中出现所需标记 |
| 无抓取浏览器 | 团队想要 CDP 控制而不运行浏览器基础设施 | 导航、选择器、架构、集合政策 | 页面身份和所需字段通过 |
| 管理页面 API | 可交付内容是获取的页面内容 | 请求合同和结果验证 | 返回文档与批准的页面身份匹配 |
首先使用直接 HTTP。只有在页面的行为提供渲染或会话连续性需要的证据时,才转向浏览器。
无抓取浏览器 通过 Chrome DevTools 协议连接,并与 Playwright 或 Puppeteer 一起工作。它的连接参数支持会话生命周期、会话名称、地理代理路由和可选指纹配置。
无抓取浏览器指南 演示了相同的 CDP 连接模式,适用于 JavaScript 渲染的目标。
前提条件
以下示例需要:
- Node.js 20 或更高版本;
- 使用
npm install playwright-core安装的 Playwright Core; - 存储在
SCRAPELESS_API_KEY中的 Scrapeless API 密钥; - 存储在
AUTHORIZED_TARGET_URL中的授权公共目标; - 存储在
EXPECTED_SELECTOR中的一个预期内容选择器; - 针对数据集的文档国家代码,例如
US。
该块是一个前提条件差距示例,因为本文没有读者的凭证或经过授权的 Akamai 保护目标。连接形状基于当前的无抓取浏览器文档;仅在项目的批准范围内运行它。
构建一个有限的浏览器会话
该脚本保持一个会话,首先访问目标的来源,导航到批准的目标,并验证页面身份及所需的 DOM 标记。它不提交表单、登录、解决账户控制或发现额外的 URL。
javascript
const { chromium } = require('playwright-core');
const apiKey = process.env.SCRAPELESS_API_KEY;
const targetUrl = process.env.AUTHORIZED_TARGET_URL;
const expectedSelector = process.env.EXPECTED_SELECTOR;
if (!apiKey || !targetUrl || !expectedSelector) {
throw new Error(
'Set SCRAPELESS_API_KEY, AUTHORIZED_TARGET_URL, and EXPECTED_SELECTOR'
);
}
const target = new URL(targetUrl);
if (target.protocol !== 'https:') {
throw new Error('AUTHORIZED_TARGET_URL must use HTTPS');
}
const query = new URLSearchParams({
token: apiKey,
sessionTTL: '180',
sessionName: 'authorized-akamai-diagnostic',
proxyCountry: 'US',
});
const connectionURL =
`wss://browser.scrapeless.com/api/v2/browser?${query.toString()}`;
(async () => {
const browser = await chromium.connectOverCDP(connectionURL);
try {
const context = browser.contexts()[0] || await browser.newContext();
const page = await context.newPage();
await page.goto(target.origin, {
waitUntil: 'domcontentloaded',
timeout: 60_000,
});
await page.goto(target.href, {
waitUntil: 'domcontentloaded',
timeout: 60_000,
});
await page.locator(expectedSelector).first().waitFor({
state: 'visible',
timeout: 20_000,
});
const result = {
requestedUrl: target.href,
finalUrl: page.url(),
title: await page.title(),
canonicalUrl: await page
.locator('link[rel="canonical"]')
.first()
.getAttribute('href'),
requiredMarkerFound: true,
};
if (new URL(result.finalUrl).hostname !== target.hostname) {
throw new Error(`Unexpected final host: ${result.finalUrl}`);
}
console.log(JSON.stringify(result, null, 2));
} finally {
await browser.close();
}
})().catch((error) => {
console.error(error.message);
process.exitCode = 1;
});
保持选择器与稳定的业务元素关联,例如产品标识符或公共文章标题。当可访问角色、规范元素或结构化属性可用时,避免脆弱的生成类名。
验证返回的内容
不要将每个渲染页面直接发送给解析器。使用显式状态创建获取结果。
| 结果状态 | 意义 | 下一步行动 |
|---|---|---|
accepted |
页面身份和所需标记匹配 | 解析批准的字段 |
content_absent |
正确的主机,缺少所需内容 | 审查渲染、选择器或页面更改 |
unexpected_page |
重定向、挑战、同意或不相关内容 | 停止并检查表示 |
policy_review |
遇到登录、私人数据或访问边界 | 获取授权或支持的访问 |
network_error |
在页面验证前连接失败 | 诊断传输和服务健康 |
内容合同应包括请求的 URL、最终 URL、规范 URL、观察时间、区域、页面身份、所需标记和验证状态。这将挑战文档和空壳排除在业务数据集之外。
小心使用会话连续性
设置一个会话生命周期,足够长以适应批准的导航,而不再长。 抓取浏览器文档 记录了 sessionTTL 和地理路由参数。
在会话中保持以下稳定:
- 代理国家和任何所需的区域设置;
- 浏览器指纹配置;
- cookie jar 和本地存储;
- 导航来源和页面顺序;
- 当数据集依赖于时的语言和视口。
请勿在不相关的用户或工作之间共享一个经过身份验证的会话。 本教程涵盖公共或明确授权的内容,并且不需要登录。
故障排除矩阵
| 观察 | 检查 | 控制变更 | 通过条件 |
|---|---|---|---|
| 最终主机是意外的 | 重定向链和政策边界 | 在审查之前不进行 | 最终主机保持批准 |
| 正确的页面标题,缺少数据 | 渲染和选择器 | 替换一个脆弱的选择器 | 所需的商业标记可见 |
| 同意页面返回 | 区域和同意要求 | 应用批准的同意路径 | 普通公共页面出现 |
| 仅在访问来源后页面工作 | 会话状态 | 将来源和目标保持在一个会话中 | 相同的标记一致通过 |
| 不同市场内容出现 | 代理国家和语言 | 固定所需市场 | 数据集区域与合同匹配 |
| 浏览器页面在运行中变化 | 来源漂移或随机化的DOM | 优先使用语义定位器和规范数据 | 所需字段保持完整 |
| 客户端直接工作但解析器失败 | 提取逻辑 | 测试保存的允许样本 | 架构验证通过 |
一次更改一个变量。如果国家、会话、选择器和目标一起变化,测试无法识别哪个条件影响了结果。
只有在合同稳定后再扩展
在添加并发之前,运行一小组具有代表性的测试。包括工作所需的每个公共页面模板:搜索、类别、详情或文章。记录接受的页面、意外的页面、持续时间和每个接受记录的成本。
从三个或更少的会话开始并发。仅在网站发布规则、项目授权和观察到的稳定性支持更多流量时增加。仅为工作负载调度添加抖动,而不是模仿人或规避控制。
使用浏览器分钟和来自代表性集合的接受记录查看 Scrapeless 定价。原始导航数量不能反映数据质量。
负责任地处理公共网络数据
Akamai 保护不会决定一个收集项目是否合法或被允许。独立审查授权、来源条款、适用法律、内容权利、隐私义务和预期使用。
保持边界狭窄:
- 仅收集公共或明确授权的页面;
- 停止于登录、私人区域或明确的访问限制;
- 最小化收集的字段和保留;
- 使用与请求率成比例的请求;
- 保留来源和删除规则;
- 将有争议的访问路线发送给法律和安全所有者。
目标是在批准的范围内建立一个稳定、可审查的获取路径,而不是击败网站的安全政策。
结论:诊断表现,然后选择路线
与Akamai相关的故障可能涉及网络来源、传输、HTTP、JavaScript、浏览器状态、cookie、行为或应用程序政策。在更改工具之前,记录返回的页面和所需标记。
对于开放的HTML,使用直接HTTP;对于允许的JavaScript和导航,使用有限的浏览器会话;当应用程序需要经过验证的内容而不拥有浏览器基础设施时,使用受管理的获取API。在代表页面上通过页面标识和架构检查后再进行扩展。
测试一个授权的公共页面
创建一个 Scrapeless 帐户,选择一个授权的公共URL,并在添加更多目标之前运行内容合同。保持最终主机、规范URL和所需选择器在测试结果中。
常见问题
问:爬取受Akamai保护的网站合法吗?
合法性和权限取决于来源、司法管辖区、条款、数据类型、授权、访问方式和预期用途。保护技术本身并不能回答这个问题。对具体项目获取法律指导。
问:家庭代理足够用于Akamai受保护页面吗?
不够。代理改变网络来源,并可以支持所需的地理位置,但它不会执行JavaScript、保留浏览器状态、验证内容或授予访问权限。
问:Akamai和Web应用防火墙一样吗?
Akamai提供多种安全和交付产品,网站可以将机器人管理与Web应用防火墙控制和自定义应用程序规则结合起来。一个响应不能确定是哪个产品或规则做出的决定。
问:爬虫应如何处理轮换的DOM选择器?
优先选择稳定的页面标识、语义角色、规范元素、结构化属性和源特定的架构测试。将缺失的所需标记视为验证失败,而不是返回一个空记录。
问:Akamai 网络抓取测试应该使用什么并发性?
从三个或更少的会话开始,使用一小部分经过批准的页面集。仅在授权、源规则和测量的稳定性支持额外流量时增加会话数量。
问:这个工作流需要 AI Agent 吗?
不需要。确定性的 Playwright 脚本更容易测试已知的导航路径。仅在任务确实具有不确定中间步骤且应用程序可以强制工具权限时添加代理。
问:为什么要验证规范 URL?
规范 URL 有助于确认页面身份、规范重复内容并检测意外导航。它们应与最终主机和所需内容标记一起检查,而不是作为唯一的接受信号。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



