当社独自のアクセス統計は常に有効です。Google Analyticsは、公開ページ(ログイン後のワークスペースは対象外)の利用状況を把握するためのもので、許可をいただいた場合のみ有効になります。詳しくは プライバシーポリシーをご覧ください。

Googleマップのレビューをスクレイピングする方法:Places API、Python、データAPI

Places APIが返すレビューは1スポットあたり最大5件です。3つの方法を検証し、1,000件あたりの費用を算出したうえで、PythonのCSVエクスポーターを公開します。

マップピンが立つ街区のアイソメトリックイラスト。店舗からレビューカードが浮かび上がり、ティール色のコンベヤーに乗ってトレイへ運ばれます。トレイは、整理された1つのレビュー表を表しています。

テキサス州オースティンのある歯科医院は、Googleマップ上で星4.6の評価を表示しています。しかし最新200件のレビューの平均は4.305で、そのうち13%が星1つです。公式のPlaces APIではこの差はわかりません。返されるレビューは1スポットあたり最大5件で、しかも関連度順に選ばれるからです。2026年11月2日、Googleマップのビジネス情報とレビューを取得する3つの方法を検証しました。公式のPlaces API、自作のPythonスクレイパー、従量課金のデータAPIです。本ガイドでは、それぞれの方法で何が取得できるか、1,000件あたりの費用、それぞれの方法の限界を解説します。

ひとつの街区へ続く3本の道のイラスト。料金所、工事中の道路、そしてレビューカードを運ぶティール色のコンベア。
公式APIには上限があり、自作スクレイパーには保守が必要で、従量課金APIはリクエストごとに課金されます。

レビューデータの重要性は月を追うごとに高まっています。2026年10月8日、Googleはレビュー、評価、経路検索リクエストをもとにした初のFan-Favorite Dining Listsを公開しました[18]。2026年10月21日には、Google MapsがApple CarPlayでGeminiとの会話に対応しました[19]。Search Engine LandはGoogleの数値を引用し、Ask Mapsは500M人以上の投稿者によるレビューを利用できると伝えています[20]。

AIにレビューを読ませて答えを得る人が増えています。そのため、AIがどのレビューを読むのか、そして最近のレビューに何が書かれているのかが重要になります。本ガイドで最新順のレビューと関連度順のレビューを分けて扱うのはそのためです。

必要なデータの明確化

Googleマップのスクレイピング方法を調べる人が求めるものは、人によって大きく異なります。営業チームは、ある都市圏にあるすべての歯科医院の名前、電話番号、Webサイト、評価を求めています。フランチャイズのオーナーは、苦情にすばやく対応するために、40店舗のすべてのレビューを求めています。プロダクトチームは、競合の前四半期の星1つのレビューを求めています。

研究者は、ある地区にある500軒のレストランの評価の分布を求めています。ビジネスの一覧が必要なのは最初のケースだけです。残りの3つにはレビューが必要で、レビューの件数、期間、そして掲載情報のオーナーが誰かによって、どの方法が使えるかが決まります。

そこで、料金を比較する前に3つの質問に答えてください。1つ目は、1か所あたり何件のレビューが必要で、5件で足りるかどうかです。2つ目は、対象の場所が自社の確認済みGoogleビジネスプロフィールのロケーションかどうかです。3つ目は、ブラウザ型スクレイパーとプロキシプールを何年にもわたって保守する意思のある人がチーム内にいるかどうかです。下のフローチャートでは、この3つの質問に基づいて方法を振り分けています。続く各セクションでは、実際にリクエストを送信するか、公式ドキュメントを1行ずつ確認することで、それぞれの方法を検証します。

フローチャート。左側にある3つの質問ボックスは、1か所あたり5件のレビュー、掲載情報の所有、スクレイパーの保守について尋ねています。それぞれ「はい」の場合は右へ進み、公式のPlaces API、Business Profile API、またはDIYのPythonスクレイパーを指します。3つすべて「いいえ」の場合は、ティール色の矢印に沿って、呼び出しごとに課金されるデータAPIへ進みます。

多くのチームが見落としているため、このチャートにはBusiness Profile APIも含めています。Googleは確認済みロケーションのオーナー向けに、すべてのレビューを一覧できるAPIを提供しています[11]。評価または更新日時で並べ替えられ、1ページあたり最大50件のレビューを取得できます[12]。OAuthによる同意と確認済みのロケーションが必要です。

競合のレビューは読めません。下の表は4つの方法を並べて比較したものです。各セルの内容は、このガイドの後半でテストまたは確認する事実です。

方法1か所あたりのレビュー数並び順とページング1,000レビューあたりのコスト主なコスト
公式Places API(Place Details)最大5件関連度順のみ、ページングなし無料枠内は$0、超過後は約$5.00固定上限、投稿者情報の表示が必須
Business Profile API自社の拠点なら全件評価順または更新日時順、1ページ50件$0自社の確認済みロケーションのみ
Pythonとブラウザによる自作ページに表示される内容スクロールのシミュレーションサーバーとプロキシは別途ページの変更、規約違反のリスク
EveryInfraのデータAPI並び順ごとに400件、1回の呼び出しで100件新着順または関連度順、ページトークン1回あたり100件で$0.01389呼び出しごとに課金、200件以降は非同期

方法1:公式Places APIで得られるもの

まずはGoogle自身のAPIから見ていきます。Places API (New)では、Placeリソースにreviewsフィールドがあります。リファレンスでは、この場所に関するレビューのリストで、関連度順に並べられると説明されています。また、返されるレビューは最大5件とも書かれています[1]。この上限は料金ティアによって変わりません。レビュー用のページトークンもありません。該当する行のスクリーンショットを撮り、青緑色の枠で示しました。

Google Maps PlatformのPlaces APIリファレンスページのスクリーンショット。Placeリソースのフィールド一覧で、reviewsの行が青緑色の枠で示されています。リストは関連度順に並べられ、返されるレビューは最大5件と書かれています。
Places APIリファレンスのスクリーンショット(2026年11月2日に閲覧)。reviewsフィールドには、関連度順で最大5件と書かれています。 Google Maps Platformのドキュメント

リクエストはシンプルです。Place Details (New)は、パスにプレイスIDを、ヘッダーに必須のフィールドマスクを指定するGETリクエストです[2]。フィールドマスクによって、取得するフィールドをGoogleに伝えます。以下は公式ドキュメントに基づく設定例です。GoogleのAPIキーを使った実行はしていません。

bash
# Configuration example (not run): rating, review count and up to 5 reviews for one place
curl -s "https://places.googleapis.com/v1/places/ChIJl6T2cnbMRIYR7eD538S3oWU" \
  -H "X-Goog-Api-Key: $GOOGLE_MAPS_API_KEY" \
  -H "X-Goog-FieldMask: displayName,rating,userRatingCount,reviews"

請求額はフィールドマスクで決まります。Googleは各リクエストを、マスクに含まれるフィールドのうち最も高いSKUの料金で課金します。reviewsフィールドはPlace Details Enterprise + Atmosphere SKUに属するため、レビューを要求するリクエストはすべてその料金になります[3][5]。2025年3月1日、Googleは従来の月額$200のクレジットを廃止し、SKUごとの無料利用枠に切り替えました。

無料枠は毎月、EssentialsのSKUが10,000回、Proが5,000回、Enterpriseが1,000回です[4]。料金表は2026年11月2日に確認しました。請求の概要ページには、最終更新日が2026-10-30と記載されています[4]。表には、このガイドに関係する行の料金を、1,000リクエストあたりの米ドルで示しています。

