Python スクレイピング

【Python】Google Places APIで20件以上の検索結果を取得する方法

この記事は約5分で読めます。

 

こんにちは、ミナピピン(@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を叩くより多くの検索結果が取得できるようになります。もっとスマートなやり方がある場合教えていただけると嬉しいです。

 

では~

 

 

 

 


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

タイトルとURLをコピーしました