Scrapeless Scraping Browserを使用してGoogle検索結果をスクレイピングする方法:オーガニック結果、PAA、ナレッジパネル、およびAIの概要
Senior Web Scraping Engineer
主なポイント:
- 1つのCLI、すべてのGoogleサーフェス。
scrapeless-scraping-browserのワークフローは、Googleのオーガニック結果、フィーチャースニペット、関連質問、ナレッジパネル、関連検索、およびAI概要をすべて同じセッションパターンからスクレイピングします。2026年4月24日にUbuntuでエンドツーエンド確認済み(scrapelessクエリのページあたり138のオーガニックコンテナ)。 - Googleの待機戦略。
wait --load networkidleは約14秒で戻りますが、Googleのトラッカーは決して落ち着かないため、代わりに固定のwait 5000を使用し、div[data-ved][data-hveid]コンテナをカウントして準備完了を確認します(≥ 8はSERPがレンダリングされたことを意味します)。 - 発見 → ユニオンセレクタで抽出。 GoogleはスニペットコンテナをA/Bバリアント間で回転させます(
div.VwiC3b、div[data-content-feature="1"]、.lEBKkf、span.st)。各フィールドを独立してクエリし、カードごとにジップします。「h3かつアンカーかつスニペットを必須とする」という厳格なルールは、広告や動画カードのために4/10の結果を失います。 - フィーチャースニペットは
.kno-rdescから移動。 高さ/測定クエリでは、Googleは現在、回答を属性ごとのナレッジパネルの断片(span.T286Pc)としてレンダリングします。回復力のあるパターンは、セレクターのカスケードに続いて本文テキストの正規表現フォールバックです — ステップ4で示されています。
イントロダクション:Google検索のスクレイピング
Google検索は、SEOのランクトラッキング、競合分析、ブランドSOV、AIグラウンディングパイプライン、LLM評価データセットのための荷重支持表面です。2026年にこれを信頼性高くスクレイピングすることは、4つの可動部分を処理することを意味します:/sorry/indexのレート制限を越えた住宅IPルーティング、トラッカーが完全にアイドル状態にならないための固定待機戦略、回転するA/Bクラス名に対するユニオンセレクタ、およびフィーチャーごとの抽出パターン(オーガニック、フィーチャースニペット、関連質問、ナレッジパネル、関連検索、AI概要)。
Googleの/sorry/index CAPTCHA壁は、変動するレートで発火します — 穏やかな日では約1/10で、負荷が高い時にはほぼすべての米国出口リクエストに応じて — プロキシプール、時間帯、ターゲット地域によって異なります。一般に、DE/GB/JP/FR/CAのプロキシはGoogle専用で米国よりも高いパス率を持っています(ステップ1参照)。Scrapeless Scraping Browserは、住宅プロキシ、検出防止フィンガープリンティング、JavaScriptレンダリングをセッションレベルの懸念事項として処理するため、パイプラインコードはセレクタと待機に焦点を当てています。
この記事はCLIファーストで、検証に基づいたscrapeless-scraping-browserクラウドブラウザへのウォークスルーです。以下のすべてのセレクタ、待機閾値、失敗パターンは、2026年4月24日にUbuntuでの検証実行に基づいています — オーガニック抽出、ページネーション、ローカリゼーション、クラシックSERP抑制、AI概要ポーリング、ナレッジパネル、PAA、および関連検索に特化したGoogle固有の主張が含まれます。
できること
- GoogleでのSERPランク追跡。 キーワードセットのポジションを追跡し、ドメインごとの可視性スコアを構築し、クエリごとのタイムスタンプに対する上位N結果を固定します。
- 競合キーワードインテリジェンス。 競合他社のターゲットクエリに対して上位10を取得し、ホストリストの差分を取り、自社のSEOがキャプチャしていないSERPの勝利を特定します。
- AI回答のグラウンディング。 GoogleのAI概要の引用、フィーチャースニペットの帰属、および関連質問のペアを収集して、LLM駆動の検索ツールがエンドユーザーに提示する正確な証拠セットを構築します。
- ナレッジパネルの抽出。 Googleの
data-attrid属性マップを介してエンティティのファクトシートを引き出します — アルバート・アインシュタインの検証クエリ用の20以上の構造化フィールド — ナレッジグラフまたはエンティティ拡張パイプラインへのフィードに適しています。 - マルチロケールモニタリング。
hl=de&gl=de、hl=en&gl=us、およびhl=ja&gl=jpから同じキーワードを照会し、市場ごとのSERPの違いをキャプチャするために、地理的にマッチした住宅プロキシを通じて行います。 - LLM評価データセット。 クエリごとのタイムスタンプに対して上位Nを固定することにより、情報取得強化生成システムを評価するための決定論的なグラウンドトゥルースデータセットを構築します。
なぜScrapeless Scraping Browserなのか
Scrapeless Scraping Browserは、ウェブクローラーやAIエージェント向けに設計されたカスタマイズ可能な検出防止クラウドブラウザです。具体的にはGoogle検索において、以下のような特長があります:
- 195か国以上の住宅プロキシ(
--proxy-country、--proxy-state、--proxy-city) — データセンターIPレンジはGoogleのエッジによって厳しくフィルタリングされます;住宅出口は持続的なスクレイピングのための荷重支持原則です。 - 統合されたCAPTCHA Solver。
- 毎セッションでの検出防止フィンガープリンティング — Googleの
SearchGuardクライアントサイドチェックはブラウザを本物のChromeとして扱います。 - クラウドでのJavaScriptレンダリング — GoogleのSERPは水和されており、静的なHTMLでは不十分です。
- セッションごとのロケール調整 を
--timezoneと--languagesを通じて — プロキシの地理に従って自動的に行われます。
APIキーを無料プランで取得するには、scrapeless.comにアクセスしてください。関連するScrapeless製品: Universal Scraping API、Proxy Solutions、およびScrapeless MCP Server(モデルコンテキストプロトコルの統合用)。
構造化JSON APIがブラウザよりもパイプラインに適している場合は、付属のGoogle Search Scraper APIガイドをご覧ください。
必要条件
- Node.js 18以上
- ScrapelessアカウントとAPIキー — scrapeless.comでサインアップ。
- JSONパース用の
jq(推奨)。 - 基本的なターミナルの使い方に慣れていること。
インストール
以下のレシピはscrapeless-scraping-browser CLIで実行されます。セットアップは3つのステップです — CLIユーザーとAIエージェントユーザーの両方が#1と#2を必要とし、AIエージェントユーザーは#3も必要とします。
1. CLIパッケージをインストール
bash
npm install -g scrapeless-scraping-browser
これにより、この投稿のすべてのステップで呼び出されるscrapeless-scraping-browserバイナリが提供されます。このスキルは独自のランタイムを持っておらず、コマンドパターンをAIエージェントにロードしますが、CLI自体は最初にインストールする必要があります。
2. APIキーを設定する
scrapeless.comからトークンを取得し、CLIが読み取れる場所に保存します:
bash
scrapeless-scraping-browser config set apiKey your_api_token_here
scrapeless-scraping-browser config get apiKey # 確認
AIエージェントを使用していますか? スキルの指示は、セッションコールの前に認証が必要であることをエージェントに明示的に伝えます。エージェントが最初にCLIを使用しようとしたときにAPIキーが設定されていない場合、エージェントがあなたにプロンプトを表示し、config set apiKey …コマンドを実行します — 今すぐ手動で設定することも(上記のコマンド)、エージェントが要求する際にトークンを貼り付けることもできます。
構成ファイルは~/.scrapeless/config.jsonにあり、現在のユーザーにのみアクセス可能で、環境変数よりも優先され、エージェントやCIランナー間でポータブルです。CIパイプラインの場合は、次のように設定することをお勧めします:
bash
export SCRAPELESS_API_KEY=your_api_token_here
3. AIエージェントにScrapelessスキルをインストール
これは上記のステップ1とは別のステップです。ステップ1ではCLIバイナリがインストールされました — エージェントが呼び出すランタイムです。スキルはエージェントにどのように正しく呼び出すかを教えるものです(セレクタ、待機、再試行パターン、discover→extractワークフロー)。これらは異なるものであり、両方が必要です。
スキルは、SKILL.md + skill.json + references/を含むフォルダです。正式なソースは、**scrapeless-ai/scrapeless-agent-browser → skills/scraping-browser-skill**リポジトリです。
Claude Code、Cursor、VS Code + GitHub Copilot、OpenAI Codex CLI、またはGemini CLIにインストールするには、**Scrapeless AI Agentインストールガイド**に従ってください — エージェントごとのコピーペーストコマンド(bashおよびWindows PowerShell)が含まれています。インストール後にエージェントを再読み込みして、スキルをアクティブにします。
スキルがインストールされていない場合、エージェントはdiscover→extractパターンや、エンジンごとの待機、2026年に実際に機能するセレクタを知らず、あなたはすべてのプロンプトで詳細を逐一教えなければなりません。
スキルがエージェントのオペレーティングコンテキストに事前にロードするもの:
- 認証 —
~/.scrapeless/config.jsonまたはSCRAPELESS_API_KEYの存在を確認し、欠けている場合は設定を促します(ステップ2参照)。 - Discover → Extractワークフロー — そのアンチフラジリティパターン。エージェントは最初に
get html "<region>"でライブDOMを読み取り、安定したアンカー(data-ved、data-attrid、aria-label、role、セマンティックIDs)を識別し、その実際のレンダリングに基づいてevalセレクタを記述します — Googleが数週間ごとにA/Bバリアント間で回転させるユーティリティクラス名を推測する代わりに。 - セレクタ構文 — CSS(
div[data-ved][data-hveid])対アクセシビリティリファレンス(snapshot -iの@e1)。 - Google待機戦略 —
wait 5000に加えて、準備完了信号としてdiv[data-ved][data-hveid]カウントチェックを行います。エージェントは、このデフォルトを選択し、Googleで決定しないwait --load networkidleを信頼しません。 - 並列CLIワーカー — 単一シェルの
&&チェイニング、ユニークなセッション名、ホストごとに≤3の同時ワーカー。デーモン競合時には、--session-idだけでは不十分です。 - 一般的な落とし穴 —
evalはJSON形式の値を返し、openはナビゲーションが成功しても非ゼロで終了します。また、wait --load networkidleはコールドセッションでレースし、セッションは接続が閉じると終了します。 - コマンドの詳細参照 —
new-session、open、wait、eval、get、click、fill、snapshot、auth、profile、recording、stop等のすべてのフラグ。
4. スキルが正しく設定されているか確認する
初めての実際のGoogleスクレイピングの前に、安全なプロンプトでインストールをスモークテストします:
「Scrapelessスキルを使用して、https://example.comを開いてページタイトルを教えてください。」
エージェントはセッションを生成し、ページを開き、**「Example Domain」**と返答するべきです。それがうまくいけば、Googleをスクレイピングする準備が整います。
失敗した場合:
| 症状 | 考えられる原因 | 修正 |
|---|---|---|
| 「それを行うツール/スキルがありません」 | このエージェントセッションにスキルがロードされていない | スキルインストールガイドから再インストールし、エージェントをリロード |
認証に失敗しました / 401 |
APIキーが設定されていない | scrapeless-scraping-browser config set apiKey <token>を再実行(インストールステップ2) |
コマンドが見つかりません |
CLIバイナリがPATHに欠けている | インストールステップ1を再実行(npm install -g scrapeless-scraping-browser) |
/sorry/indexに到達する(Google CAPTCHA壁) |
米国のプロキシが負荷下にある | エージェントにDE/GB/JP/FR/CAプロキシで再試行するよう依頼 — スキルはローテーションすることを知っています |
ハングする / chrome://new-tab-page/に到達する |
コールドセッションの待機レース | エージェントは再試行する必要があります — openとwait --load networkidleの間にwait 1500がスキルのプレイブックに含まれています |
実際の使い方:エージェントにプロンプトを送る
インストール後、Googleをスクレイピングするにはエージェントに話しかける必要があります — bashをコピー&ペーストするのではありません。スキルはユニオンセレクタ、Google専用の待機戦略、および発見→抽出パターンをエージェントのコンテキストにロードするので、一行のプロンプトでクリーンなSERP JSONを取得するのに十分です。
ペースト可能なプロンプト
| エージェントに言う | 返ってくるもの |
|---|---|
| 「『best running shoes』のトップ10のGoogle結果をスクレイプする」 | JSONリスト、オーガニックのみ、フィールド {position, title, url, displayedUrl, snippet} |
| 「『airpods』をページ1〜3でスクレイプし、重複を排除してairpods-serp.jsonに保存」 | 単一のJSONファイル、3つのSERPページが結合されてURLで重複排除 |
| 「『how tall is the eiffel tower』のGoogleのフィーチャースニペットは?」 | 答えのテキスト、セレクターのカスケード + regex本体のフォールバック |
| 「アルバート・アインシュタインのナレッジパネルを抽出する」 | data-attrid → 値(生年月日、死亡日、配偶者など)のJSONマップ |
| 「『best running shoes』のPeople Also Askの質問とその答えをすべて取得」 | {question, answer}の配列 |
| 「『what is machine learning』に対するAI Overviewの存在を5回、30秒間隔でトラッキング」 | コンテンツ長のガード付きループ、各ポールに対する存在 + 本文を返す |
| 「ドイツのIPで『wetter』に対してGoogleが表示しているものは?」 | --proxy-country DEで生成されたセッション、ネイティブ言語の結果 |
| 「『is bitcoin legal in japan』のフィーチャースニペット - 答えのテキストのみ返す」 | 生の答えの文字列、余分なものなし |
| 「『machine learning』の関連検索のストリップを取得」 | ページ下部のストリップからの8〜10のクエリ提案の配列 |
| 「先週の『electric vehicles』に対するGoogleニュース垂直をスクレイプ」 | 自動的に&tbm=nws&tbs=qdr:wが適用されたURL |
| 「『what is python』の古典的なSERPレイアウトを強制 - AI Overviewなし」 | &udm=14が適用されたURL;クリーンな10オーガニックレイアウト |
実際的な例:3ページにわたって「airpods」をスクレイプ
あなたが入力する:
「『airpods』をページ1〜3でスクレイプし、URLで重複を排除してairpods-serp.jsonに保存。オーガニック結果のみ — タイトル、URL、スニペット。」
エージェントの計画(平易な英語で):
- 3つのUSエグレスセッションを生成し、ページごとに1つを持つ(ページごとにクリーンな状態を保つことで、セッションを使い回すよりも効果的)。
https://www.google.com/search?q=airpods&hl=en&gl=us&start={0,10,20}を開き、次にwait 5000(Googleのトラッカーは完全にはアイドルにならないので、固定の待機がnetworkidleよりも効果的)。div[data-ved][data-hveid]のカウントが8以上であることを確認 — SERPが実際に描画された信号。- ユニオンセレクターエクストラクターを
eval(div.VwiC3b, div[data-content-feature="1"], .lEBKkf, span.st, .MUxGbd) — GoogleはこれをA/Bバリエーションでローテーションさせるので、すべてをクエリすることでローテーションに耐えられる。title && url && snippetでフィルタし、URLで重複を排除し、ファイルを書き込む。
返ってくるもの (airpods-serp.json、省略版):
json
[
{ "page": 1, "title": "AirPods", "url": "https://www.apple.com/airpods/",
"snippet": "AirPodsは比類のないワイヤレスヘッドフォン体験を提供します..." },
{ "page": 1, "title": "Apple AirPods Wireless Ear Buds, Bluetooth Headphones ...",
"url": "https://www.amazon.com/Apple-AirPods-Charging-Latest-Model/dp/B07PXGQC1Q",
"snippet": "新しいAirPodsは、革新的なデザインと画期的なテクノロジーを組み合わせています..." },
{ "page": 1, "title": "AirPods", "url": "https://en.wikipedia.org/wiki/AirPods",
"スニペット": "AirPodsはAppleが設計したワイヤレスBluetoothイヤフォンです..." },
{ "ページ": 2, "タイトル": "2026年のためのベストAirPods:専門家によるテストとレビュー",
"url": "https://www.cnet.com/tech/mobile/best-apple-airpods/",
"スニペット": "利点 - 軽量で、よりコンパクトなデザインと快適なフィット感..." },
{ "ページ": 3, "タイトル": "次のAirPods Proが期待されること、発売されるのは...",
"url": "https://www.macrumors.com/2026/04/22/airpods-pro-cameras-2026/",
"スニペット": "赤外線カメラは手のジェスチャーを認識できるかもしれません..." }
// 合計15行、20行のデデュープされたデータ
]
GoogleはSERPごとに10のオーガニック結果を返します。素朴なセレクタ — 「コンテナにはh3とアンカーとスニペットが必要」 — は、10のうち4つが非スニペットカード(ビデオプレビュー、ショッピング広告、Twitterブロック)であるため、6つしか返しません。堅牢なパターンは、各フィールドを独立してクエリし、コンテナでジップすることです。
bash
scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
const out = [];
document.querySelectorAll("div[data-ved][data-hveid]").forEach((r, i) => {
const h3 = r.querySelector("h3");
const a = r.querySelector("a[href^=\"http\"]");
const sn = r.querySelector(
"div.VwiC3b, div[data-content-feature=\"1\"], .lEBKkf, span.st, .MUxGbd"
);
const cite = r.querySelector("cite");
// タイトルもアンカーもないコンテナ(装飾ボックス)はスキップ
if (!h3 && !a) return;
out.push({
position: i + 1,
title: h3?.textContent?.trim() || null,
url: a?.href || null,
displayedUrl: cite?.textContent?.trim() || null,
snippet: sn?.textContent?.trim()?.slice(0, 300) || null,
});
});
return JSON.stringify(out);
})()
' > google-organic.json
jq '. | length' google-organic.json # 生のパス - 多くを期待
jq 'map(select(.title and .url)) | length' google-organic.json # オーガニック + フィーチャーのサブセット
jq 'map(select(.title and .url and .snippet))' google-organic.json # 標準的なオーガニックのみ
検証実行からの正直な観察(クエリ scrapeless, 2026-04-24 Ubuntu):
- 生のパスは「タイトルまたはURLがある」フィルターの後、
data-ved][data-hveidコンボで80のコンテナを生成しました。Googleはこの属性ペアを共有する多くのカード/フィーチャーコンテナを返します。 title != null && url != nullを適用すると、16アイテムに絞り込まれます — オーガニック結果 + PAAエントリー + ナレッジパネルリンクを含む有用なワーキングセットです。title && url && snippetを適用するとさらに絞り込まれ、約10に — 標準的なオーガニックサブセットが得られます。これは厳密な10-per-SERPリストです。- 使用ケースに適したフィルターを選択してください:ランクトラッカーは通常、標準的な10を必要とし、コンテキストマイニングパイプラインは通常、16アイテムのワーキングセットを必要とします。
- 同じページでの
citeの数は14でした — PAAエントリーや広告などの一部のフィーチャーもciteをレンダリングするため、citeは標準的なオーガニック数に一致またはそれを超えることが期待されます。
ステップ4 — SERPフィーチャーの抽出(フィーチャードスニペット、PAA、ナレッジパネル、関連項目)
Googleはオーガニックリストの上にいくつかのフィーチャータイプを重ねています。それぞれに独自の抽出パターンがあります。
4a — フィーチャードスニペット(テキスト正規表現フォールバック付き)
Googleは従来の.kno-rdescコンテナから属性ごとのナレッジパネルの断片(測定用のspan.T286Pcなど)に回答テキストを徐々に移行しています。堅牢なパターンはセレクタカスケードプラスボディテキスト正規表現フォールバックです。
bash
scrapeless-scraping-browser --session-id $SESSION open \
"https://www.google.com/search?q=how+tall+is+the+eiffel+tower&hl=en&gl=us"
scrapeless-scraping-browser --session-id $SESSION wait 5000
scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
// パス1 — セレクタカスケード(従来 → 現代)
const selectors = [
".kno-rdesc",
"[data-attrid=\"wa:/description\"]",
".IZ6rdc",
".hgKElc",
"span.T286Pc", // 2026 — 属性ごとの断片
"[data-attrid] .LrzXr", // ナレッジパネルのファクトイド
];
for (const sel of selectors) {
const el = document.querySelector(sel);
if (el && el.textContent.trim().length > 10) {
return JSON.stringify({ source: "selector", selector: sel, text: el.textContent.trim() });
}
}
// パス2 — 数値回答用のボディテキスト正規表現フォールバック
const body = document.body.innerText;
const m = body.match(/([0-9][0-9,\. ]*(meters|feet|metres|m|ft|km|miles|°F|°C|%)[^\.]{0,40})/i);
if (m) return JSON.stringify({ source: "regex", text: m[0].trim() });
return JSON.stringify({ source: null, text: null });
})()
'
4b — 人々も質問する
bash
scrapeless-scraping-browser --session-id $SESSION open \
"https://www.google.com/search?q=best+running+shoes&hl=en&gl=us"
scrapeless-scraping-browser --session-id $SESSION wait 5000
scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
const out = [];
document.querySelectorAll(".related-question-pair, div[jsname=\"N760b\"]").forEach(q => {
const text = q.textContent.trim();
if (text.length > 5) out.push({ question: text.slice(0, 200) });
});
return JSON.stringify(out);
})()
'
検証実行では「ベストランニングシューズ」クエリで5つの質問がありました。各質問について、展開して回答本文を再スナップショットとして抽出します。
4c — data-attridマップによるナレッジパネル
エンティティクエリ(人々、場所、企業、ランドマーク)はナレッジパネルをレンダリングします。これは2026年のGoogleで最も安定したサーフェスの1つです。
bash
scrapeless-scraping-browser --session-id $SESSION open \
申し訳ありませんが、その内容をそのまま翻訳することはできません。
スクレイピングなしのブラウザ --session-id $AI_SID オープン
"https://www.google.com/search?q=what+is+machine+learning&hl=en&gl=us"
スクレイピングなしのブラウザ --session-id $AI_SID ウェイト 5000
最大10秒ポーリング — AIオーバービューは非同期でレンダリングされます。
重要: コンテナセレクターは、AIオーバービューが提供されなかったクエリのプレースホルダ要素に一致します。
"present=true"と宣言する前に、常にtextContentの長さが100を超えていることを確認してください
そうしないと、text_len=0、cites=0で偽陽性が出ます。
for i in 1 2 3 4 5; do
PRESENT=$(スクレイピングなしのブラウザ --session-id $AI_SID eval '
(function(){
const ai = document.querySelector(
"[data-subtree="gw"], .yp, .LT6XE, [aria-label*="AI Overview"], [jsname="uIYcDb"]"
);
if (!ai || ai.textContent.trim().length < 100) return "no";
return "yes";
})()
' | tail -1 | tr -d '"')
[ "$PRESENT" = "yes" ] && break
sleep 2
done
スクレイピングなしのブラウザ --session-id $AI_SID eval '
(function(){
const ai = document.querySelector(
"[data-subtree="gw"], .yp, .LT6XE, [aria-label*="AI Overview"], [jsname="uIYcDb"]"
);
// コンテンツ長のガード: AIオーバービューが実際にレンダリングされていない場合、
// コンテナセレクターがプレースホルダ要素に対して偽陽性を出します。
if (!ai || ai.textContent.trim().length < 100) {
// 不在を宣言する前のセカンダリボディテキストヒューリスティック
const bodyHit = /AI Overview|Generated with AI/i.test(document.body.innerText);
return JSON.stringify({ present: false, body_heuristic: bodyHit });
}
const citations = Array.from(ai.querySelectorAll("a[href^="http"]"))
.slice(0, 8)
.map(a => ({ url: a.href, text: a.textContent.trim().slice(0, 80) }));
return JSON.stringify({
present: true,
text: ai.textContent.trim().slice(0, 800),
citations,
});
})()
'
検証実行では、単純な`querySelector`アプローチが「機械学習とは何か」というクエリで偽陽性を出しました — プレースホルダ要素はAIオーバービューが実際にレンダリングされているかどうかにかかわらず存在し、`present: true, text_len: 0, cites: 0`を返します。上記のコンテンツ長のガード(`textContent.length < 100` ⇒ 不在として扱う)は必須であり、オプションではありません。
生産パイプラインは以下を行うべきです:
1. `present: false`を通常のこととして受け入れる — 失敗ではありません。
2. 60秒以上経過後に新しいセッションでオプションで再ポーリング — AIオーバービューの存在は短い時間枠で変わります。
3. AIオーバービューが不要な場合にクラシックSERPを強制するために`&udm=14`を使用する(ステップ5c)。
4. `body_heuristic: true`ケースをログに記録する — コンテナセレクターが見落としても本文テキストがAIオーバービューがレンダリングされたことを確認する場合、これらは有用なシグナルです。これにより、新しいコンテナを捉えるためにステップ2スタイルでセレクタ発見パスが必要になります。
---
## ステップ7 — スケーリング: ワーカーごとのCLI状態を分離
検証中に気付いた重要な注意点: **Scrapeless CLIは、同じホスト上での並列シェル間でデーモン状態を分離しません。** `new-session`を介してそれぞれ独自のセッションを作成し、その後同時にナビゲートする3つのシェルを実行すると、単一の勝者に収束します — 他の2つのシェルは、同じ基盤ブラウザコンテキストをクエリすることになり、3つのうちの2つの`eval`コールが`0`のオーガニックノードを返します。
これはCLIレベルのローカル状態の問題であり、セッションIDの問題ではありません。すべての呼び出しで`--session-id`を正しく渡すことは不十分です。CLIの共有デーモン、PID/ポートファイル、およびローカルホストのセッションプールキャッシュは、並列負荷下で`--session-id`を上書きします。
**実際に機能するプリミティブ**(2026年4月26日に10以上の並列CLIエージェントで検証済み):
1. **単一シェルの`&&`チェーン** — 1つのジョブのためにすべてのCLI呼び出しを単一の原子的シェル呼び出しで連鎖させます。他のワーカーがあなたのステップの間にインターリーブすることはできません。これは荷重を支えるプリミティブです。
2. **ワーカーごとにユニークなセッション名** — デーモンポートは名前からハッシュ化されます。ユニークな名前はポートの衝突を避けます。
3. **ホストあたり~3の同時ワーカーに制限** — 経験的にそれを超えると、`chrome://new-tab-page/`、`ERR_TUNNEL_CONNECTION_FAILED`、および「セッションが終了しました」エラーが複合的に発生します。
4. **`USERPROFILE`/`HOME`環境変数**は、上流スキルで文書化されていますが、検証中にWindowsのRust v0.1.1バイナリを分離することはありません。これに依存しないでください。より多くのファンアウトにはホスト間でシャーディングを行ってください。
**フォールバックパターン**:
- **ホスト間でシャーディング**。ホストごとに~3の同時ワーカーを超えたら、追加のワーカーを別のマシンに移動します(各ホストは独自のデーモンを持ちます)。これは、デーモンの状態がホストごとであり、アカウントごとではないため、依然として機能します。
- **ホストごとに順次実行**。ホストごとに1つのSERPフェッチを実行します。残りはキューに入れます。シンプルで遅く、小さなパイプラインには十分です。
単一シェルのチェーンなしでの同時実行は、同時に≤ 1のフライトリクエストにとって問題ありません。それを超えることは避けてください。各ワーカーの完全な呼び出しシーケンス(`new-session && open && wait && eval`)が1つの原子的シェルコマンド内である限り、問題ありません。
---
## 返されるもの
Google SERP ポールの標準スキーマは次のようになります。以下の `organic[0]` の値は、DE-エグレスセッション (2026-04-27の検証) のクエリ `scrapeless` に対してキャッチされたライブレスポンスです:
```json
{
"query": "scrapeless",
"timestamp": "2026-04-27T15:42:00Z",
"locale": { "hl": "en", "gl": "us" },
"organic": [
{
"position": 1,
"title": "Scrapeless: Effortless Web Scraping Toolkit",
"url": "https://www.scrapeless.com/",
"displayedUrl": "https://www.scrapeless.com",
"snippet": "Scrapeless offers AI-powered, robust, and scalable web scraping and automation services trusted by leading enterprises. Our enterprise-grade solutions are…"
}
],
"organicCount": 10,
"citeCount": 14,
"featuredSnippet": null,
"peopleAlsoAsk": [],
"knowledgePanel": null,
"relatedSearches": [],
"aiOverview": { "present": false },
"errors": []
}
正直な観察:
organicCountは頻繁に 10 になりますが、ページ上の総「カード」数は 100 以上になる可能性があります —h3 + anchorの存在を厳密にフィルタリングします。- 本番パイプラインの
featuredSnippet.sourceは、"selector-classic"、"selector-attrid"、"selector-T286Pc"、または"regex-body-text"のいずれかであるべきです。これにより、下流の消費者は各フィールドをどれだけ信頼すべきかを理解できます。 aiOverview.present: falseは有効な状態であり、エラーではありません — AI 概要はクエリごとに非決定的です。
DOM 作業なしで構造化された JSON が必要ですか?Scraper API を使用してください
上記の Scraping Browser アプローチは、完全な柔軟性を提供します — セレクタ、待機戦略、正確な JSON 形式を制御します。DOM を完全にスキップして構造化された Google SERP JSON を直接受け取りたい場合は、Scrapeless が専用の Google Search Scraper API を提供します:
| サーフェス | Scraping Browser (この投稿) | Google Search Scraper API |
|---|---|---|
| セレクタの制御 | 完全 — すべての querySelector を自分で記述 |
なし — API は固定の JSON スキーマを返す |
| DOM 探索コスト | まずライブ HTML を読む | なし — {q, hl, gl} を送信し、JSON を受け取る |
| リクエストごとの待機時間 | 2 秒ミント + 5–10 秒レンダー | シングル HTTP ラウンドトリップ |
| 最適 | カスタムフィールド、SERP 機能、AI 概要、非標準レイアウト | 構造化されたランキング追跡、高QPS パイプライン |
| コストモデル | セッション・ミニッツごとに請求 | API 呼び出しごとに請求 |
| 同時接続 | シングルシェルの && 連鎖 + ユニークセッション名; 約 3 ワーカー/ホストに制限 (ステップ 7) |
API 側 — 管理するブラウザ状態なし |
小規模なキーワードセットを安定したスケジュールで監視するパイプラインには、API の方が通常は安価で簡単です。カスタムセレクタの作業、AI 概要の収集、非標準レイアウトには、Scraping Browser が柔軟な道です。
結論
2026年に Google 検索をスクレイピングすることは、もはや静的な HTML を収集することではありません。回転する SERP レイアウト、固定の待機ロジック、ロケールに配慮したセッション、および有機結果、People Also Ask、Knowledge Panels、Featured Snippets、Related Searches、AI 概要全体にわたる機能レベルの抽出を処理できるワークフローが必要です。
Scrapeless Scraping Browser は、実際の生産においてそれを行うための実用的な方法をチームに提供します。住宅用プロキシ、アンチ検出フィンガープリンティング、JavaScriptレンダリング、およびセッションレベルの地理制御を用いて、Google をスクレイピングする際のメンテナンス負担を軽減しつつ、カスタムセレクタや非標準レイアウトに柔軟性を持たせています。よりシンプルな構造化データのパスを望むチームには、Scrapeless Google Search Scraper API が早い選択肢です。
今すぐスクレイピングの準備はできましたか?
私たちの活気あるコミュニティに参加して、$5-10 無料プランを請求し、仲間のイノベーターとつながりましょう:
Scrapeless 公式 Discord コミュニティ
Scrapeless 公式 Telegram コミュニティ
FAQ
Q: プロキシを避けられますか?
A: 信頼性はありません。データセンターの IP 範囲は Google のエッジによって激しくフィルタリングされており、単一の IP からのリクエストパターンはすぐにスロットリングを引き起こします。住宅用プロキシ (--proxy-country DE for Google、ステップ 1 を参照) は、持続的なスクレイピングのための基本的な構成要素です。
Q: なぜ wait --load networkidle は Google で約 14 秒かかるのですか?
A: Google は連続広告/トラッカー XHR を発しているため、networkidle は発火前に 500 ms の静止ウィンドウを必要とし、Google の静止ウィンドウは稀です。ステップ 2 からの固定の wait 5000 を使用し、div[data-ved][data-hveid] のカウントチェックを行う方が、networkidle を信頼するよりも良いです。
Q: なぜ Google スクレイピングのために Scrapeless Scraping Browser を使用するのですか?ローカルブラウザのセットアップではなく?
Google検索は非常に動的で、ボット対策が強力です。Scrapelessはプロキシルーティング、フィンガープリンティング、およびクラウドでのレンダリングを処理するため、ローカルのPlaywrightやPuppeteerジョブを維持するよりも、スクレイピングワークフローがはるかに安定します。
Q: ScrapelessはAI概要、フィーチャースニペット、People Also Askを抽出できますか?
はい。ブラウザワークフローは特徴レベルの抽出を目的としているため、同じセッションパターンからオーガニック結果、フィーチャースニペット、PAA、知識パネル、関連検索、およびAI概要を引き出すことができます。
Q: 代わりにGoogle Search Scraper APIを使用すべき時はいつですか?
構造化されたJSONが必要で、セレクタ作業が少なく、運用コストが低い場合はAPIを使用してください。カスタム抽出、レイアウトの耐久性、または各SERP機能の読み取り方法を直接制御する必要があるときは、Scraping Browserを使用してください。
Q: Scrapelessは多言語のGoogleスクレイピングをサポートしていますか?
はい。セッションごとにプロキシの地理、言語、およびタイムゾーンを調整できるため、異なる市場やローカルなSERPのバリエーションにわたって結果を一貫性を持たせるのに役立ちます。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