SKU(Places API New)毎月の無料枠100Kまで100K〜500K500K〜1M1M〜5M5M超
Place Details Pro5,000$17.00$13.60$10.20$5.10$1.28
Place Details Enterprise1,000$20.00$16.00$12.00$6.00$1.51
Place Details Enterprise + Atmosphere(レビューを含む)1,000$25.00$20.00$15.00$7.50$2.28
Text Search Pro5,000$32.00$25.60$19.20$9.60$2.40
Text Search Enterprise + Atmosphere1,000$40.00$32.00$24.00$12.00$3.40

この表によると、Place Detailsの呼び出しは1回$0.025で、得られるレビューは最大5件です。最初の有料ティアでは、1,000レビューあたり$5.00になります。月500万回を超えると料金は1,000回あたり$2.28に下がりますが、それでも1,000レビューあたり$0.456です。無料枠も重要です。毎月1,000か所からそれぞれ5件のレビューを取得するだけなら、公式APIは無料で使えます。このケースは、公式APIのほうが適している場合を扱うセクションで改めて取り上げます。

対数目盛の横棒グラフ。1,000件のレビューあたりの費用(米ドル)を示しています。Places APIの最初の有料ティアは$5.00、5M回を超える呼び出しのティアは$0.456です。1回の呼び出しで100件のレビューを取得するEveryInfraのレビュー呼び出しは$0.01389で、ティール色で強調表示されています。

保存や表示ができる内容は、3つの利用ルールによっても決まります。第1に、Places APIのポリシーでは、各レビューに投稿者の帰属情報(写真、名前、プロフィールリンク)を表示する必要があります[7]。第2に、プレイスIDは長期間保存できますが、それ以外のほとんどのコンテンツはキャッシュできません。つまり、公式APIの結果から独自の長期レビューデータベースを構築することはできません[7]。また、Googleは保存してから12か月を超えたプレイスIDを更新するよう求めています[8]。第3に、レビューの並び順は常に関連度順です。

この3つ目のルールは、開発者フォーラムで最もよく見かける不満です。2016年のStack Overflowの質問では、Places APIから5件を超えるレビューを取得する方法が尋ねられています[39]。2019年の質問では、最新のレビューを取得する方法が尋ねられています[40]。どちらのスレッドも、同じ5件の上限に行き着いています。Redditのr/learnpythonのスレッドでも、初心者の立場から同じことが質問されています[41]。新しいAPIバージョンになっても、答えは変わっていません。

2025年5月8日以降、Places APIはGeminiが作成したレビューの要約も返せるようになりました[9][10]。要約は生データではないため、そこから星の数を集計することはできません。

方法2:Pythonで自作するスクレイパーとその限界

PythonでGoogle Mapsをスクレイピングする方法を紹介するチュートリアルの多くは、requestsとBeautifulSoupから始めます。私たちは2026年11月2日00:19:50(SGT)に、その最初のステップを試しました。Python標準ライブラリを使って、シンガポールのレストランのMapsページに通常のHTTP GETを1回送信しました。ステータスは200で、ページは210,679バイト、scriptタグは12個でした。

タイトルは「Google Maps」だけでした。レストラン名は、送信したURLがそのまま反映された箇所にしか現れませんでした。8,226件というレビュー数はページにありませんでした。APIから取得した20件のレビューの抜粋も、1件もページに含まれていませんでした。

つまり、レビューはブラウザでページのJavaScriptが実行された後にしか読み込まれません。自作スクレイパーでは、Playwrightなどを使ったブラウザ自動化が必要です[37]。以下のコード例は一般的な構成を示しています。プレイスページを開き、「レビュー」タブをクリックし、レビューパネルをスクロールして、ページ要素からテキストを読み取ります。Google Mapsページの大規模な自動スクレイピングは利用規約に違反するため、このコードは実行していません。どのような作業が必要かを示すためだけに掲載しています。

python
# Configuration example (not run): the usual structure of a browser review scraper
from playwright.sync_api import sync_playwright

PLACE_URL = "https://www.google.com/maps/place/?q=place_id:ChIJl6T2cnbMRIYR7eD538S3oWU&hl=en"

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page(locale="en-US")
    page.goto(PLACE_URL, wait_until="networkidle")
    page.get_by_role("tab", name="Reviews").click()          # breaks when the label changes
    panel = page.locator("div[role='feed']")                  # a guessed selector that changes often
    for _ in range(30):                                       # about 10 more reviews per scroll
        panel.evaluate("el => el.scrollBy(0, el.scrollHeight)")
        page.wait_for_timeout(1200)
    texts = page.locator("[data-review-id] span").all_inner_texts()
    print(len(texts))
    browser.close()

このコード例の各行は、ページが変わらないことを前提にしています。タブのラベル、パネルのセレクタ、1回のスクロールで読み込まれるレビュー数、ページの言語は、いずれも変わる可能性があります。Googleのフロントエンドのリリースが1回あるだけで、あるいはお使いのIPアドレスに確認ページが1回表示されるだけで、スクリプトは止まります。この保守コストを測るため、GitHubで最も多くのスターを集めているオープンソースのGoogle Mapsスクレイパーの1つを調べました[32]。2026年11月2日時点で、スター数は7,148、フォーク数は1,112、ライセンスはMITで、最終プッシュは2026年10月21日でした。

このプロジェクトは、2026年7月13日から9月20日までの間に、v1.16.3からv1.18.1まで8回のリリースを行いました[36]。8月1日以降に作成されたIssueは15件です。下表は、そのうちレビューに関わるもの、またはジョブを停止させるものを示しています。タイトルは要約したもので、リンクは参考文献に掲載しています[33][34][35]。

日付Issueユーザーの報告内容状態
2026-09-01#327追加レビューのオプションで約10件のレビューしか返らず、内部のレビューエンドポイントが403を返す(v1.17.4)オープン
2026-09-23#331実行中にスクレイピングエンジンのエラーが多発するクローズ
2026-10-05#337v1.18.0へのアップグレード後、Webのジョブ一覧が空のままで、開始ボタンが反応しないオープン
2026-10-06#338ブラウザのページまたはコンテキストが閉じたため、すべてのスクレイピングジョブが失敗するオープン
2026-10-09#341タイトルは「300 Reviews per place」オープン
2026-10-22#346ブラウザコンテキストが閉じないため、Webジョブが処理中のままになるオープン

これはコード品質を批判するものではありません。スター数が7,000に達し、10週間で8回のリリースを行ったプロジェクトでさえ、数週間おきに「レビューが10件しか取れない」「すべてのジョブが失敗する」といった問題に直面します。原因はGoogle側の変更であり、コード品質の低さではありません。Issue #337と#346[42][43]は、別のコストを示しています。これらはGoogleとは無関係で、ブラウザ自動化そのものに起因しています。

何か月も動かすレビュースクレイパーは、週末に書くスクリプトでは済まず、オンコール担当者を置く小さなサービスになります。ブラウザの起動と停止、メモリ、同時実行数、タイムアウト、プロキシ、出口IPアドレスを管理しなければなりません。自作すると、問題を真っ先に見つけてくれるコミュニティも失います。呼び出し単位の料金と比較する前に、この作業の工数を見積もってください。

自作のスクレイパーは、robots.txtも確認しません。同じタイミングでgoogle.com/robots.txtをダウンロードしました[16]。86行目にはDisallow: /maps/、74行目にはDisallow: /maps?とあります。このファイルには/maps/place/と/maps/search/に対するAllow行もあります。

RFC 9309では最も長く一致するルールが優先されるため、通常のプレイスページのパスは許可されます。/maps/配下のそれ以外のパスのうちAllow行がないものは、Disallowルールの対象になります[17]。RFC 9309には、robotsルールはアクセス許可の一形態ではないとも書かれています[17]。実際の制約となるのは利用規約です。

利用規約、判例、個人データ

