旅行サイトや飲食店など探すのはとても楽しいですが、私は
情報量が多すぎて、だんだん検索がめんどくさくなってしまう性格です。
うちは常に愛犬と共に生活しているため、必ずペット可で検索し、さらに中型犬・大型犬OKかを探さないと行けないので、結構苦労することがあるます。(※良い所だと思っても小型犬のみの場合が多い)
そこでペット可の店を一括でリストを取得し、そこからプログラム的に中型以上もOKかどうか調べるほうが楽なので
スクレイピングしても良いのですが、APIを提供しているならそちらを利用しようと思いました。
旅行先の宿泊施設や飲食はAPIからデータを取得してから決めました
2023年10月現在、無料で使用できる飲食店検索サイトでAPIを提供しているのは
リクルートウェブサービスが提供しているホットペッパーグルメくらいだと思われます。
これを使用してデータを取得してきましょう。
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件で充分かと思います。