Googleショッピング価格のスクレイピング方法:オファー、販売者、地理データ

Googleショッピングは数千の販売者から価格を集約し、一箇所にまとめています。ここでは、そのショッピング垂直を信頼できる構造化された地理対応の価格フィードに変える方法を紹介します。

Googleショッピングはウェブ上で最大の価格集約サイトの一つです。特定の商品について、数千の販売者からライブオファー、価格、販売者の詳細を一つのランク付けされたビューにまとめます。それにより、価格インテリジェンスのための非常に効率的な情報源となります。1つのクエリで、今どの小売業者が何を請求しているかを表面化します。このガイドでは、Googleショッピングの価格をクリーンにスクレイピングする方法、地理がすべてを変える理由、ブラウザを手作業で構築するのをやめて構造化されたAPIを呼び出すべき時について説明します。

ショッピング垂直が実際に提供するもの

ショッピングタブはGoogle検索のtbm=shop垂直です。各商品カードには、タイトル、価格、販売者名、星評価とレビュー数、同じ商品の複数のオファーをグループ化する製品識別子が含まれています。価格作業において、その販売者と価格のペアリングは金鉱です。1つのSKUに対する小売業者間の広がりを監視し、誰が誰を下回っているかをキャッチし、価格の動きを時間と共に追跡できます - 再価格設定やMAP監視ワークフローの原材料です。

URL構造は簡単です。結果はstartオフセットで10件ずつページネーションされ、出口の国はglで設定されます。

# Google Shopping search URL, page 1, US results
https://www.google.com/search?q=wireless+earbuds&tbm=shop&gl=us

# Page 2 (results 11-20): add a start offset
https://www.google.com/search?q=wireless+earbuds&tbm=shop&gl=us&start=10

なぜ場所が答えを決めるのか

ショッピング結果はローカライズされています。価格は現地通貨で表示され、販売者の構成は市場によって変わり、在庫状況も異なります。glパラメータだけでは不十分で、Googleはリクエスト元のIPの位置も考慮します。米国のデータセンターIPからドイツの結果を要求すると、一貫性のない、部分的に米国の回答が得られます。ベルリンのショッパーが実際に見るカタログを読むには、ドイツの住宅IPからリクエストを終了する必要があります。200以上の国をカバーする住宅プロキシプールを使用すると、価格を設定する各市場に出口を固定できます。これは、大規模な競合価格監視の背後にある同じ手法です。

DIYブラウザスクレイピングとGoogleショッピングデータ収集のためのSERP APIの比較図
DIYルートは機能しますが、クッキーの壁、壊れるセレクタ、永遠のリトライを引き継ぎます。

DIYルート(とそのコスト)