まずは契約から見ていきます。Google Maps Platformの顧客であれば、プラットフォーム利用規約の第3.2.3条(a)には「No Scraping」(スクレイピングの禁止)という見出しが付いています。そこには、顧客はサービス外で使用する目的でGoogle Mapsのコンテンツをエクスポート、抽出、その他の方法でスクレイピングしてはならないと定められています[13]。一般ユーザー向けには、Google Maps追加利用規約がコンテンツの大量ダウンロードや一括フィードを禁じています[14]。Googleがこの規約を最後に改定したのは2026年1月27日です。この規約は、Google Mapsを使って他の地図データセットを作成または拡充することも禁じており、その対象にはビジネスリスティングのデータベースも含まれています[14]。

つまり、公式APIでも自作のスクレイパーでも、Googleのコンテンツのコピーを作ることは認められていません。米国の裁判所は、より広い論点について判断を示しています。2022年4月18日、第9巡回区控訴裁判所はhiQ Labs v. LinkedIn事件で、公開されたWebデータのスクレイピングは、コンピュータ詐欺・濫用防止法(Computer Fraud and Abuse Act)上の「権限のない」アクセスには当たらない可能性が高いと判示しました[21]。

2024年1月23日、カリフォルニア州北部地区連邦地方裁判所は、Meta Platformsが提訴したデータ収集企業に有利な略式判決を下しました(事件番号3:23-cv-00077)。裁判所は、Metaの利用規約がログアウト状態での公開データのスクレイピングを禁じていることを、Metaが立証できなかったと判断しました[22]。

この2つの判決は、公開データのスクレイピングは合法だという主張の根拠としてよく引用されます。しかし、これらは特定の契約文言に関する特定の法的論点に答えたものです。規約違反に代償がないとは述べておらず、米国外にも適用されません。本ガイドは法的助言ではありません。商用利用の前に弁護士に相談してください。

次に個人データです。レビュー投稿者の名前、写真、プロフィールリンクは個人データにあたります。カリフォルニア州では、カリフォルニア州消費者プライバシー法(CCPA)により、企業が収集したデータに対する権利が消費者に認められています。同州司法長官は2026年8月28日にCCPAのページを更新しました[23]。EUではGDPRが適用されます[24]。

シンガポールには個人データ保護法(Personal Data Protection Act)があり[25][26]、メキシコは2025年3月20日に新しい連邦データ保護法を公布しました[27]。ほとんどの分析では、レビュー投稿者の身元は必要ありません。評価、日付、本文、オーナーの返信を残し、名前と写真は削除しましょう。後述のCSVエクスポーターはそのように処理します。

他のビジネスのレビューを自社のページに転載する場合は、虚偽のエンゲージメントに関するGoogleの投稿ポリシーも適用されます[15]。

方法3:呼び出しごとに課金されるデータAPI

3つ目の方法は、呼び出しごとに課金されるデータAPIです。リクエストを1回送ると、サービスがビジネス情報やレビューを構造化データとして返します。ブラウザ、プロキシ、ページの変更への対応はサービス側が担い、課金は呼び出し単位です。この市場にはいくつかの課金モデルがあります。代表的なのは、結果件数ごとに課金するクラウドスクレイピングプラットフォーム、クエリごとに課金する検索結果API、呼び出しごとに課金するデータAPIです。EveryInfraは最後のモデルを採用しています。

本ガイドはチュートリアルであり、ベンダーの料金比較表ではありません。呼び出し方、データの内容、うまくいかないケースに焦点を当てています。当社の単価と課金単位はGoogle Maps Reviews APIのページに掲載しています。

EveryInfraのGoogle Maps Reviews APIには4つの機能があります。google_maps_reviews/search は、キーワードと場所でプレイスを検索します。google_maps_reviews/profile は、1件のプレイスの詳細を返します。google_maps_reviews/reviews は、1件のプレイスのレビューを返します。google_maps_reviews/contributor_reviews は、1人のレビュー投稿者が書いたレビューを返します。

2026年11月2日00:14:03(SGT)に公開カタログを確認しました。4つの機能はすべて1回の呼び出しあたり$0.001389です。検索は1回の呼び出しで最大50か所、ページをまたいで最大120件を返します。レビューは1回の呼び出しで最大100件、ページをまたいで最大400件を返します。

同期リクエストで取得できるのは200件目までで、それ以降のページには非同期ジョブが必要です。レビューはnewestとrelevanceの2つの並び順に対応しています。sinceパラメータで結果を指定日以降のレビューに絞り込み、langでレビューの言語を指定します。

以下は、オースティンのクリニックに対するレビューリクエストの例です。プレイスを指定する方法としては、プレイスIDを含むGoogle MapsのプレイスURLが最も安定しています。

bash
curl -s https://api.everyinfra.com/api/v1/social \
  -H "Authorization: Bearer $EVERYINFRA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"platform":"google_maps_reviews","action":"reviews",
       "params":{"url":"https://www.google.com/maps/search/?api=1&query=Swish%20Dental%20-%20Domain&query_place_id=ChIJl6T2cnbMRIYR7eD538S3oWU",
                 "sort":"newest","limit":100}}'

このリクエストは00:20:36(SGT)に送信しました。100件のレビューが返り、billing.charged_usdは0.001389でした。レスポンスではpagination.has_moreがtrueになっており、next_page_tokenが含まれていました。次のページを取得するには、受け取ったトークンの値を変更せずにpage_tokenに指定し、同じリクエストを送信します。下のスクリーンショットは、00:15(SGT)にシンガポールのレストランについて取得した実際のレスポンスで、レビュー投稿者の名前はマスクしています。

ダークテーマのコードカードに表示されたAPIレスポンスのスクリーンショット。ヘッダーには「POST /api/v1/social、google_maps_reviews/reviews、2026-11-02 00:15 SGT」と表示されています。マスクされた2件のレビューレコードの上で、count 100とcharged_usd 0.001389がティール色の枠で強調されています。
レビュー投稿者名をマスクした実際のレスポンスの抜粋。1回の呼び出しで100件のレビューが返り、課金額は$0.001389でした。 EveryInfra APIの実レスポンス

各レビューレコードには、カタログに記載されたフィールドが含まれます。下表は、分析で特に重要なフィールドを、オースティンの最新レビュー200件での件数とともに示したものです。このうちdetailed_ratingとowner_responseの2つは、公式のPlaces APIのレビューオブジェクトには含まれていません。

フィールド意味オースティンの最新レビュー200件中
rating星1〜5200件中200件
posted_at投稿日時(UTC)200件中200件
textレビュー本文(空の場合あり)130件に本文あり(65%)
owner_responseとowner_response_atオーナーの返信と返信日時146 (73%)
detailed_rating料理やサービスなどの項目別評価このクリニックでは0件
image_urlsレビューに添付された写真3
is_local_guideとreviewer_review_countローカルガイドのフラグと投稿者のレビュー数うち58件はローカルガイドによるレビュー
like_count「役に立った」の投票数200件中200件
id、url、place_idレビューと場所の識別子200件中200件

00:20:02 SGTのプロフィール呼び出しgoogle_maps_reviews/profileでは、クリニックの詳細として星4.6、レビュー1,659件、住所、電話番号、Webサイト、営業時間、座標が返されました。00:17:10 SGTの検索呼び出しgoogle_maps_reviews/searchでは、キーワード「dentist」とロケーション「Austin, TX」を使用しました。1ページ目では50件の施設が返されました。

2ページ目は51件目から始まるため、00:23:59(SGT)の同期リクエストは非同期モードを求める422を返しました。00:24:22(SGT)の非同期ジョブは、さらに50か所を返しました。プレイスIDで重複を除くと異なるクリニックが100か所残り、そのうち99か所がオースティンの住所でした。営業用のリードリストなら、これで作業は完了です。複数の検索結果を統合する際は、プレイスIDによる重複排除のガイドが役立ちます。

