経営診断の時にGoogleMapを使って競合調査したい〜店舗情報や口コミを比較

店舗の相談を受けて、経営診断をする場合には外部環境調査をすることになります。j-statmapを使って地域の人口動態などは把握できますが、GoogleMapでの情報の存在感が大きくなっています。そこでGooleMapの情報をAPIを使って取得していきます。
競合調査したい
今回は、京急川崎のラーメンやさんについて調査してみます。「京急川崎 ラーメン」とGoogleMapで検索すれば情報は出てきますが、さっと一覧を取得したい。スクレイピングツールを使えばいいのかと思いましたが、GoogleMapに対してスクレイピングツールを使うのは規約で禁止されていました。GeminiのAIエージェントで取得しようとしても断られます。
ということで、バイブコーディングでGoogleMapからAPI経由で情報を取得するまでをやってみたいと思います。
GoogleのAPIキーを取得して、Gemeiniでコーディングしてもらい、Google Colabで実行します。
GoogleのAPI取得
なおAPIを利用するには件数に応じて料金はかかります。
GoogleCloudConsoleにアクセスしてプロジェクト作成して、APIを取得します。

APIライブラリからPlacesAPI(New)の設定で有効にします。

有効なAPIとサービスで、PlacesAPI(New)が入っていればOK・

Geminiでバイブコーディング
pythonのコードを書いて。GoogleMapで検索したキーワードで上位の10件の店舗データを取得する。API経由で。(Places API (New)) ※APIは古い方もあるのでNewを使ってください。
これで店舗名、口コミ点数、クチコミ件数、住所、PlaceIDなどを取得してきました。
過不足あれば、追加でお願いします。
今回は、「店舗カテゴリ追加、説明を追加、最新の口コミの追加」をお願いしました。
エラーが出たりしましたが、エラーをコピーしてもう一度Geminiに貼り付けて、修正してとお願いするとエラーも消えました。
作成されたコード
import requests
import pandas as pd
from google.colab import data_table
# ==========================================
# 1. あなたのGoogle Maps APIキーを入力してください
# ==========================================
API_KEY = "ここにAPIキーを貼り付けてください"
def search_google_places_with_review(keyword):
url = "https://places.googleapis.com/v1/places:searchText"
# 取得フィールドの設定(reviewsを追加)
fields = [
"places.displayName", # 店名
"places.primaryTypeDisplayName",# 店舗カテゴリ
"places.editorialSummary", # 説明(紹介文)
"places.rating", # 評価
"places.userRatingCount", # レビュー数
"places.formattedAddress", # 住所
"places.reviews", # 口コミ(最新数件が含まれる)
"places.id" # Place ID
]
field_mask = ",".join(fields)
headers = {
"Content-Type": "application/json",
"X-Goog-Api-Key": API_KEY,
"X-Goog-FieldMask": field_mask
}
# リクエストボディ
payload = {
"textQuery": keyword,
"languageCode": "ja",
"maxResultCount": 20, # 最大20件取得を試みる
"rankPreference": "RELEVANCE"
}
try:
response = requests.post(url, json=payload, headers=headers)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"APIリクエストエラー: {e}")
return None
data = response.json()
places = data.get('places', [])
if not places:
print("店舗が見つかりませんでした。")
return None
shop_list = []
for place in places:
# 店名
name = place.get("displayName", {}).get("text", "不明")
# 店舗カテゴリ
category = place.get("primaryTypeDisplayName", {}).get("text", "(未設定)")
# 説明 (editorialSummary)
description = place.get("editorialSummary", {}).get("text", "(説明文なし)")
# 口コミの1件目を取得
reviews = place.get("reviews", [])
first_review = "(口コミなし)"
if reviews:
# New APIでは reviews[0].text.text に本文が入る
review_node = reviews[0].get("text")
if review_node:
first_review = review_node.get("text", "(本文なし)")
# 表で見やすくするために口コミの長さを制限(任意)
if len(first_review) > 100:
first_review = first_review[:100] + "..."
shop_list.append({
"店名": name,
"店舗カテゴリ": category,
"説明": description,
"口コミ(1件目)": first_review,
"評価": place.get("rating", 0.0),
"レビュー数": place.get("userRatingCount", 0),
"住所": place.get("formattedAddress", "不明")
})
# データフレーム作成
df = pd.DataFrame(shop_list)
return df
# --- 実行 ---
# 検索キーワード
search_keyword = "京急川崎 ラーメン"
df_results = search_google_places_with_review(search_keyword)
if df_results is not None:
print(f"「{search_keyword}」の検索結果(取得数: {len(df_results)} 件)")
# Colabのインタラクティブ・データテーブルで表示
display(data_table.DataTable(df_results, include_index=False))
Google Colabで実行します。
Colabへいって、新しいノートブックをひらいて、Geminiで生成したコードを貼り付けて実行します。

作成したAPIキーを貼り付けます

検索されたいキーワードをいれました。

実行結果
「京急川崎 ラーメン」で実行しました。ラーメン屋さんはレビュー数がすごいですね。説明文設定していないお店も多いのか。なお、一度にAPIで取得できる件数は20件までです。

口コミを取得したい
先程の店舗情報取得では最新の口コミを1件だけ取得しました。人気店舗なら口コミが何百件もあるので、口コミを一括でダウンロードして、取得したいです。
ただこのAPIでは口コミは一度に取得できるのは口コミの最新の5件まででした。残念。
なお、GoogleMapのオーナー権限があれば、別のAPIがあって、一括でダウンロードできます。相談者さんと面談する前に事前に調査したかったのですが、相談した後にGoogleMapの権限を付与してもらえれば口コミの一括ダウンロードもできそうですね。 Google Business Profile API です。
ただ、OAuth認証の設定などもいるので、ちょっとめんどくさそうなので、今回はここまでです。
そんなところで