ヘッドレスブラウザを使用してページを直接スクレイピングできます。Googleショッピングは動的にレンダリングされ、よく守られているため、通常のHTTPリクエストでは不十分です。実際のブラウザエンジン、各リクエストのプロキシ、製品がロードされる前にクッキー同意の壁(悪名高いbutton#L2AGLb「すべて受け入れる」)を解消するコードが必要です。その後、CSSと戦います:ショッピングのコンテナクラス名は難読化され、回転するため、今日動作するセレクタは2週間で壊れます。リトライロジック(ランダム化されたバックオフで3回の試行が妥当な最低限)を追加すると、動作するスクレイパーが完成し、永続的なメンテナンス作業が発生します。

# Sketch of the DIY approach with Playwright + proxy
from playwright.sync_api import sync_playwright

PROXY = {"server": "http://gate.quantumproxies.io:8000",
         "username": "USER", "password": "PASS"}
URL = "https://www.google.com/search?q=wireless+earbuds&tbm=shop&gl=us"

with sync_playwright() as pw:
    browser = pw.chromium.launch(proxy=PROXY, headless=True)
    page = browser.new_context(locale="en-US").new_page()
    page.goto(URL, wait_until="networkidle", timeout=15000)
    # dismiss the consent wall before products render
    for sel in ("button#L2AGLb", "button:has-text('Accept all')"):
        btn = page.locator(sel).first
        if btn.is_visible():
            btn.click(); break
    # ...then wrestle the obfuscated product containers
    browser.close()

APIルート:1回の呼び出しで構造化されたJSON

代替案として、SERP APIにブラウザ、プロキシ、パースを任せ、ショッピング垂直をJSONとして受け取ることができます。クエリと国を渡すと、タイトル、価格、販売者、評価、製品IDがすでに抽出されたオファーが返されます。クッキーの壁もセレクタのメンテナンスもなく、地理はパラメータとして扱われます。継続的に稼働する必要がある価格フィードにとって、その取引は通常正しい選択です。2026年におけるSERPスクレイピングの仕組みの内訳では、なぜ生のHTMLパスがますます困難になるのかを説明しています。

# One request to the SERP API's Google Shopping vertical
curl -G "https://api.quantumproxies.io/v1/serp" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "engine=google_shopping" \
  --data-urlencode "q=wireless earbuds" \
  --data-urlencode "gl=us"
import requests

def shopping_offers(query, country="us"):
    r = requests.get(
        "https://api.quantumproxies.io/v1/serp",
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        params={"engine": "google_shopping", "q": query, "gl": country},
        timeout=30,
    )
    r.raise_for_status()
    rows = []
    for p in r.json().get("shopping_results", []):
        rows.append({
            "title":  p.get("title"),
            "price":  p.get("price"),
            "seller": p.get("source"),   # merchant name
            "rating": p.get("rating"),
            "pid":    p.get("product_id"),
        })
    return rows

for country in ("us", "gb", "de"):
    print(country, shopping_offers("wireless earbuds", country)[:3])
クエリセットから地理対応のSERP APIを経由して解析されたオファーと価格履歴ストアへのパイプライン図
価格フィードはループです:クエリ、地理対応のSERP呼び出し、オファーの解析、動きのストアとアラート。

単一のオファーが実際に含むもの

パイプラインをスケールする前に、1つの製品カードの形状を理解することは有益です。見出しの価格を超えて、各オファーには販売者名、アイテムの状態(新品、中古、再生品)、配送と税のヒント、星評価とレビュー数、Googleが同じアイテムのすべての販売者を1つのエントリにクラスタリングするために使用する製品IDが含まれています。その製品IDは、すべての下流の結合キーです:それを基にオファーをグループ化し、販売者間で同等の比較を行い、1つのSKUの価格を時間と共に追跡し、新しい販売者がリストに入る瞬間や既存の販売者が消える瞬間を検出できます。

価格作業において特に注意が必要な2つのフィールドがあります。販売者名は、販売者ごとのビューを構築するのに役立ちます - 誰が一貫して価格を下回っているのか、誰が高値を固定しているのか、誰がプロモーションにのみ登場するのか - これは匿名の価格クラウドよりもはるかに実用的です。評価は粗い信頼重みを提供するため、1レビューの再販業者を確立された小売業者と同等に扱うことはありません。価格と通貨と共に両方をキャプチャすると、単なる価格フィードでは答えられない質問にデータセットが答えます。

オファーをインテリジェンスに変える

生のオファーはインテリジェンスではありません - ループがそうです。クエリセットをスケジュールに従って実行し、各キャプチャをタイムスタンプと共に保存し、履歴と比較して重要なものを表面化します:競合他社があなたの価格を下回る、新しい販売者がSKUに参加する、活用できる在庫切れ。製品IDでオファーをグループ化し、同じアイテムの販売者を同等に比較し、ターゲット市場ごとにセット全体を実行します。これに基づいてツールを構築する場合、SERP APIの選択に関する私たちのノートでは、JSONの形状とクエリごとのコストの質問が大量の単位経済を決定する方法をカバーしています。

SERP APIでGoogleショッピングデータを取得

よくある質問

PythonでGoogleショッピングをどのようにスクレイピングしますか?

2つのパスがあります。ヘッドレスブラウザ(Playwright)を住宅プロキシ経由で駆動し、クッキー同意の壁を解消し、製品コンテナを解析します - 柔軟ですが、マークアップが難読化され変化するため、メンテナンスが多くなります。または、SERP APIのgoogle_shoppingエンジンをクエリと国コードで呼び出し、1回のリクエストで解析されたオファーをJSONとして受け取ります。APIパスは維持するコードがはるかに少なくて済みます。

Googleショッピングデータは国によって変わりますか?

はい、大幅に変わります。通貨、販売者のセット、価格、在庫状況はすべて市場によって異なります。glパラメータは国を要求しますが、Googleはリクエスト元のIPも考慮するため、正確なローカライズされた結果にはターゲット国の出口IPが必要です。価格を設定する各市場ごとに住宅IPにリクエストを固定します。

Googleショッピングのスクレイピングは合法ですか?

公開されている価格やオファーを収集することは価格インテリジェンスの一般的な慣行ですが、ソースの利用規約や個人データに関する規則は依然として適用されます。これは法的助言ではありません。公開された製品データに従い、レート制限を尊重し、特定の使用について不明な場合は、相談を受けてください。不要な個人情報を収集または保存しないでください。

ショッピング価格をどのくらいの頻度でスクレイピングすべきですか?

カテゴリの動きの速さによります。動きの速い電子機器やチケット商品は毎時のキャプチャが必要かもしれませんが、安定したカテゴリは日次で問題ありません。価格の変動に合わせてペースを調整し、すべてのキャプチャにタイムスタンプを押して履歴を構築し、IPと時間を分散させて、礼儀正しく低リスクな訪問者であり続けてください。

Googleショッピングは市場全体の価格を1つのクエリ可能な表面に凝縮します。自分でレンダリングするか、構造化されたJSONのためにAPIを呼び出すかにかかわらず、勝利のパターンは同じです:すべての市場を地理ターゲットにし、スケジュールに従ってキャプチャし、履歴と比較します。それは一度きりのスクレイプではなく、価格インテリジェンスエンジンです。

SERP APIから構造化されたショッピングJSONを取得