テスト1:オースティンの歯科医院、掲載評価と直近の評価の比較

このテストは、米国の消費者が抱く1つの疑問に答えるものです。掲載されている星評価は、クリニックの現在の状況を示しているのでしょうか。オースティンのDomainエリアにあるSwish Dentalの最新レビュー200件を、00:20:36 SGTと00:23:41 SGTの2ページに分けて取得しました。掲載情報には星4.6、レビュー1,659件と表示されています。

最新レビュー200件の平均は星4.305で、掲載評価より約0.3低くなっています。内訳は星5が156件、星4が7件、星3が5件、星2が6件、星1が26件です。星1のレビューはサンプルの13%を占めます。クリニックは200件中146件のレビューに返信しており、誰かがレビューを管理しているのは明らかです。

患者、投資家、競合にとっては、全体の評価よりも最新200件のレビューのほうが多くを物語ります。掲載評価は長年の蓄積です。新しい星1のレビューが集中している場合、スタッフ、受付、請求に変化があった可能性があります。公式のPlaces APIは関連性で選んだ5件のレビューしか返さないため、こうした集中は見えません。

テキストからは別の側面が見えてきます。星1のレビュー26件のうち24件(92%)にテキストがあり、文字数の中央値は361.5文字です。星5のレビュー156件のうち、テキストがあるのは89件(57%)のみで、中央値は119文字です。不満を持つ患者は、その理由を書いています。

満足した患者は星だけを付けることがよくあります。テキストのあるレビューだけを分析すると、否定的なレビューを実際以上に重く扱うことになります。星評価だけを分析すると、苦情に含まれる有用な詳細を見落とします。

グループ化された棒グラフ。3つの施設について、掲載評価と最新レビューの平均を比較しています。シンガポールのレストランは掲載評価4.4、最新300件の平均4.65、オースティンの歯科医院は掲載評価4.6、最新200件の平均4.305、メキシコシティのタケリアは掲載評価4.2、最新200件の平均4.275です。最新レビューの棒はティール色です。

テスト2:関連性の高いレビュー5件と最新300件の比較

2つ目のテストでは、5件という上限が場所の印象にどう影響するかを示します。対象はシンガポールの11 New Bridge RoadにあるSong Fa Bak Kut Tehです。掲載情報には星4.4、レビュー8,226件、写真18,685枚と表示されています。00:16:10 SGTに、関連性順の上位100件のレビューを取得しました。

最新レビュー300件も3ページに分けて取得しました。1ページ目と2ページ目は00:15:29 SGTと00:16:42 SGTの同期呼び出し、3ページ目は00:18:27 SGTの非同期ジョブです。関連性順の上位5件は、公式APIが返す5件のレビューの代わりとして扱っています。

上位5件の平均は星4.8です。5件すべてにテキストと写真があり、テキストの長さの中央値は517文字です。投稿者は5人ともローカルガイドで、日付は2026年4月から7月です。関連性順の上位100件は平均星4.5で、すべてにテキストがあり、中央値は357文字です。日付は2016年から2026年9月にわたります。最新300件は平均星4.65で、テキストがあるのは63%のみ、中央値は67文字です。

シンガポールのレストラン1店舗について、4つのレビューセットの平均星評価を示すドットチャート。掲載評価はレビュー8,226件で4.4、関連性順の上位5件は4.8、関連性順の上位100件は4.5、最新300件は4.65。軸は4.0から5.0で、上位5件のドットはティール色です。

Googleは関連性の算出方法を公開していません。データからは、アクティブな投稿者による写真付きの長いレビューが明らかに優先されていることがわかり、そうしたレビューは好意的な傾向があります。公式APIの5件のレビューで場所を判断すると、目にするのは最も代表的な称賛の声であり、最近の平均的な顧客の声ではありません。関連性順の上位100件と最新300件で共通するレビューは21件のみで、ほぼ別々のサンプルと言えます。

テキストのあるレビューについて、テキストの長さの中央値を示す棒グラフ。関連性順の上位5件は517文字。関連性順の上位100件は357文字。最新300件は67文字。ラベルにはテキストのある割合(100%、100%、63%)を表示しています。

テキストのないレビューは見落とされがちです。最新300件のうち111件、つまり37%は星だけで文章がありません。キーワード分析や感情分析では、この37%は空のデータです。一方、星評価の推移を見る場合、この37%は長文レビューの投稿者による偏りを受けないサンプルです。2種類の分析では必要なデータが異なるため、レビューAPIは要約だけでなく、星とテキストの両方を返すべきです。

テスト3:メキシコシティのタケリアとロケーションの落とし穴

3つ目の場所は、メキシコシティのコヨアカンにあるTacos Chupacabrasです。掲載情報には星4.2、レビュー18,361件、価格帯MXN 100〜200と表示されています。00:23:05 SGTと00:23:24 SGTに、lang: es419を指定して最新レビュー200件を取得しました。平均は星4.275で、掲載評価に近い値です。内訳は星5が121件、星4が42件、星3が21件、星2が3件、星1が13件です。テキストがあるのは55.5%のみで、中央値は69文字、オーナーの返信は1件もありません。

3つの場所を並べると、分布の形が異なります。歯科医院は星5と星1が多く、中間はわずかです。タケリアは星3と星4が多く、典型的な「料理は最高、でも行列が長い」パターンです。単一の平均値では、どちらの形も見えなくなります。

最新レビューの星の内訳を示す100%積み上げ棒グラフ。シンガポール300件:星5が228、星4が52、星3が13、星2が1、星1が6。オースティン200件:星5が156、星4が7、星3が5、星2が6、星1が26。メキシコシティ200件:星5が121、星4が42、星3が21、星2が3、星1が13。

メキシコシティの検索では、ロケーションパラメータの問題も明らかになりました。00:17:32 SGTに、ロケーション「Ciudad de México」で「taquería」を検索しました。50件の結果はすべてメキシコ国内でしたが、メキシコシティ内は1件のみでした。残りの49件は他の11州にあり、サカテカス州が14件、ヌエボ・レオン州が7件、チワワ州が6件、ハリスコ州が6件でした。

00:19:39 SGTには、キーワードに場所を含めて「taquería en Coyoacán, Ciudad de México」としました。50件すべてがメキシコシティ内で、47件がコヨアカンでした。オースティンの検索ではロケーション「Austin, TX」を使用しました。こちらは100件中99件がオースティン内で、残りの1件はオースティンに隣接するウェストレイクヒルズでした。

原因はまだわかっていません。2つのリクエストには複数の違いがあります。メキシコシティの呼び出しではlanguage: esも送信しており、オースティンのロケーションには州コードが含まれていました。1組のテストだけでは、どの違いが影響しているかを判断できません。原因が判明するまでは、都市名、さらには地区名までキーワードに含めてください。まず1ページ分だけ検索し、結果のうち対象都市内にあるものが何件かを確認してください。

対象都市内の検索結果の割合を示す棒グラフ。ロケーションパラメータを使ったメキシコシティ:50件中1件。キーワードに場所を含めたメキシコシティ:50件中50件。ロケーションパラメータを使ったオースティン:100件中99件。キーワードの棒はティール色です。

最新順の並び替えは厳密な日付順ではない

レビューを監視するチームは、よく同じループを書きます。新しい順に並べて1ページ読み、前回保存した最後のレビューより古いレビューが出たところで止める、というものです。新しい順に並べた3つのデータセットで、1件ずつ確認しました。あるレビューの投稿時刻が1つ上のレビューより新しい場合、そのレビューは順序が乱れていると判断します。シンガポールでは300件中6件、メキシコシティでは200件中18件、オースティンでは200件中50件(25%)が該当しました。シンガポールのデータセットでは、2026年のページに2023年のレビューが2件混ざっていました。

