はじめに
この記事は、Qiita Engineer Festa 2024 3個目の記事です。
以下の記事より、すべての記事をご覧になれます。
本題
さて、急にぶっ飛んだ話題が来ましたね。今回は学校の都合でPlaces APIを利用して場所の検索をしなければならなくなりました。とりあえず、以下参考にした記事を掲載させていただきます。
以下、コードを貼り付けておきますので、必要に応じて使い分けてください。
import requests
import json
import time
import pandas as pd
GOOGLE_MAP_KEY = "" #Insert your API key.
FILTER_SEARCH_RADIUS = "40000" #Meter unit
FILTER_SEARCH_CENTER = "34.372798,135.302189"
FILTER_SEARCH_KEYWORD = ""
GET_URL = "https://maps.googleapis.com/maps/api/place/nearbysearch/json"
def getInfo(page_token):
GET_PARAMS = {
"key":GOOGLE_MAP_KEY,
"location":FILTER_SEARCH_CENTER,
"radius":FILTER_SEARCH_RADIUS,
"keyword":FILTER_SEARCH_KEYWORD,
}
if(page_token != None):
GET_PARAMS["pagetoken"] = page_token
return requests.get(GET_URL, params=GET_PARAMS).json()
NEXT_PAGE_TOKEN = ""
SEARCH_RESULT = []
try:
for i in range(100):
if(i == 0):
print("Start to get information from Google...")
req = getInfo(None)
else:
req = getInfo(NEXT_PAGE_TOKEN)
SEARCH_RESULT.extend(req["results"])
time.sleep(5)
NEXT_PAGE_TOKEN = req["next_page_token"]
except:
print("Finished to get!")
pd.json_normalize(SEARCH_RESULT).to_csv(f'out{MODE}.csv', encoding='utf-16')
以下、若干の説明を加えておきます。
一回のリクエストで請求できる情報は20件まで
Places APIに一回Getリクエストを送ると、Resultsには20件しか入っていませんでした。しかし、絶対に20件以上の検索結果が出てきます。どうしたらいいのでしょうか?
ここで解決してくれるのが、next_page_token
です。これを次のリクエストのpagetoken
に指定することで、21件目以降の検索結果を表示することができます。
しかし、ここで問題が出てきます。それは、「検索結果の総計がわからないと何回このリクエストを実施したらいいかわからない」ということです。ここで、next_page_token
に関する重要な情報として、追加の検索結果がない場合はそもそもnext_page_token
がありません。したがって、僕は今回途方もない大きな数を指定して、next_page_token
を取り出し次のリクエストをするというループにtry-except
を設置して、next_page_token
がない時にエラーを吐いてtry-except
を終えるというプログラムを組んでいます。
CSVで保存する
今回は最終的にQGISで緯度経度を利用する必要があるので、CSVで保存した。Pythonの実行ファイルと同じフォルダに作成させた。ただし、一回の操作で全ての情報を一個のCSVに保存しておきたいので、あらかじめCSVにデータを作成する前に一つの配列に全てのデータを入れておくことにした。
#配列に追加
SEARCH_RESULT.extend(req["results"])
#CSVに変換
pd.json_normalize(SEARCH_RESULT).to_csv(f'out{MODE}.csv', encoding='utf-16')
ここで大事なのが、CSVをMacのExcelで扱うときに文字のエンコードがUTF-16でないと文字化けしますので、エンコードをUTF-16に指定しておきました。
最後に
今回も久しぶりの記事で、なおかつちょっと珍しい話題でした。次からは現実逃避でちょっとエミュレーターで遊んでいきたいと思います。こそれでは今後もエンジニアフェスタの記事をお楽しみにしてください。