はじめに
Python初学者のわたしが覚えるために、学んだことを整理し、理解を深めるために記事を書いています。
前回の続きで、Google Maps APIになります!
是非、第1回から見てみてください😊
この記事でやること(本日のゴール⚽️)
今回の記事では、Google Maps APIを使って、
ドーナツ屋さんの情報を取得するまでの流れを、2つのフローに分けて実践していきます💪
- 日本語のフローを書く(全体像の構成を立てる)
- ドーナツ屋さんの名前を受け取る
- Google Maps API(Text Search)で検索する
- 実行してみる🍩
ここまでをゴールにしたいと思います🍩🍩🍩
Let's 実践!まずは日本語のフローを書く✏️
コードを書くときには、何から始めれば?と毎回迷子になる私ですが、
まずは日本語でフローを書くことが大事!と教えていただいてから、そうしています😊
今回の最終目標はドーナツ屋さんの基本情報と口コミをAPIでゲットしよう!です🍩
対象のドーナツ屋さんは以下の3件にしたいと思います!
🍩 I’m donut ? 福岡店
🍩 JACK IN THE DONUTS 福岡天神店
🍩 ケンジーズドーナツ・ファクトリー
※実際にある店舗でやってみます!
【日本語でコード全体の流れを書く】
今回することを日本語で順番に書きます!👇
※今回は①〜②までを実装し、③以降は次回以降で扱っていきます!
① 調べたいドーナツ屋さんの名前を受け取る
② GoogleMapsAPI(Text Search) でお店を検索する
③ 検索結果から place_id を取得する
④ place_idを使って基本情報を取得する
⑤ place_idを使って口コミを取得する
⑥ 取得した情報を1行分のデータにまとめる
① 1つ目のフロー:調べたいドーナツ屋さんの名前を受け取る
最後に実行するときにドーナツ屋さんはリストで準備予定です🍩🍩🍩
今回、GOOGLE_MAPS_API_KEY は envファイルで準備し、そこから読み込んで使用しています!
コンストラクタは、このクラス内で共通して使う設定をまとめておく場所になるので、 APIキーもコンストラクタで取得するようにしました✏️
ポイント
今回はリストでドーナツ屋さんの名前を準備していますが、
実際はスプレッドシートなど、別のデータから大量に受け取ることを想定してこの形で作成しています!
なので、ドーナツ屋の名前がなかった場合にチェックを入れています🤙
#必要なものをimport
import os
import requests
#型ヒント用:戻り値が分かりやすくなるように
from typing import Optional, Dict
from dotenv import load_dotenv
load_dotenv()
class GoogleMapsAPIDemo:
def __init__(self):
self.api_key_demo = os.getenv("GOOGLE_MAPS_API_KEY")
#① 調べたいドーナツ屋さんの名前を受け取る
def receive_donut_shop_name(self,donut_shop_name: str) ->Optional[str]:
#ドーナツ屋の名前がなければNoneで返す
if not donut_shop_name:
return None
#ドーナツ屋の名前を受け取ったらそれを返す
return donut_shop_name
② 2つ目のフロー:Google Maps API(Text Search)でお店を検索する
次は実際にAPIでお店の情報を呼び出していきます🍩🍩🍩
requests.getはrequestのメソッドになり、HTTPリクエストを送るためのものです!
response.raise_for_status()もrequestのメソッドになり、APIの通信時にエラーになっていないかの判定をしてくれるものになります!
def search_donut_shop_name(self,donut_shop_name: str) ->Optional[Dict]:
try:
#共通のもの!GoogleMapsAPI(Text Search)のエンドポイント
url = "https://maps.googleapis.com/maps/api/place/textsearch/json"
#検索ワード、言語、APIキーを指定する
params = {"query": donut_shop_name,"language": "ja" ,"key":self.api_key_demo}
#ここでリクエストを送ります!
response = requests.get(url, params=params)
#リクエストがエラーになっていないかを確認します
response.raise_for_status()
return response.json()
#通信系エラーのために用意されているもの
except requests.exceptions.RequestException as e:
return None
実行してみる✏️
今回、実行をするときにはドーナツのリストを準備しているため、わざわざ受け取りをする必要はないですが、スプシなどから大量にデータを受け取りしたことを想定しているため、1つ目のフローを通しています🐥
APIは1件ずつのリクエストをしていくので、for文で1件ずつ受け取りし、実行を行うようにしています!
#############実行#############
if __name__ == "__main__":
#インスタンスを作成
demo_api = GoogleMapsAPIDemo()
#ドーナツ屋さんのリスト
donut_shop_list = ["I’m donut? 福岡店","JACK IN THE DONUTS 福岡天神店","ケンジーズドーナツ・ファクトリー"]
#①ドーナツ屋さんの名前を受け取る
for donut_shop in donut_shop_list:
shop_name = demo_api.receive_donut_shop_name(donut_shop)
if shop_name is None:
print("ドーナツ屋の名前がありません")
continue
#②Google Maps APIで検索する
response_result = demo_api.search_donut_shop_name(shop_name)
if response_result is None:
print(f"検索に失敗しました:{shop_name}")
#なくても処理は続ける
continue
print(f"検索に成功:{shop_name}")
#結果を出力する
print(response_result)
まとめ
今回したことは、
- 日本語で全体フローを書く
- ドーナツ屋さんの名前を受け取る
- Google Maps APIのText Searchで検索する
- 実行して、リクエストをする
第3回ではplace_idを使って基本情報を取得していきます!