最新順に並べたレビューのうち、日付順になっていない行を示す棒グラフ。シンガポール300件中6件。メキシコシティ200件中18件。オースティン200件中50件(25%)。

これはAPIではなく、Google Maps自体の挙動です。編集されたレビューや、オーナーの返信が新たについたレビューは、日付順から外れて表示されることがあります。影響は実際にあり、「最初の古いレビューで停止する」ループではデータを取りこぼす可能性があります。有効な対策は2つです。停止する前にもう1ページ読むか、sinceを使って指定日以降のレビューのみをAPIから返すようにします。そのうえで、自分でposted_atで並べ替えてください。後述のCSVエクスポーターは、最後のステップで再度並べ替えを行います。

失敗と返金:実際のエラーの例

呼び出しごとの課金で最も心配なのは、失敗した呼び出しに課金されることです。テスト中、意図的なものと誤りによるものを含め、6種類のエラーが発生しました。表はAPIが返した内容をそのまま示しています。時刻はすべて2026年11月2日のSGTです。

時刻(SGT)実施内容レスポンス課金額レスポンスに示された次のステップ
00:15:561ページ目の直後に2ページ目をリクエスト(毎分10回超)429 rate_limited、retry_after 4秒なし待機してから再試行
00:16:03空のページトークンを送信422 invalid_page_tokenなし受け取ったnext_page_tokenをそのまま送り返す
00:17:00同期モードでレビューの3ページ目を要求(200件目以降)422 async_requiredなし"mode":"async"を追加してジョブをポーリング
00:20:55sinceに未来の日付2026-11-30を設定200、レビュー0件、empty_result_refunded返金済み、$0なし
00:21:38マップページではないURLを送信503、再試行可能、retry_after 20秒返金済み、$03回中1回目の失敗と表示
00:22:07sortをoldestに設定422 invalid_value、許可される値はnewestとrelevanceなしsortのみを変更して再送信

このうち1つは改善の余地があります。誤ったURLを送ると、問題のパラメータを示す422ではなく、再試行可能な503が返ります。料金はかかりませんが、503をすべて3回再試行するクライアントは、結果が得られないまま約1分待つことになります。残りの5つのエラーはドキュメントどおりです。パラメータエラーとレート制限には料金がかからず、空の結果は返金され、各エラーメッセージには許可される値と次の手順が示されます。

URLの場合は、自分のコードでチェックすれば十分です。このガイドに登場する場所のリンクは、すべてhttps://www.google.com/maps/で始まります。

python
if not url.startswith("https://www.google.com/maps/"):
    raise ValueError("not a Google Maps place link")

非同期ジョブの課金タイミングに注意してください。課金されるのは結果を取得したときではなく、ジョブを送信したときです。シンガポールの3ページ目の非同期ジョブはSGT 00:18:27に送信しましたが、送信時のレスポンスですでにcharged_usdが0.001389と表示されていました。ジョブのステータスはrunning、finalizing、succeededと推移し、100件のレビューを取得できました。非同期ジョブが失敗した場合は、同じ課金IDの分が返金されます。

PythonでGoogle MapsのレビューをCSVにエクスポートする

Google Mapsのレビューをスクレイピングする方法を端的に示したのが、以下のコードです。Google Mapsの場所へのリンクを1つ渡すと、最新のレビューをページ単位で読み込み、CSVに書き出します。使用するのはPython標準ライブラリだけです。レート制限、深いページの非同期処理、ページトークンに対応し、最後に投稿日時で並べ替えます。また、レビュー投稿者の名前はファイルに含めません。

python
"""Export Google Maps reviews of one place to CSV via EveryInfra.
usage: EVERYINFRA_API_KEY=... python3 export_reviews_csv.py "<google maps place url>" reviews.csv [max_pages]
"""
import csv, json, os, sys, time, urllib.request, urllib.error

API = "https://api.everyinfra.com"
KEY = os.environ["EVERYINFRA_API_KEY"]
FIELDS = ["id", "place_name", "rating", "posted_at", "text", "owner_response",
          "owner_response_at", "like_count", "is_local_guide", "reviewer_review_count", "url"]

def call(method, path, body=None):
    req = urllib.request.Request(API + path, method=method,
                                 data=json.dumps(body).encode() if body else None,
                                 headers={"Authorization": f"Bearer {KEY}", "Content-Type": "application/json",
                                          "User-Agent": "reviews-csv/1.0"})
    try:
        with urllib.request.urlopen(req, timeout=120) as r:
            return r.status, json.load(r)
    except urllib.error.HTTPError as e:
        return e.code, json.load(e)

def fetch_page(params):
    body = {"platform": "google_maps_reviews", "action": "reviews", "params": params}
    for attempt in range(4):
        status, data = call("POST", "/api/v1/social", body)
        err = (data.get("error") or {})
        if status == 429 or (err.get("retryable") and status >= 500):
            time.sleep(err.get("retry_after", 20)); continue
        if err.get("code") == "async_required":          # deep pages run as a job
            body["mode"] = "async"; continue
        if status == 202 and data.get("poll_url"):
            billing, poll = data.get("billing"), data["poll_url"]   # async jobs are charged at submit
            while data.get("status") in ("queued", "running", "finalizing"):
                time.sleep(5); status, data = call("GET", poll)
            data["billing"] = data.get("billing") or billing
            return data
        if err:
            raise SystemExit(f"stop: {err.get('code')} {err.get('message')}")
        return data
    raise SystemExit("stop: retries used up")

def main():
    url, out = sys.argv[1], sys.argv[2]
    max_pages = int(sys.argv[3]) if len(sys.argv) > 3 else 2
    params = {"url": url, "sort": "newest", "limit": 100}
    seen, rows, spent = set(), [], 0.0
    for page in range(max_pages):
        data = fetch_page(params)
        spent += (data.get("billing") or {}).get("charged_usd") or 0
        for r in data.get("results") or []:
            if r["id"] in seen:
                continue
            seen.add(r["id"])
            rows.append({k: r.get(k, "") for k in FIELDS})
        token = data.get("next_page_token")
        print(f"page {page + 1}: {data.get('count')} rows, total {len(rows)}")
        if not token or not (data.get("pagination") or {}).get("has_more"):
            break
        params["page_token"] = token
    rows.sort(key=lambda r: r["posted_at"] or "", reverse=True)   # "newest" is not strictly ordered
    with open(out, "w", newline="", encoding="utf-8-sig") as f:
        w = csv.DictWriter(f, fieldnames=FIELDS)
        w.writeheader(); w.writerows(rows)
    print(f"wrote {len(rows)} reviews to {out}; charged: ${spent:.6f}")

if __name__ == "__main__":
    main()

メキシコシティのタコス店で、3ページずつ3回実行しました。1回目は00:32:39(SGT)に開始しました。1ページ目と2ページ目は成功し、3ページ目は非同期ジョブに切り替わりました。その後、ポーリングのループがクラッシュしました。ポーリングのレスポンスにはpoll_urlがないのに、コードがループのたびにそれを読み取っていたためです。2回目は、その修正を入れて00:33:18(SGT)に開始しました。3ページ目は0件で返りました。ジョブにはfinalizing状態があるのに、コードがそれを完了とみなしたためです。

3回目の実行は00:35:21(SGT)に開始し、00:36:21(SGT)に終了しました。100件ずつ3ページ分を読み込み、300件のレビューを書き出し(一意のIDは300個)、課金額は$0.004167でした。CSVはutf-8-sigを使用しているため、Excelで開いても文字化けしません。レビュー本文内の改行はセル内に保持されるため、300件に対してファイルは374行になりますが、これは正常です。dialectのオプションについてはPythonのcsvモジュールのドキュメントで解説されています[38]。

