こんにちは、ミナピピン(@python_mllover)です。
以前Google PlacesAPIをPythonから叩く方法についてブログで紹介していたのですが、これだと検索結果が20件以上取得できないという指摘を頂いたので自分なりに解決策を作ってみたので共有したいと思います。
関連記事:【GCP】GoogleCloudPlatformでプロジェクトを作成してAPI鍵の作成&有効化する
関連記事:【Python】GoogleMapをAPIでスクレイピングして施設の詳細情報を取得する
import googlemaps
import pprint
import time
import numpy as np
key = '自分のAPI鍵' # 上記で作成したAPIキーを入れる
client = googlemaps.Client(key) #インスタンス生成
# 基準になる位置情報を検索
geocode_result = client.geocode('埼玉駅')
# 軽度・緯度の情報のみ取り出す
loc = geocode_result[0]['geometry']['location']
keyword = 'メッキ工場'
radius=50000
name = []
def get_company_data(loc, keyword, next_page_token):
if next_page_token is not None:
time.sleep(3)
place_results = client.places_nearby(location=loc, radius=radius, keyword=keyword,language='ja',page_token=next_page_token)
# pprint.pprint(place_results)
if next_page_token is None:
place_results = client.places_nearby(location=loc, radius=radius, keyword=keyword,language='ja')
for d in place_results['results']:
if d['name'] not in name:
name.append(d['name'])
if 'next_page_token' in place_results:
get_company_data(loc, keyword, place_results['next_page_token'])
range_ = 1
diff = 0.125
lists_ = []
for i in range(int(range_/diff)):
lists_.append(diff)
for a in lists_:
loc['lat'] += a
for b in lists_:
loc['lng'] += b
print(loc)
get_company_data(loc, keyword, None)
time.sleep(4)
loc = geocode_result[0]['geometry']['location']
for a in lists_:
loc['lat'] -= a
for b in lists_:
loc['lng'] -= b
print(loc)
get_company_data(loc, keyword, None)
time.sleep(4)
for a in lists_:
loc['lat'] -= a
for b in lists_:
loc['lng'] += b
print(loc)
get_company_data(loc, keyword, None)
time.sleep(4)
loc = geocode_result[0]['geometry']['location']
for a in lists_:
loc['lat'] += a
for b in lists_:
loc['lng'] -= b
print(loc)
get_company_data(loc, keyword, None)
time.sleep(4)
loc = geocode_result[0]['geometry']['location']
処理の流れとしてはまずGoogleAPIにあるNextpagetokenを使ってトークンがある限りの検索結果を取得しています。ただしこれは上限があり60件までしか取得することができません。
なので基準点の座標を上下左右にずらしてAPIを叩きしらみつぶし的に検索をかけることで、取り損なった分が60件以内に含まれていた場合はそれを新規に取得する処理を組み込むことで抜け漏れを無くしています。
APIを叩く回数が増えるので処理に時間は掛かりますが。これで普通にAPIを叩くより多くの検索結果が取得できるようになります。もっとスマートなやり方がある場合教えていただけると嬉しいです。
では~
コメント