1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python初心者】第4回 Google Maps API→データをまとめてみた!

1
Posted at

はじめに

Python初学者のわたしが覚えるために、学んだことを整理し、理解を深めるために記事を書いています。
前回の続きで、Google Maps APIになります!

本記事は第4回目になります!
第3回までは、Google Maps API(Text searchplace_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についての記事は今回で一旦終了となります!
正直、つまづくところが多々ありました😱
「なんで?」がいっぱい出てきた分、以前より理解が深まった気がします!✨

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?