🗺️

Google Mapsに投稿されているクチコミをPythonで取得する

2021/10/20に公開

やること

緯度経度を指定し、周辺のスポットに投稿されているGoogleMaps上のクチコミを取得します。
⚠️APIの仕様上、1つのスポットに対して5つのクチコミしか取得できません。

今回は、Pythonのgoogle-maps-services-pythonを使用する。

ライブラリの詳しい使い方は以下に書かれています。
https://googlemaps.github.io/google-maps-services-python/docs/index.html

実際に使ってみる

APIキーの準備

GCPのコンソールからGoogleMapsを使用できるAPIキーを取得しておく。

import googlemaps

key = "API KEY"
client = googlemaps.Client(key)

緯度軽度からスポットの情報取得

クチコミを取得したい緯度経度をlocationに指定し、どの程度の範囲からスポットを取得するかをradiusに指定する。(単位はメートル)

nearby_spots = client.places_nearby(
   location=(34.7024, 135.4959),
   radius=200,
   language='ja')

この実行によって取得できるnearby_spotsは以下の形式になっている。

{
  'html_attributions': [],
  'next_page_token': '...',
  'results': [...],
  'status': 'OK'
}

resultsにGoogleMapsのスポットの情報が入っている。
しかし、一度に取得できるスポットの個数は20個なので、20個より多くの情報を取得したい場合は、 next_page_token を使用して

nearby2 = client.places_nearby(page_token=nearby_spots['next_page_token'])

このように書くことで取得することができる。

resultsの中のデータの形式は、以下のような形式になっている。(スポットによって付与されている情報が変わるので、適当なものだけ書いています)

{
  'geometry': {
    'location': {
      'lat': ...,
      'lng': ...
    }
  },
  'name': 'スポットの名称',
  'place_id': ...,
  'rating': 3,
  'types': [...],
  // ...その他色々
}

スポットの詳細情報取得(クチコミ取得)

client.places_nearby()で取得できるresultsにはクチコミの情報が入っていないので、place_idを使用して、別のAPIを叩き、スポットの詳細情報を取得します。

spot = client.place(
  place_id='{place_id}'
)

これによって、1つのスポットの詳細情報を取得できる。
取得できるデータは以下のような形式。

{
  'html_attributions': [],
  'result': {
    'address_components': [...],
    'geometry': {...},
    'name': 'スポットの名称',
    'place_id': ...,
    'rating': 3,
    'reviews': [
      {
        'author_name': 'name',
	'author_url': ...,
	'language': ...,
	'profile_photo_url': ...,
	'rating': 3,
	'relative_time_description': ...,
	'text': 'review text',
	'time': ...
      },
      // ...最大で5つ入っている
    ],
    'types': [...],
    // ...そのほか色々
  },
  'status': 'OK'
}

このreviewsがスポットのクチコミ情報になります🎉
スポットごとに5件以上のクチコミを取得したかったですが、調べた感じ無理そうでした...

reviewsはレビューが1つも存在しない場合にはキーが存在しなくなるので注意。
'reviews' in spot['result']などでキーの存在確認をすると良いかも。

Discussion