hotpepperグルメAPIで飲食店データ一覧を取得する

From above of glass of cold coffee drink served with fresh crunchy croissant on wooden board near plate with chocolate cake in cozy cafe API

旅行サイトや飲食店など探すのはとても楽しいですが、私は
情報量が多すぎて、だんだん検索がめんどくさくなってしまう性格です。

うちは常に愛犬と共に生活しているため、必ずペット可で検索し、さらに中型犬・大型犬OKかを探さないと行けないので、結構苦労することがあるます。(※良い所だと思っても小型犬のみの場合が多い)

そこでペット可の店を一括でリストを取得し、そこからプログラム的に中型以上もOKかどうか調べるほうが楽なので
スクレイピングしても良いのですが、APIを提供しているならそちらを利用しようと思いました。

旅行先の宿泊施設や飲食はAPIからデータを取得してから決めました

ペットブログもやってます!

2023年10月現在、無料で使用できる飲食店検索サイトでAPIを提供しているのは
リクルートウェブサービスが提供しているホットペッパーグルメくらいだと思われます。

ホットペッパー Webサービス

これを使用してデータを取得してきましょう。

APIキーを取得する

まずは認証用にリクルートウェブサービスからAPIキーを発行します。

新規登録画面でメールアドレスを入力し送信

届いたメールのリンクをクリックして登録完了

次のメールでAPIキーが記載された本文が届きますのでAPIキーを保管

これでAPIキーの発行は完了です。キーはなくしたり公開しないようにしましょう

ドキュメントから必要情報を参照する

必要な情報を得るためにAPIリファレンスを参照します。

いくつかAPIが提供されていますが、まずは基本っぽいグルメサーチAPIを見ていきます

エンドポイントは以下

http://webservice.recruit.co.jp/hotpepper/gourmet/v1/

検索クエリをみると必須であるパラメータはkey(上記で取得したAPIキー)のみのようです。

その下の方にサンプルとして、大エリアコード=Z011(東京)のお店を検索

http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=[APIキー]&large_area=Z011

というのがあるので、これを実行してみましょう。

テストリクエスト

私はpythonでリクエストします。

import requests
apikey = "先程取得したAPIキー"
url = f'http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key={apikey}&large_area=Z011'
response = requests.get(url)
print(response.ok) # Trueなら成功


Trueならレスポンスの内容を見てみましょう。(Falseであればresponse.reasonで理由を確認しましょう)

data = response.json()
>>> json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

おっとエラーが返ってきてしまいました。デフォルトではxml形式のようですね。jsonがいい場合はパラメータにformatを設定する必要があるようです。実際の取得はjsonにしますが、今回は
response.textでxmlデータを確認します。

タグで囲まれたデータがずらっと返ってくれば成功です。

もう少し調査と改善

今回行いたいこと絞り込みは
1.ペット可の店舗
2.エリアの選択
3.json形式で取得
以上の3点です

ペット可の店舗を検索する

ペット可の店舗を検索するにはパラメータ【pet】に【1】を入れるとできるそうです

エリアの絞り込み

エリアの絞り込みにはlarge_areaなど複数のサイズのエリアコードからどれかを指定する必要がありそうです。そのために、大エリアマスタAPIを叩いてエリアとコードのマッピング表を取得する必要がありそうです

大エリアマスタAPI エンドポイント

http://webservice.recruit.co.jp/hotpepper/large_area/v1/

パラメータ

key
format

取得処理

url = r"http://webservice.recruit.co.jp/hotpepper/large_area/v1/"

params = {
        "key": apikey, 
        "format": "json"
}
response = requests.get(url, params=params)
response.status_code # 200ならOK


データを確認します

json_data = response.json()
print(json_data) # コードとエリアのマッピングデータが取得できました

このままでは見にくいので必要な都道府県とコードデータのみに絞り、pandas dataframeに変換して見てみます

import pandas as pd
pref_df = pd.DataFrame(json_data['results']["large_area"])
print(pref_df[["code","name"]])

これで都道府県のコードが取得できました。
市区町村以下を取得する場合は小エリアコードマスタAPI等を同様に取得する必要があります。

実際に取得する

上記の手順を踏まえてグルメAPIから取得します
今回は追加情報として
東京のデータを100件取得しDataFrameにしてEXCEL出力します。

url = "https://webservice.recruit.co.jp/hotpepper/gourmet/v1/"
prefecture = "Z011"
params = {
        "key": apikey,
        "format": "json",
        "count":100, 
        "large_area": prefecture,
        "pet": 1
    }

response = requests.get(url, params=params)
data = response.json()
shop_df = pd.DataFrame(data["results"]["shop"])
shop_df.to_excel(r"東京のペット可の店100.xlsx", index=False)

結果はこんな感じ

これでフィルタリングや検索して探しやすくなりました。
あとはurls列をURLのみにしてリンクに素早く飛んだりヘッダーを日本語変換すればもっと見やすくなると思います。

終わりに

厳密には、全件取得するにはdata[“results”][‘results_available’]やdata[“results”][‘results_start’]をチェックしてリクエストする際にstartパラメータを制御し、遅延を発生しつつループする必要がありますが、小エリアで取得する場合は基本的に100件で充分かと思います。

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