どちらのバグも、ドキュメントを読んだ段階では見えず、実際に動かすとすぐにわかりました。3回分の実行ログはすべて保存しています。新しい非同期APIは、レビュー数の多い場所でテストしてください。3ページ目まで進め、各ステータス値を出力してください。

エクスポート後:5つのクリーンアップ手順

データの取得は作業の半分にすぎません。残りはクリーンアップです。3か所から取得した700件のレビューでは、問題は5つのグループに分かれました。いずれも簡単に対処できます。数値が合わなくなってからではなく、最初の分析スクリプトに対処を組み込んでください。

1つ目は時刻です。posted_atとowner_response_atはタイムゾーンのサフィックス付きのUTC時刻です。オースティンは冬はUTC−6、夏はUTC−5なので、現地時間の午後9時に投稿されたレビューは、UTCではすでに翌日になっています。

日ごとのレビュー数を数える場合は、まずその場所の現地時間に変換してください。変換しないと各日が数時間ずれ、週末の傾向が見えなくなります。私たちのCSVはUTCの文字列をそのまま保持し、分析時に都市ごとに変換しています。

2つ目は空のテキストです。3か所の最新レビューでは、35%〜45%の行にテキストがありません。感情分析やキーワード分析では空の行を除外し、レポートに母数を明記してください。星評価の推移を見る場合は残します。同じデータで両方の見方を試し、比較してください。前述のオースティンの数値から、2つのグループにどれほど差が出るかがわかります。

3つ目はサブスコアの言語です。detailed_ratingのキーはレビューの言語に従います。メキシコシティでlang: es419を指定した場合、キーはcomida、servicio、ambienteでした。シンガポールの英語レビューでは、food、service、atmosphereでした。

複数の国を1つのテーブルにまとめる場合は、まずキーを1つのセットに統一してください。統一しないと、同じ「service」のスコアが2つの列に分かれてしまいます。カタログのフィールド一覧にはこの点が記載されていません。2つのレスポンスを並べて比較したときに気づきました。

4つ目は重複です。1件のレビューが2つのページに現れることがあり、数時間後に再実行したときに最もよく起こります。新しいレビューが古いレビューを押し下げ、ページの境界が重なるためです。エクスポーターと同様に、レビューのidで重複を除去してください。場所は場所IDで重複を除去します。同じ場所でも、検索によって異なる名前で表示されることがあるためです。レビューのurlはhl=enのような言語パラメータを含むため、キーには使わないでください。

第5のグループは場所のフィールドです。検索結果のstateとcityの値は表示用のテキストであり、正規化されたコードではありません。位置パラメータを指定したメキシコシティの検索では、1つの州に2通りの表記があることがあります。Zacatecasは「Zacatecas」が13件、「Zac.」が1件でした。Quintana Rooは「Quintana Roo」が2件、「Q.R.」が2件でした。Nuevo León、Jalisco、Tabascoにも略称がありました。

メキシコシティ以外の49件には州の文字列が16種類ありましたが、実際の州は11だけでした。キーワード検索では、stateが42件で「Cd. de México」、8件で「CDMX」でした。シンガポールの検索では、50件中2件にcityがありませんでした。生のstateでグループ化すると、1つの州が2つのグループに分かれます。グループ化の前に略称を正式名称に対応付けるか、緯度と経度から地域を特定してください。

問題確認した内容対処法
タイムゾーンposted_atはUTC日ごとに集計する前に現地時間へ変換
空のテキスト最新行の35%〜45%テキスト分析では除外、星評価の推移では保持
サブスコアのキー英語ではfood、スペイン語ではcomida統合前にキーを1つのセットに統一
重複実行間でページの境界が重なるレビューのidと場所IDで重複を除去
場所のフィールド「Zac.」と「Zacatecas」、「CDMX」と「Cd. de México」グループ化の前に略称を1つの名前に統一

ユースケース別のコスト

単価は、実際の業務に当てはめると判断しやすくなります。以下の数値は、私たちのテストで得た単価とGoogleの料金表の単価に基づいています。サーバー、人件費、その他のコストは含みません。

1つ目の業務は営業リストの作成です。オースティンのすべての歯科医院について、名前、電話番号、Webサイト、評価、レビュー数を取得し、レビュー本文は取得しません。EveryInfraの検索は1回の呼び出しで50件の場所を$0.001389で返します。2ページで100件の異なる医院を$0.002778で取得できました。1,000件のリストなら約20回の呼び出し、つまり$0.028です。

1つのキーワードでページングできるのは最大120件なので、市内をエリアに分けるか、キーワードを変えてください。公式のText Search Pro SKUは月5,000回まで無料で、その後は1,000回あたり$32です[3][6]。この規模なら、無料枠でジョブ全体をまかなえます。違いは、公式の結果に適用されるキャッシュと表示のルールです[7]。

2つ目の業務はレビューのモニタリングです。50店舗を展開するチェーンが、週に1回、各店舗の新着レビューを確認します。自社の店舗であれば、Business Profile APIが無料で最適です[12]。フランチャイズ店舗や代理店が扱う店舗の場合、またはクライアントのためにモニタリングする場合は、データAPIが必要です。

1店舗につき週1回、52週・50店舗で2,600回の呼び出しとなり、年間約$3.61です。公式のPlaces APIではこの業務はこなせません。最新のレビューを返さず、上位5件が何か月も変わらないこともあるためです。

3つ目の業務はリサーチです。ある地区に500軒のレストランがあり、それぞれの最新レビュー100件、合計50,000件を取得したいとします。データAPIなら、レビュー取得を500回、検索を約15回実行し、費用は約$0.72です。公式のPlaces APIでは最大2,500件(500か所×5件)しか得られず、しかも選別されたサンプルです。

シンガポールでのテストでは、このサンプルの星評価は最近のレビューより平均0.15ポイント高く、テキストの長さは7倍を超えていました。自作のスクレイパーでも、理論上はこの業務をこなせます。ただし、オープンソースプロジェクトのIssue一覧を見ると、途中で「レビューを10件しか取得できない」問題にぶつかる可能性があります[33]。

用途公式Places APIEveryInfraのデータAPI
オースティンの医院1,000件、リストのみText Searchの無料枠内約20回の呼び出し、$0.028
50拠点、毎週の新着レビュー、1年間不可(新しい順の並べ替えなし)2,600回の呼び出し、約$3.61
レストラン500店、各店の最新レビュー100件選別されたレビュー最大2,500件約515回の呼び出し、約$0.72

Google Mapsスクレイパーの選び方:6つのチェック項目

最適なGoogle Mapsスクレイパーを探している人に必要なのは、最も有名なツールではありません。許容できるコストで、データを確実に返してくれるツールです。ここではブランド別ではなく、カテゴリ別にチェック項目を挙げます。各項目は、数セントで済む小規模な試験実行で検証できます。

チェック項目検証方法当社の参考値
1か所あたりのレビュー数と日付によるページングレビューが1,000件を超える場所を選び、3ページ目に進む公式APIは5件。EveryInfraは並び順ごとに400件
課金単位と失敗時の課金不正なパラメータを1つ、未来のsince日付を1つ送信する422と429は無料。結果が空の呼び出しと失敗した呼び出しは返金
レビュー1,000件あたりの実コスト課金額を返された行数で割り、1,000を掛ける1回あたり100件で$0.01389
フィールドオーナーの返信、項目別評価、写真があるか確認するowner_response, detailed_rating, image_urls
位置情報の精度1つの都市を2通りの位置指定で検索するメキシコシティ:パラメータ指定で50件中1件、キーワード指定で50件中50件
AIツールからの利用MCPまたはFunction Callingのツール定義があるか確認するあり。リモートMCPサーバー

