はじめに
Python初学者のわたしが覚えるために、学んだことを整理し、理解を深めるために記事を書いています。
前回の続きで、Google Maps APIになります!
本記事は第4回目になります!
第3回までは、Google Maps API(Text searchとplace_id)を使って
- お店の基本情報
- 口コミ(reviews)
上記の情報を取得しました🍩
現在は、「基本情報」と「口コミ」が別々のデータとなっているので、
今回は、この取得した情報をまとめていきます!
※まだ第1回・第2回・第3回を読んでいない方は、先にそちらから読んでもらえると、
流れがより分かりやすいと思います😊
この記事でやること(本日のゴール⚽️)
- 取得した基本情報と口コミを1店舗分のデータとしてまとめる
このように1店舗ずつ情報をまとめることで、
スプレッドシートなどにAPIで戻すときに扱いやすくなります!
🐥本日の流れ🐥
1️⃣ 情報をまとめるための「辞書のテンプレート」を作る
2️⃣ 基本情報がある場合のみ上書きし、情報がなければ空白のままにする
1️⃣ 情報をまとめるための「辞書のテンプレート」を作る
まずは第3回で取得したデータの中身がどんな風に表示されているのか見てみましょう!
ターミナルの情報を確認してみよう!
基本情報はDict(辞書)
口コミはlist(リスト)
色々な情報があって、必要な情報がどれか分かりません!
これはほんの一部です😂
※ ここでは分かりやすく改行していますが、
実際にターミナルに表示されるデータは1行で出力されます。
インデントは見やすさのために整えています🐥
実際はぶっ続けで入っているので、ほんと呪文ですね👽️
###一部抜粋です###
#基本情報
{'address': '日本、〒810-0004 福岡県福岡市中央区渡辺通5丁目24−30 東カン福岡第一ビル 1階',
'phone': None,
'website': 'https://instagram.com/i.m.donut',
'rating': 3.7,
'review_count': 1370}
#----------------------------------------------------------
#口コミ
[{'author_name': '***ヤーマン', 'author_url': 'https://www.google.com/maps/contrib/106154263922430640119/reviews',
'language': 'ja',
'original_language': 'ja',
'profile_photo_url': 'https://lh3.googleusercontent.com/a-/ALV-UjUNdTsYhJrIG3_WWYJ8tnwJiSgEuvio1mZiH87TPpviKNPqerM=s128-c0x00000000-cc-rp-mo-ba3',
'rating': 5,
'relative_time_description': '1 週間前',
'text': 'すごい行列で外国人が多かったです。30分くらい並びましたが並んだ価値はありました。
買ったヤツどれも美味しいかったです。新食感。見た目チョット甘過ぎで重いかな〜ってヤツも、
あっという間になくなります。それだけ美味しいかったです。全種制覇したいです。',
'time': 1767109405,
'translated': False} ]
上記の情報が店舗数分存在するので、
1店舗分の情報を入れるための「辞書のテンプレート」を準備してあげることで、
取得した情報を扱いやすくします🐥
Google Maps APIで取得できる口コミは5個まで✋️
なので、テンプレートでは口コミは5個で準備をしています🍩
#データを当てはめるための、辞書テンプレート
#⑥ 取得した情報を1行分のデータにまとめる
def make_donut_shop_data(self, donut_shop_name: str, place_detail: Optional[Dict], reviews: Optional[list]) ->Dict:
#1行分のデータを準備(テンプレートを準備している状態)
shop_data = {
"ショップ名": donut_shop_name,
"住所": "",
"電話番号": "",
"ホームページURL": "",
"評価": "",
"総合レビュー数": "",
"口コミ_1": "",
"口コミ_2": "",
"口コミ_3": "",
"口コミ_4": "",
"口コミ_5": ""
}
2️⃣ 基本情報がある場合のみ上書きし、情報がなければ空白のままにする
引数にある place_detail のデータの中から、
辞書の .get() メソッドを使って必要な情報を取得していきます🍩
データがある場合は情報を取得し、
なければ第二引数で指定した空文字("")を返していくようにします!
shop_dataのテンプレートを上書きしていくイメージです😊
#基本情報がある場合だけ上書き,なければ空白のままにして(もしあればいれる)
if place_detail:
shop_data["住所"] = place_detail.get("address", "")
shop_data["電話番号"] = place_detail.get("phone", "")
shop_data["ホームページURL"] = place_detail.get("website", "")
shop_data["評価"] = place_detail.get("rating", "")
shop_data["総合レビュー数"] = place_detail.get("review_count", "")
for i in range(min(5, len(reviews))):
"""
f"口コミ_{i+1}" = "口コミ_1" →forで回すたびに増えていく
reviews[i] は口コミのリストで1件目を辞書に入れていく
.get("text", "")はあればテキストで返して、なければ空白で返す
"""
shop_data[f"口コミ_{i+1}"] = reviews[i].get("text", "")
return shop_data
range(min(5, len(reviews))) の意味
-
len(reviews)は口コミが何件あるのかを数えています -
(min(5, len(reviews))は最大で5件まで、口コミの件数と比べて少ない数を使います -
range()は回数を作るので、最大5回か口コミの件数分だけループします
口コミの数を数えて、最大5件までループ処理をする
こんな感じで処理が回っていきます🐥
初学者の私がつまづいたポイント!
疑問①:基本情報の下に、そのまま口コミもドンと続けて入れていいんじゃないの?
最初は、総合レビュー数の下に、
そのまま口コミも続けて入れるものだと思っていました😱😱
これで一気に入っていくぞ!みたいな脳内イメージです😂😂
#私の脳内イメージ🧠
shop_data["総合レビュー数"] = ...
shop_data["口コミ"] = reviews.get("text","")
でも、実際にターミナルで確認すると...
- 口コミが リスト丸ごと 入ってしまう
- 口コミ_1〜口コミ_5 は空のまま
そっか!
どの口コミをどこに入れるかを指定していなかったんだ!と気づきました😂
疑問②:じゃあ、口コミ1〜5に直接入れればいいんじゃない?
次は、こうすればいいのではと思いました✋️
#私の脳内イメージ🧠
shop_data["総合レビュー数"] = ...
shop_data["口コミ_1"] = reviews[0].get("text","")
shop_data["口コミ_2"] = reviews[1].get("text","")
以下続く…
ところが!
この場合では口コミが5件未満の場合にエラーとなります😱
口コミがない場合は第3回目の記事で「空リスト」で取得していますが、
ここでエラーになるのは.getのせいではありません!😱
ポイント
✅️ エラーは reviews[0] の時点で発生
✅️ 存在しない番号を指定した瞬間にエラー
✅️ .get() はその前に実行されない
「空リスト」でも中身が存在しないデータを取りに行くこと自体がエラーの原因でした!
テンプレートで空を用意していても、空リストだったら情報なしの判定でエラー!
ここが一番つまずいたポイントでした!
難しいな〜!😂
なので、for文を使っています!
for文はあるデータの中でループするので、存在しなければそこでループ終了!
0件の場合も同様です!😎
実行してみた
実際に実行してみたら、どのようになるか見てみましょう!
ターミナルではインシデントは関係なくでてくるので、
分かりやすいようにprint区切りをつけました😎
shop_data = demo_api.make_donut_shop_data(donut_shop_name=shop_name,place_detail=place_detail,reviews=reviews)
print("----------------まとめデータ---------------")
print(shop_data)
print("🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩")
1店舗分にまとめたデータ🍩🍩🍩
最初はバラバラだったデータを1店舗分にまとめてほしい情報だけに絞ると、
だいぶ見やすくスッキリしました😊
###一部抜粋です###
----------------まとめデータ---------------
{'ショップ名': 'I’m donut? 福岡店',
'住所': '日本、〒810-0004 福岡県福岡市中央区渡辺通5丁目24−30 東カン福岡第一ビル 1階',
'電話番号': None,
'ホームページURL': 'https://instagram.com/i.m.donut',
'評価': 3.7, '総合レビュー数': 1370, '口コミ_1': 'すごい行列で外国人が多かったです。
30分くらい並びましたが並んだ価値はありました。買ったヤツどれも美味しいかったです。
新食感。見た目チョット甘過ぎで重いかな〜ってヤツも、あっという間になくなります。
それだけ美味しいかったです。全種制覇したいです。}
🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩🍩
まとめ
APIで取得するだけではなく、
今回は取得したデータをどのようにして扱いやすくまとめるかの記事でした。
特に⋯
- テンプレートを準備してほしい形を作っておく
- 口コミ部分はfor文で処理し、エラーがでないようにする
を意識しました!
Google Maps APIについての記事は今回で一旦終了となります!
正直、つまづくところが多々ありました😱
「なんで?」がいっぱい出てきた分、以前より理解が深まった気がします!✨