競合の価格データを取得しようとしたとき、多くのエンジニアが最初にぶつかる壁があります。GoogleのContent API for Shoppingは、マーチャント自身の商品データのみを返し、競合他社の価格や在庫状況にはアクセスできません。つまり、競合分析や価格モニタリングを実装するには、Google Shoppingの検索結果ページ(SERP)を直接スクレイピングするしか方法がありません。本記事では、2026年にGoogle Shoppingの価格をスクレイピングするための実践的な手法を解説します。
Google Shoppingの価格スクレイピングで知っておくべき技術的背景
Google Shoppingは、tbm=shopパラメータ付きの検索URLで商品結果を返します。基本的なURLパターンは以下の通りです。
https://www.google.com/search?tbm=shop&q=iphone+15+pro&gl=us&hl=en
このURLにアクセスすると、Googleは商品結果を含むHTMLを返します。しかし、ここには大きな課題があります。Googleは強力なアンチボット技術を組み合わせており、無対策でのスクレイピングは数リクエストでブロックされます。
Googleのアンチボットスタック
Google Shoppingのスクレイピングを困難にしている主な要素は以下の通りです。
- reCAPTCHA / hCaptcha — 不審なトラフィックを検知すると、CAPTCHAチャレンジページにリダイレクトします。
- sorry/indexリダイレクト — Googleは不審なIPを
https://www.google.com/sorry/indexにリダイレクトし、自動化されたリクエストをブロックします。 - IPベースのレート制限 — 同一IPから短時間に多数のリクエストを送ると、HTTP 429または302リダイレクトが返されます。Googleは明示的なレート制限閾値を公開していませんが、実験的に1IPあたり約50〜100リクエスト/時間を超えるとブロックが始まることが報告されています。
- ブラウザフィンガープリンティング — User-Agent、Accept-Language、TLSフィンガープリントなどが人間のブラウザと一致しない場合、フラグが立てられます。
これらの対策を回避するには、信頼できるプロキシインフラが不可欠です。詳細はWebスクレイピングのユースケースを参照してください。
URLパターンとCSSセレクタの実解説
Google ShoppingのSERP HTMLは頻繁に変更されますが、2025年末時点で確認されている主要なセレクタを紹介します。
検索結果ページの構造
| 要素 | CSSセレクタ | 内容 |
|---|---|---|
| 商品結果コンテナ | .sh-dgr__content | 個別商品カードのルート |
| 商品結果リスト | .sh-pr__product-results | 商品リスト全体のラッパー |
| 商品タイトル | h3(コンテナ内) | 商品名とリンク |
| 価格 | .a8Pemb または span[aria-label*="$"] | 表示価格 |
| 販売者名 | .sh-dgr__merchant-info | 出品者/ストア名 |
| 評価 | span[aria-label*="rated"] | 星評価スコア |
商品詳細ページの構造
商品カードのリンクをたどると、/shopping/product/パスの詳細ページに移動します。
https://www.google.com/shopping/product/1/reviews?q=iphone+15+pro
詳細ページには、複数販売者のオファーパネル(.sh-dgr__offer-card)があり、各販売者の価格・送料・在庫状況が表示されます。競合価格分析では、このオファーパネルから全販売者の価格を抽出することが重要です。
注意: GoogleはHTMLのクラス名を定期的に難読化・変更します。本記事のセレクタは2025年末時点のものです。本番環境では、セレクタの変更を検知するテストを必ず実装してください。
ローカライズされた価格と住宅プロキシの必要性
Google Shoppingの価格は、ユーザーの地理位置によって大きく異なります。米国のショッパーにはUSD価格の米国販売者が表示され、ドイツのショッパーにはEUR価格のEU圏販売者が表示されます。これは単なる通貨変換ではなく、表示される販売者自体が異なることを意味します。
正確な地域別価格データを取得するには、以下の2つを組み合わせる必要があります。
- URLパラメータ:
gl(地域)とhl(言語)をターゲット地域に合わせる - 住宅プロキシのジオターゲティング: リクエスト元IPをターゲット地域に一致させる
ProxyHatでは、ユーザー名にジオターゲティングフラグを指定できます。米国の価格を取得する場合と、ドイツ・ベルリンの価格を取得する場合の比較:
# 米国の価格を取得
http://user-country-US:pass@gate.proxyhat.com:8080
# ドイツ・ベルリンの価格を取得
http://user-country-DE-city-berlin:pass@gate.proxyhat.com:8080
これにより、gl=us&hl=enのリクエストが米国の住宅IPから送信され、gl=de&hl=deのリクエストがドイツの住宅IPから送信されます。GoogleはIPの地理的位置とURLパラメータの整合性をチェックするため、両方が一致していることが成功率の向上に直結します。利用可能なロケーションはプロキシロケーション一覧で確認できます。
Pythonで実装するGoogle Shopping価格スクレイピング
実際の実装例を見ていきましょう。以下はProxyHatのゲートウェイ経由でGoogle ShoppingのSERPを取得し、商品タイトル・価格・販売者名・評価をパースするPythonスクリプトです。
import requests
from bs4 import BeautifulSoup
import time
import random
# ProxyHatゲートウェイ設定
PROXY_URL = "http://user-country-US:YOUR_PASSWORD@gate.proxyhat.com:8080"
proxies = {
"http": PROXY_URL,
"https": PROXY_URL,
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
}
def scrape_google_shopping(query, gl="us", hl="en"):
url = f"https://www.google.com/search?tbm=shop&q={query}&gl={gl}&hl={hl}"
try:
resp = requests.get(url, proxies=proxies, headers=headers, timeout=30)
# ソフトブロック検知
if resp.status_code == 429:
print("Rate limited. Backing off...")
time.sleep(random.uniform(60, 120))
return None
if "sorry/index" in resp.url:
print("Soft block detected (sorry redirect). Rotating session...")
return None
soup = BeautifulSoup(resp.text, "html.parser")
results = []
containers = soup.select(".sh-dgr__content")
for container in containers[:5]: # 最初の5件のみ(例示)
title_el = container.select_one("h3")
price_el = container.select_one(".a8Pemb")
merchant_el = container.select_one(".sh-dgr__merchant-info")
rating_el = container.select_one("span[aria-label*='rated']")
results.append({
"title": title_el.get_text(strip=True) if title_el else None,
"price": price_el.get_text(strip=True) if price_el else None,
"merchant": merchant_el.get_text(strip=True) if merchant_el else None,
"rating": rating_el.get("aria-label") if rating_el else None,
})
return results
except requests.RequestException as e:
print(f"Request failed: {e}")
return None
# 実行例
data = scrape_google_shopping("iphone 15 pro 128gb")
if data:
for item in data[:3]:
print(f"Title: {item['title']}")
print(f"Price: {item['price']}")
print(f"Merchant: {item['merchant']}")
print(f"Rating: {item['rating']}")
print("---")
実行結果の例(切り詰め版):
Title: Apple iPhone 15 Pro 128GB - Titanium Blue
Price: $899.00
Merchant: Best Buy
Rating: Rated 4.7 out of 5
---
Title: Apple iPhone 15 Pro 128GB (Unlocked)
Price: $949.99
Merchant: Amazon
Rating: Rated 4.6 out of 5
---
SOCKS5プロキシの使用
より高い匿名性が必要な場合は、SOCKS5プロトコルを使用できます。
SOCKS5_PROXY = "socks5://user-country-US:YOUR_PASSWORD@gate.proxyhat.com:1080"
proxies = {
"http": SOCKS5_PROXY,
"https": SOCKS5_PROXY,
}
ページネーション・バッチ処理・遅延戦略
ページネーション
Google ShoppingのSERPは、startパラメータでページネーションを制御します。
https://www.google.com/search?tbm=shop&q=iphone+15+pro&gl=us&hl=en&start=20
startは0から始まり、20件単位で増加します。ただし、Google Shoppingは通常40〜60件程度で結果が尽きるため、深いページネーションは不要な場合が多いです。
バッチ処理とランダム遅延
複数キーワードをスクレイピングする場合、以下のベストプラクティスを推奨します。
- リクエスト間隔: 各リクエスト間に
random.uniform(3, 8)秒のランダム遅延を入れる - セッションローテーション: ProxyHatの
sessionフラグで5〜10リクエストごとに新しいIPに切り替える - バッチサイズ: 1バッチあたり最大50キーワードとし、バッチ間に10〜15分の休止を入れる
- 時間帯分散: ピーク時間を避け、現地時間の深夜〜早朝に実行する
# セッションローテーションの例
import uuid
session_id = str(uuid.uuid4())[:8]
PROXY_URL = f"http://user-country-US-session-{session_id}:YOUR_PASSWORD@gate.proxyhat.com:8080"
ソフトブロックの検知
ハードCAPTCHAに到達する前に、以下のソフトブロック兆候を検知して対処することが重要です。
| 兆候 | HTTPステータス/内容 | 対処 |
|---|---|---|
| レート制限 | HTTP 429 | 60〜120秒のバックオフ |
| Sorryリダイレクト | URLに sorry/index 含む | セッションを新規作成 |
| 空の結果 | 200だが .sh-dgr__content が0件 | IP/セッションを変更してリトライ |
| CAPTCHAページ | HTMLに recaptcha 含む | 即座に停止、IPを完全変更 |
倫理と利用規約の考慮
Google Shoppingのスクレイピングには法的・倫理的配慮が伴います。
- 公開データのみ: ログイン不要で誰でも閲覧できる商品ページの価格データのみを対象とする
- robots.txtの尊重: Googleのrobots.txtを確認し、許可されていないパスは回避する
- CFAA/GDPRの注意: 米国のComputer Fraud and Abuse ActやEUのGDPRに抵触する可能性がある。自動化アクセスの頻度を抑え、個人データの収集を避ける
- 利用規約: Googleの利用規約は自動化されたアクセスを制限している。商用利用の規模が大きい場合は、Googleの公式SERP APIパートナー(Custom Search APIなど)の利用を検討する
規模が小さい競合分析や研究目的であれば、プロキシ経由のスクレイピングは実用的なアプローチです。ただし、本番の商用システムでは、Googleの公式APIや認可パートナー経由のデータ取得が最も安全な選択肢です。
ProxyHatのセットアップとベストプラクティス
ProxyHatの公式ドキュメントに従って、アカウントを作成しプロキシ認証情報を取得します。実装のポイント:
- プロキシタイプの選択: Google Shoppingスクレイピングには住宅プロキシを推奨。データセンタープロキシはGoogleにフラグ付けされやすい。
- ジオターゲティング:
-country-US、-country-DE-city-berlinでターゲット地域を指定。 - スティッキーセッション:
-session-abc123で同一IPを維持し、ページネーションの一貫性を確保。 - エラーハンドリング: 429・sorry/index・空結果の3パターンを必ずハンドリング。
- モニタリング: 成功率が90%を下回ったらプロキシ設定とセッション戦略を見直す。
料金プランや利用可能なプロキシタイプの詳細はProxyHatの料金ページを参照してください。SERPトラッキングの具体的なユースケースについてはSERPトラッキングのページも併せてご確認ください。
主要なポイント(Key Takeaways)
- Content API for Shoppingは自社商品のみ対応。競合価格データには
tbm=shopSERPのスクレイピングが必要。 - GoogleのアンチボットはreCAPTCHA、sorry/indexリダイレクト、IPレート制限の3層構造。1IPあたり約50〜100リクエスト/時間が実質的な上限。
- 地域別価格の正確な取得には、
gl/hlパラメータと住宅プロキシのジオターゲティングを一致させる必要がある。 - セレクタ(
.sh-dgr__content、.a8Pembなど)は頻繁に変更されるため、セレクタ監視テストを必ず実装する。 - ソフトブロック(429・sorry/index・空結果)を早期検知し、ハードCAPTCHA到達前にIP/セッションをローテーションする。
- 商用規模が大きい場合は、Google公式APIパートナーの利用を検討する。プロキシスクレイピングは小〜中規模の競合分析に適している。
FAQ
Google Shoppingの価格スクレイピングとは何ですか?
Google Shoppingの価格スクレイピングとは、tbm=shopパラメータ付きのGoogle検索結果ページから、商品タイトル・価格・販売者名・評価などの商品データをプログラムで抽出する手法です。Content API for Shoppingでは競合商品データにアクセスできないため、SERP HTMLをパースするアプローチが一般的です。
Google Shoppingのスクレイピングでプロキシがなぜ重要なのですか?
GoogleはIPベースのレート制限とアンチボットシステム(reCAPTCHA、sorry/indexリダイレクト)を実装しており、単一IPから数十分内に多数のリクエストを送るとブロックされます。住宅プロキシでIPをローテーションすることで、各リクエストが異なるIPから送信され、ブロックを回避できます。ProxyHatのセッション機能を使えば、ページネーション中は同一IPを維持しつつ、キーワードごとにIPを切り替える制御が可能です。
どのプロキシタイプがGoogle Shoppingスクレイピングに最適ですか?
住宅プロキシ(Residential Proxy)が最適です。データセンタープロキシのIP範囲はGoogleに既知であり、フラグ付けされる可能性が高いです。住宅プロキシは実際のISPから割り当てられたIPを使用するため、Googleのアンチボットフィルターを通過しやすくなります。さらに、都市レベルのジオターゲティング(-country-DE-city-berlinなど)により、地域別の正確な価格データを取得できます。
Google Shoppingのスクレイピングでブロックを回避するにはどうすればよいですか?
主な対策は4つです。(1) リクエスト間に3〜8秒のランダム遅延を入れる、(2) 5〜10リクエストごとにセッションをローテーションして新しいIPに切り替える、(3) HTTP 429やsorry/indexリダイレクトを検知したら即座にバックオフする、(4) User-AgentやAccept-Languageヘッダーを人間のブラウザに近づける。これらを組み合わせることで、成功率90%以上を維持できます。