2行目は、購入者が最も見落としがちな項目です。結果ごとに課金するツールは通常、空の結果には課金しませんが、途中で終わったジョブの扱いはツールによって異なります。呼び出しごとに課金するAPIでは、空の結果や失敗が返金されるかを確認してください。数セントのテストを1回すればわかります。

3行目も同様です。定価をうのみにせず、実際の課金額を実際の件数で割ってください。1,000件あたりの価格の多くは満杯のページを前提にしていますが、対象の場所にはレビューが数十件しかないかもしれません。

公式APIや自作スクレイパーのほうが適しているケース

データAPIが常に最適解とは限りません。次の3つのケースでは、別の方法をおすすめします。1つ目は、月1,000スポット未満で、1スポットあたり代表的なレビューが5件あれば十分な場合です。この場合は公式Places APIの無料枠で収まります。投稿者の帰属表示を行えば、アプリ内でレビューを合法的に表示することもできます。

2つ目は、自社拠点のレビューを扱う場合です。Business Profile APIを使ってください。すべてのレビューを取得でき、返信もでき、費用もかかりません。これに匹敵するサードパーティはありません。

第3に、1つの都市の事業者リストだけが必要なら、まず政府のオープンデータから始めてください。シンガポールには、営業許可を受けた飲食店を36,000件以上収録したデータセットがあります[28]。シンガポール食品庁(Singapore Food Agency)は2026年11月1日に実績ページを更新しました[29]。メキシコにはDENUEディレクトリ[30]、米国国勢調査局にはCounty Business Patterns[31]があります。これらのデータセットには評価やレビューはありません。よくある組み合わせは、政府データを基本テーブルにし、関心のある場所について最新のレビューを加える方法です。

自作スクレイパーが割に合うのは、1つのケースだけです。ブラウザでしか表示されない要素が必要など要件が非常に特殊で、チームが長期的な保守プロジェクトとして引き受けられる場合です。さらに、いつ壊れてもおかしくないこと、利用規約に違反する可能性があることも受け入れる必要があります。目的がコスト削減だけなら、このガイドの数字はそれを否定しています。レビュー100件あたり$0.001389であれば、エンジニア1人がスクリプトを1回修正する時間のコストは、1年分の呼び出し費用を上回ります。

EveryInfraにも制限があり、今回のテストでも確認しました。1つの並び順では400件で止まります。レビューが8,226件ある場所では、全履歴は取得できません。取得できるのは新しい順の400件と関連度順の上位400件で、この2つは重複します。

200行を超える分には、非同期モードとポーリングループが必要です。メキシコシティでは、位置パラメータを使うと50件中1件しか市内の結果になりませんでした。原因はまだ特定できていません。

FAQ

Google Mapsは無料でスクレイピングできますか?

合法的に無料で使える方法は2つあります。公式Places APIでは、レビュー付きのPlace Details呼び出しを毎月1,000回まで無料で利用でき、1回あたり最大5件のレビューを取得できます[3][4]。自社拠点であれば、Business Profile APIですべてのレビューを無料で読み取れます[11]。「無料のスクレイパー」とは通常オープンソースソフトウェアを指し、ダウンロードは無料ですが、サーバー、プロキシ、保守には費用がかかります。

PythonでGoogle Mapsのレビューをスクレイピングするには?

単純なHTTPリクエストでは、レビューは返されません。当社のテストでは、20件のレビュー抜粋のうちページ内にあったものは0件でした。そのため、ブラウザ自動化かデータAPIが必要です。このガイドでは2つのコードサンプルを紹介しています。1つは実行していないブラウザ自動化のスケッチ、もう1つはデータAPIを呼び出す完全なエクスポーターで、こちらは3回実行しました。Redditのr/learnpythonでも同じ質問が投稿されています[41]。

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

Googleの規約は、コンテンツの一括ダウンロードとスクレイピングを禁止しています[13][14]。米国では、hiQ v. LinkedIn事件や、Metaがデータ収集企業を訴えた事件の判決が、公開データのスクレイピングに有利な判断を示しました。ただし、これらは特定の法的論点に対する判断であり、規約違反には依然として代償が伴う可能性があります[21][22]。

レビュー投稿者のデータは、CCPAやGDPRなどの法律の対象にもなります。本ガイドは法的助言ではありません。

Places APIがレビューを5件しか返さないのはなぜですか?最新のレビューを取得するには?

5件は仕様上の上限です。リファレンスには、レビューは関連性順で最大5件、ページトークンはないと記載されています[1]。自社拠点であれば、Business Profile APIで更新日時順に並べ替えられます[12]。それ以外のスポットには、データAPIかスクレイパーを使ってください。Stack Overflowの質問39223719と55235501への回答でも、同じ上限が示されています[39][40]。

最適なGoogle Mapsスクレイパーは?

唯一の正解はありません。必要なレビュー数、日付によるページングの要否、許容できる課金モデルによって変わります。このガイドでは、数セントで検証できる6つのチェック項目を紹介しています。1スポットあたりのレビュー数、失敗時の課金、レビュー1,000件あたりの実コスト、フィールド、位置情報の精度、AIツールからの利用です。

Google Mapsのレビューのスクレイピングにかかる費用は?

EveryInfraでは1回の呼び出しで最大100件のレビューを$0.001389で取得できるため、レビュー1,000件あたり約$0.01389です。このガイドのテストはすべて合わせて36リクエスト、課金対象の呼び出し26回で、総額$0.036113でした。公式Places APIでは、無料枠を超えるとレビュー1,000件あたり約$5.00かかります。

始め方

クイックスタートを開き、アカウントとAPIキーを作成してください。新規アカウントにはトライアルクレジットが付与されます。最新の条件は料金ページをご覧ください。無料のカタログGET /api/v1/social/catalogを読み、google_maps_reviewsのパラメータと料金を確認します。このガイドのcurlリクエストを、よく知っているスポットに対して送信します。必要なフィールドが含まれているか確認してください。CSVエクスポーターを保存して2ページ分実行し、必要に応じてページを追加します。

レビュープラットフォームを比較するには、YelpデータAPIとTripadvisorデータAPIをご覧ください。構築手順の全体は、Google MapsレビューAPIチュートリアルで解説しています。

検証方法と制約

EveryInfraの呼び出しはすべて、2026年11月2日00:14〜00:36(SGT)に実行しました。テスト用キーのレート制限は1分あたり10リクエストでした。3都市それぞれで1スポットを対象としたため、サンプルはその時点でのそれらのスポットのレビューであり、すべての事業者を代表するものではありません。関連性順や新しい順の結果は時間とともに変わります。

Places APIの料金と制限は、2026年11月2日時点のGoogleのページに基づいています。APIキーを使ったPlaces APIの呼び出しは行っていません。ブラウザ自動化のコードも実行していません。Mapsのページに対して実行したのは、単純なHTTPリクエスト1回のみです。

「レビュー1,000件あたり」は次のように算出しました。EveryInfra側では、各レスポンスのcharged_usdをそのレスポンスに含まれるレビュー数で割り、1,000を掛けました。9つのレビューページにはそれぞれ100件のレビューが含まれていたため、いずれも$0.01389になりました。スポットのレビューが100件未満の場合や、limitを小さくした場合は、呼び出し単位の課金のため、レビュー1件あたりの価格は高くなります。

Places API側では、1回の呼び出しで5件のレビューを取得すると仮定し、ティア価格を5で割りました。どちらも無料枠やトライアルクレジットは含めていません。月ごとのレビュー件数には説明のつかない変動が見られたため、推移グラフは作成していません。

