Akamai保護ページをScrapeless Scraping Browserで処理する
Advanced Bot Mitigation Engineer
TL;DR:
- Akamaiに関連するスクレイピングの失敗は表現の問題と見なしてください。 クライアントを変更する前に、最終URL、タイトル、コンテンツタイプ、クッキー、および必要なビジネスマーカーを記録してください。
- プロキシはネットワーク起源層のみを変更します。 Akamai製品は、トランスポート、HTTP、JavaScript、ブラウザ、セッション、および動作シグナルを評価できます。
- 許可された公開ページがJavaScriptと継続性を必要とする場合はブラウザセッションを使用してください。 地理情報、フィンガープリント、クッキー、およびナビゲーションを1つの限られたScrapeless Scraping Browserセッション内に保ちます。
- ステータスコードだけでなくコンテンツを検証してください。 通常のステータスでも、チャレンジ、同意シェル、または無関係なページが含まれる場合があります。
- このワークフローを許可として扱わないでください。 公開または明示的に許可されたページを使用し、リクエストのボリュームを比例に保ち、ログイン、アクセス制御、または契約上の境界で停止します。
Akamaiで保護されたページは、通常のブラウザと直接HTTPクライアントに対して異なるコンテンツを返すことがあります。スクリプトは、チャレンジドキュメント、リダイレクト、または必要なフィールドが欠落したアプリケーションシェルを受け取る場合があります。
エンジニアリングタスクは、どの表現が到着したかを特定し、期待される公開コンテンツを返す最も単純な許可された取得経路を選択することです。このチュートリアルでは、JavaScript、クッキー、セッションの継続性を本当に必要とするページにScrapeless Scraping Browserを使用します。制限されたリソースにアクセスするためのエクスプロイトや指示は提供しません。
Akamaiボット保護が評価するもの
Akamaiは、エッジセキュリティ、アプリケーション保護、およびボット管理製品を提供します。サイトは、独自の認証、承認、レート制限、およびビジネスルールとこれらの制御を組み合わせることができます。
Akamaiのウェブスクレイパー保護ドキュメントは、サイトがスクレイピング活動のためのコンテンツ保護検出を展開する可能性があることを説明しています。
その製品のコンテキストは、1つの応答の原因を特定しません。サイトは、地域、同意状態、アプリケーションポリシー、アカウントの状況、トラフィック履歴、またはセキュリティ判断のために代替ページを返す場合があります。返されたコンテンツを単一のシグナルに帰属させる前に診断してください。
Akamai保護ページの一般的な症状
| 症状 | 何が確立されるか | 何が不明のままか |
|---|---|---|
| バリデーションページへのリダイレクト | 通常のページは直接返されなかった | どの層がリダイレクトをトリガーしたのか |
| チャレンジテキスト付きの通常ステータス | HTTPトランスポートは完了した | ビジネスコンテンツが存在するかどうか |
| ブラウザが機能する間に直接HTTPが失敗する | ブラウザの状態が表現に影響を与える | どのブラウザまたはセッションシグナルが重要か |
| 最初のページが読み込まれ、その後のナビゲーションが変わる | シーケンスまたはセッションの状態が結果に影響する | クッキー、ルート、またはポリシーが原因かどうか |
| 市場によってページが異なる | 地理情報またはローカリゼーションがコンテンツに影響する | 他の場所でアクセスが拒否されているかどうか |
| DOMが存在するがセレクタが何も返さない | パーサーが予期されたフィールドを見つけられなかった | ページ、タイミング、またはセレクタが誤っているか |
各テストについて小さな診断記録を保存してください:要求されたURL、最終URL、ページタイトル、コンテンツタイプ、カノニカルURL、必要なマーカー、および短いボディハッシュ。このフィールドで結果を比較するのに十分な場合、完全な制御されていないページを収集するのは避けてください。
結果に影響を与える可能性のあるシグナル
IP起源と地理
明示的なソースアドレス、ネットワークタイプ、国、接続履歴は、ローカリゼーションまたはアクセスポリシーに影響を与える可能性があります。住宅用プロキシは、市場特有の起源を提供できます。これはJavaScriptを実行せず、ブラウザストレージを作成せず、権限を付与しません。
TLSおよびトランスポートの動作
TLSネゴシエーションは、クライアントスタックに関連するプロトコルの動作を明らかにします。TLS 1.3仕様は、ハンドシェイクと交渉されたパラメータを定義しています。同じURLを要求する2つのクライアントは、HTTPヘッダーが考慮される前は異なって見える可能性があります。
HTTPセマンティクス
メソッド、ヘッダー、リダイレクト、コンテンツネゴシエーション、および中間者は、要求と応答を形作ります。HTTPセマンティクス仕様は、これらのフィールドを定義しています。
ブラウザのUser-Agent文字列を直接クライアントにコピーすると、周囲のヘッダーセット、トランスポート動作、クッキーステータス、JavaScriptランタイム、またはナビゲーションシーケンスを再現することはできません。
JavaScriptとブラウザの状態
ブラウザはスクリプトを実行し、依存リソースをロードし、ランタイムプロパティを公開し、DOMを更新し、ストレージを維持します。その能力は、承認されたコンテンツがそれを必要とする場合のみ使用してください。受け入れ条件は、任意の遅延に依存せず、必要なコンテンツマーカーを指定する必要があります。
クッキーとセッションの継続性
クッキーはナビゲーション中に状態を保持します。HTTP状態管理仕様は、サーバーがクッキーを設定し、ユーザーエージェントがそれを返す方法を定義しています。
公開ワークフローがホームページから検索ページ、そして詳細ページに移行する際は、そのステップを1つのブラウザセッションで保持してください。シーケンスの途中で地理、ネットワークルート、またはブラウザの識別を変更すると、返される表現が変わる可能性があります。
挙動とアプリケーションポリシー
ナビゲーションの順序、リクエストレート、フォームの使用、アカウント状態、およびカスタムアプリケーションルールも重要です。必要なコンテンツがログインまたは明示的な制限の背後にある場合は、停止し、承認されたアクセス方法を取得してください。
取得ルートの選択
| ルート | 使用時 | 所有チーム | 受け入れチェック |
|---|---|---|---|
| 直接HTTP | 必要なフィールドがオープンサーバーレンダリングHTMLに存在する場合 | ヘッダー、クッキー、解析、検証 | 必要なマーカーが応答に表示される |
| 自己管理ブラウザ | ページにJavaScriptまたは許可されたインタラクションが必要な場合 | ブラウザライフサイクル、ルーティング、セッション、更新 | 必要なマーカーがレンダリングされたDOMに表示される |
| スクラペレススクレイピングブラウザ | チームがブラウザインフラストラクチャを実行せずにCDP制御を望む場合 | ナビゲーション、セレクター、スキーマ、コレクションポリシー | ページのアイデンティティと必要なフィールドを通過する |
| 管理されたページAPI | デリバラブルが取得されたページコンテンツの場合 | リクエスト契約と結果検証 | 返されたドキュメントが承認されたページアイデンティティに一致する |
まずは直接HTTPから始めてください。ページの挙動がレンダリングまたはセッションの一貫性が必要であることを示す場合にのみ、ブラウザに移動します。
スクラペレススクレイピングブラウザはChrome DevToolsプロトコルを介して接続し、PlaywrightまたはPuppeteerとの併用が可能です。その接続パラメーターは、セッションの寿命、セッション名、地理的プロキシルーティング、オプションのフィンガープリンティング設定をサポートします。
スクラペレススクレイピングブラウザガイドは、JavaScriptレンダリングターゲットに対する同じCDP接続パターンを示しています。
前提条件
以下の例では、次のものが必要です:
- Node.js 20以上;
npm install playwright-coreでインストールされたPlaywright Core;SCRAPELESS_API_KEYに保存されたScrapeless APIキー;AUTHORIZED_TARGET_URLに保存された承認された公開ターゲット;EXPECTED_SELECTORに保存された1つの期待されるコンテンツセレクター;USのようなデータセットの文書化された国コード。
このブロックは前提条件のギャップの例です。なぜなら、この文書には読者の資格情報や承認されたAkamai保護ターゲットがないからです。接続形状は現在のScrapeless Scraping Browserのドキュメントに基づいています。プロジェクトの承認された範囲内でのみ実行してください。
制限されたブラウザセッションを構築する
スクリプトは1つのセッションを保持し、最初にターゲットのオリジンを訪れ、承認されたターゲットにナビゲートし、ページアイデンティティと必要な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と地理的ルーティングパラメータを文書化しています。
セッション内で次のものを安定させてください:
- プロキシ国と必要な地域設定;
- ブラウザフィンガープリンティング設定;
- クッキージャーとローカルストレージ;
- ナビゲーションの起点とページの順序;
- データセットが依存する場合の言語とビューポート。
無関係なユーザーやジョブ間で1つの認証されたセッションを共有しないでください。このチュートリアルは公共のコンテンツまたは明示的に許可されたコンテンツを対象としており、ログインは必要ありません。
トラブルシューティングマトリックス
| 観察 | 検査 | 制御された変更 | 合格条件 |
|---|---|---|---|
| 最終ホストが予期しない | リダイレクトチェーンとポリシー境界 | レビューされるまでなし | 最終ホストは承認されたまま |
| 正しいページタイトル、データが不足 | レンダリングとセレクタ | 脆弱なセレクタを1つ置き換える | 必要なビジネスマーカーが表示される |
| 同意ページが返された | ロケールと同意要件 | 承認された同意パスを適用 | 通常の公開ページが表示される |
| 起点訪問後にのみページが機能する | セッション状態 | 起点とターゲットを1つのセッションに保持 | 同じマーカーが一貫して合格する |
| 異なる市場コンテンツが表示される | プロキシ国と言語 | 必要な市場をピン留めする | データセットのロケールが契約と一致する |
| ブラウザのページが実行ごとに変更される | ソースのドリフトまたはランダム化されたDOM | セマンティックロケーターと標準データを優先する | 必要なフィールドが完全に保持される |
| 直接クライアントは動作するがパーサーが失敗する | 抽出ロジック | 許可されたサンプルをテストする | スキーマが検証される |
1回の変数だけを変更してください。国、セッション、セレクタ、およびターゲットがすべて一緒に変更されると、テストはどの条件が結果に影響を与えたか特定できません。
契約が安定した後にのみスケール
同時実行を追加する前に、小さな代表的セットを実行してください。ジョブに必要な各公共ページテンプレートを含めてください:検索、カテゴリ、詳細、または記事。受け入れられたページ、予期しないページ、期間、および受け入れられたレコードごとのコストを記録します。
3セッション以下の同時実行から始めてください。サイトの公開ルール、プロジェクトの承認、および観察された安定性がより多くのトラフィックをサポートする場合にのみ増やしてください。ジッターはワークロードのスケジュールのみで使用し、人物の模倣やコントロールの回避には使用しないでください。
Scrapelessの価格設定をレビューし、ブラウザーミニットと代表的セットからの受け入れられたレコードを使用します。生のナビゲーションカウントはデータの品質を反映しません。
公共ウェブデータを責任を持って扱う
Akamaiの保護は、収集プロジェクトが合法であるか許可されているかを決定しません。承認、ソースの条件、適用法、コンテンツの権利、プライバシー義務、意図された使用を独立して確認してください。
境界を狭く保つ:
- 公共または明示的に許可されたページのみを収集する;
- ログイン、プライベートエリア、または明示的なアクセス制限で停止する;
- 収集フィールドと保持を最小限に抑える;
- 比例したリクエストレートを使用する;
- 出所と削除ルールを維持する;
- 争われたアクセスを法的およびセキュリティの所有者にルーティングする。
目標は、承認された範囲内で安定したレビュー可能な取得パスを持つことであり、サイトのセキュリティポリシーを打破することではありません。
結論:表現を診断し、その後ルートを選択する
Akamaiに関連する失敗は、ネットワークの起点、トランスポート、HTTP、JavaScript、ブラウザの状態、クッキー、動作、またはアプリケーションポリシーに関与する可能性があります。ツールを変更する前に、返されたページと必要なマーカーを記録してください。
オープンHTMLには直接HTTPを使用し、許可されたJavaScriptとナビゲーションには制限されたブラウザセッションを使用し、アプリケーションがブラウザインフラストラクチャを所有せずに検証されたコンテンツが必要な場合には管理された取得APIを使用してください。ページのアイデンティティとスキーマチェックが代表的なページで合格するまでスケールしないでください。
一つの認証された公共ページをテストする
Scrapelessアカウントを作成し、一つの認証された公共URLを選択して、他のターゲットを追加する前にコンテンツ契約を行います。最終ホスト、canonical URL、および必要なセレクタをテスト結果に保持してください。
よくある質問
Q: Akamaiで保護されたウェブサイトをスクレイピングすることは合法ですか?
合法性と許可は、ソース、法域、条件、データタイプ、承認、アクセス方法、および意図された使用に依存します。保護技術だけでは質問に答えません。特定のプロジェクトに対して法的助言を取得してください。
Q: Akamaiで保護されたページには住宅用プロキシは十分ですか?
いいえ。プロキシはネットワークの起点を変更し、必要な地理をサポートできますが、JavaScriptを実行したり、ブラウザの状態を保持したり、コンテンツを検証したり、アクセス許可を付与することはできません。
Q: Akamaiはウェブアプリケーションファイアウォールと同じですか?
Akamaiは複数のセキュリティおよび配信製品を提供しており、サイトはボット管理とウェブアプリケーションファイアウォールコントロール、およびカスタムアプリケーションルールを組み合わせることができます。一つの応答だけでは、どの製品またはルールがその決定を下したかを特定できません。
Q: スクレイパーは回転するDOMセレクタをどのように扱うべきですか?
安定したページのアイデンティティ、セマンティックロール、標準要素、構造化属性、およびソース特有のスキーマテストを優先してください。欠落した必要なマーカーは、空のレコードを返すのではなく、検証の失敗と見なしてください。
Q: Akamaiのウェブスクレイピングテストにはどの程度の同時接続が必要ですか?
小規模な承認されたページセットで、3つ以下のセッションから始めます。認証、ソースルール、測定された安定性が追加トラフィックをサポートする時のみ増加させます。
Q: このワークフローにはAIエージェントが必要ですか?
いいえ。決定論的なPlaywrightスクリプトは、既知のナビゲーションパスのテストが容易です。タスクに本当に不確実な中間ステップがあり、アプリケーションがツールの権限を強制できる場合のみエージェントを追加します。
Q: なぜカノニカルURLを確認するのですか?
カノニカルURLはページのアイデンティティを確認し、重複を正規化し、予期しないナビゲーションを検出するのに役立ちます。これらは最終的なホストと必要なコンテンツマーカーと併せて確認されるべきであり、唯一の受け入れシグナルとして使用されるべきではありません。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