この表は、本ガイドで課金されたすべての呼び出しを示しています。時刻はすべて2026年11月2日(SGT)です。

時刻(SGT)機能対象取得件数課金額
00:14:43google_maps_reviews/searchシンガポール、バクテー50件$0.001389
00:15:07google_maps_reviews/profileSong Fa Bak Kut Teh1件$0.001389
00:15:29, 00:16:42google_maps_reviews/reviewsSong Fa、新着順1〜2ページ目各100件各$0.001389
00:16:10google_maps_reviews/reviewsSong Fa、関連度順100$0.001389
00:18:27google_maps_reviews/reviews(非同期)Song Fa、新着順3ページ目100$0.001389
00:17:10, 00:24:22google_maps_reviews/searchオースティンの歯科医院、2ページ各50件各$0.001389
00:20:02google_maps_reviews/profileSwish Dental1件$0.001389
00:20:36, 00:23:41google_maps_reviews/reviewsSwish Dental、2ページ各100件各$0.001389
00:17:32, 00:19:39google_maps_reviews/searchメキシコシティ、2種類の位置指定方式各50件各$0.001389
00:22:35google_maps_reviews/profileTacos Chupacabras1件$0.001389
00:23:05, 00:23:24, 00:34:37google_maps_reviews/reviewsChupacabras、3ページ各100件各$0.001389
00:32:39〜00:36:21google_maps_reviews/reviewsCSVエクスポーターを3回実行課金対象の呼び出し9回$0.012501

合計で26回の呼び出しが課金対象となり、料金は$0.036113です。このほか、2回の呼び出し(結果が空だったもの1回と失敗したもの1回)は返金され、パラメータエラーまたはレート制限エラーとなった5回の呼び出しには課金されませんでした。

参考文献

  1. Google Maps Platform、Places API (New) RESTリファレンス、Placeリソース。https://developers.google.com/maps/documentation/places/web-service/reference/rest/v1/places
  2. Google Maps Platform、Place Details (New)。https://developers.google.com/maps/documentation/places/web-service/place-details
  3. Google Maps Platform、コアサービスの料金表。https://developers.google.com/maps/billing-and-pricing/pricing
  4. Google Maps Platform、課金と料金の概要(2026-10-30更新)。https://developers.google.com/maps/billing-and-pricing/overview
  5. Google Maps Platform、Places APIの使用量と課金。https://developers.google.com/maps/documentation/places/web-service/usage-and-billing
  6. Google Maps Platform、Text Search (New)。https://developers.google.com/maps/documentation/places/web-service/text-search
  7. Google Maps Platform、Places APIのポリシー。https://developers.google.com/maps/documentation/places/web-service/policies
  8. Google Maps Platform、プレイスID。https://developers.google.com/maps/documentation/places/web-service/place-id
  9. Google Maps Platform、クチコミの要約。https://developers.google.com/maps/documentation/places/web-service/review-summaries
  10. Google Maps Platform、Places APIリリースノート。https://developers.google.com/maps/documentation/places/web-service/release-notes
  11. Google Business Profile APIs、クチコミデータの操作。https://developers.google.com/my-business/content/review-data
  12. Google Business Profile APIs、accounts.locations.reviews.list。https://developers.google.com/my-business/reference/rest/v4/accounts.locations.reviews/list
  13. Google Maps Platform利用規約、第3.2.3(a)項。https://cloud.google.com/maps-platform/terms
  14. Google MapsおよびGoogle Earthの追加利用規約。https://www.google.com/help/terms_maps/
  15. Google Mapsのユーザー投稿コンテンツに関するポリシー、禁止されているコンテンツ。https://support.google.com/contributionpolicy/answer/7400114
  16. google.comのrobots.txt、2026年11月2日に取得。https://www.google.com/robots.txt
  17. IETF、RFC 9309 Robots Exclusion Protocol。https://www.rfc-editor.org/rfc/rfc9309.html
  18. Googleブログ、Fan-Favorite Dining List、2026年10月8日。https://blog.google/products-and-platforms/products/maps/google-maps-fan-favorite-dining-list/
  19. 9to5Google、CarPlay版Google MapsのGemini、2026年10月21日。https://9to5google.com/2026/10/21/google-maps-carplay-gemini/
  20. Search Engine Land、GoogleのAsk Mapsとローカルビジネス。https://searchengineland.com/google-ask-maps-make-your-business-easier-to-recommend-496672
  21. 米国第9巡回区控訴裁判所、hiQ Labs v. LinkedIn、2022年4月18日。https://cdn.ca9.uscourts.gov/datastore/opinions/2022/04/18/17-16783.pdf
  22. 米国カリフォルニア州北部地区連邦地方裁判所、Meta Platforms事件(3:23-cv-00077)、2024年1月23日付命令。https://www.govinfo.gov/app/details/USCOURTS-cand-3_23-cv-00077/USCOURTS-cand-3_23-cv-00077-7
  23. カリフォルニア州司法長官、カリフォルニア州消費者プライバシー法(CCPA)。https://oag.ca.gov/privacy/ccpa
  24. 欧州連合、規則(EU)2016/679(GDPR)。https://eur-lex.europa.eu/eli/reg/2016/679/oj
  25. シンガポールPDPC、PDPAの概要。https://www.pdpc.gov.sg/about/the-legislation/pdpa-overview
  26. シンガポールPDPC、個人データ保護法(PDPA)。https://www.pdpc.gov.sg/overview-of-pdpa/the-legislation/personal-data-protection-act
  27. メキシコ、民間事業者が保有する個人データに関する連邦法、DOF 2025年3月20日。https://www.ordenjuridico.gob.mx/Documentos/Federal/html/wo125102.html
  28. data.gov.sg、NEA認可飲食店一覧。https://data.gov.sg/datasets/d_227473e811b09731e64725f140b77697/view
  29. シンガポール食品庁(SFA)、違反記録、2026年11月1日更新。https://www.sfa.gov.sg/tools-and-resources/track-records
  30. INEGI、DENUE(全国経済単位ディレクトリ)。https://www.inegi.org.mx/app/mapa/denue/default.aspx
  31. 米国国勢調査局、County Business Patterns。https://www.census.gov/programs-surveys/cbp.html
  32. GitHub、オープンソースのGoogle Mapsスクレイパープロジェクト、スター数7,148。https://github.com/gosom/google-maps-scraper
  33. GitHub issue 327、2026年9月1日。https://github.com/gosom/google-maps-scraper/issues/327
  34. GitHub issue 338、2026年10月6日。https://github.com/gosom/google-maps-scraper/issues/338
  35. GitHub issue 341、2026年10月9日。https://github.com/gosom/google-maps-scraper/issues/341
  36. GitHubリリース、v1.16.3〜v1.18.1。https://github.com/gosom/google-maps-scraper/releases
  37. Playwright for Python、インストール。https://playwright.dev/python/docs/intro
  38. Pythonドキュメント、csvモジュール。https://docs.python.org/3/library/csv.html
  39. Stack Overflow、Places APIで5件を超えるレビューを取得する方法。https://stackoverflow.com/questions/39223719/to-get-more-than-5-reviews-from-google-places-api
  40. Stack Overflow、Places APIで最新のレビューを取得する方法。https://stackoverflow.com/questions/55235501/how-to-get-latest-reviews-using-google-places-api
  41. Reddit r/learnpython、スポットのレビューを取得する方法。https://www.reddit.com/r/learnpython/comments/1c94ejb/how_can_i_get_places_reviews/
  42. GitHub issue 337、2026年10月5日。https://github.com/gosom/google-maps-scraper/issues/337
  43. GitHub issue 346、2026年10月22日。https://github.com/gosom/google-maps-scraper/issues/346

参考資料 BL-70