Hotpepper API を使って指定した地点の近くの飲食店を検索する

技術的な小ネタ

リクルート社が公開している Hotpepper API を使って、緯度・経度を指定して、近隣の飲食店を検索します。

今回は以下の条件で検索してみます。

  • JR博多駅を中心とした半径500m以内
  • 結果は json 形式で取得
  • 距離が近い順にソート

また、結果を「店名リスト」として取得したいと思います。

リクルートWebサービスに登録し、APIキーを取得する

下記の公式で、ユーザー登録します。

エラー | リクルートWEBサービス

登録にはメールアドレスの登録が必要です。

APIを実行してJSONデータを取得する

今回の検索条件の場合、以下のようなURLになります。

http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=[APIキー]&lat=33.590543&lng=130.420096&range=2&order=1&format=json

(JR博多駅の座標は 33.590543, 130.420096 くらいです)

URLに設定する条件等は、公式のドキュメントに詳細が記載されています。

レスポンスは以下のようになっていました。

{
  "results": {
    "api_version": "1.26",
    "results_returned": "10",
    "results_start": 1,
    "shop": [
      {
        "name_kana": "かがや はかたてん",
        "other_memo": "",
        "photo": {
          "pc": {
            "l": "https://imgfp.hotp.jp/IMGH/43/97/P013584397/P013584397_238.jpg",
            "m": "https://imgfp.hotp.jp/IMGH/43/97/P013584397/P013584397_168.jpg",
            "s": "https://imgfp.hotp.jp/IMGH/43/97/P013584397/P013584397_58_s.jpg"
          },
          "mobile": {
            "l": "https://imgfp.hotp.jp/IMGH/43/97/P013584397/P013584397_168.jpg",
            "s": "https://imgfp.hotp.jp/IMGH/43/97/P013584397/P013584397_100.jpg"
          }
        },
        "large_area": {
          "name": "福岡",
          "code": "Z091"
        },
        "party_capacity": "30",
        "large_service_area": {
          "name": "九州・沖縄",
          "code": "SS90"
        },
        "address": "福岡県福岡市博多区博多駅中央街1-1 JR博多シティ9F",
        "mobile_access": "博多駅徒歩1分 JR博多シティ9F",
        "id": "J000971733",
        "lng": "130.4199470450",
        "course": "あり",
        "show": "なし",
        "parking": "あり :施設内",
        "non_smoking": "一部禁煙",
        "horigotatsu": "なし",
        "name": "加賀屋 博多店",
        "genre": {
          "name": "和食",
          "catch": "能登の伝統の味",
          "code": "G004"
        },
        "open": "月~金、祝前日: 11:00~15:00 (料理L.O. 14:30 ドリンクL.O. 14:30)17:00~22:00 (料理L.O. 21:00 ドリンクL.O. 21:00)土、日: 11:00~16:0016:30~22:00 (料理L.O. 21:00 ドリンクL.O. 21:00)祝日: 11:00~15:0017:00~22:00 (料理L.O. 21:00 ドリンクL.O. 21:00)",
        "tatami": "なし",
        "card": "利用可",
        "charter": "貸切不可 :応相談",
        "wifi": "なし",
        "shop_detail_memo": "",
        "band": "不可",
        "middle_area": {
          "name": "博多",
          "code": "Y700"
        },
        "lat": "33.5905159237",
        "karaoke": "なし",
        "logo_image": "https://imgfp.hotp.jp/IMGH/22/07/P013612207/P013612207_69.jpg",
        "midnight": "営業していない",
        "budget": {
          "average": "8000円",
          "name": "7001~10000円",
          "code": "B005"
        },
        "urls": { "pc": "https://www.hotpepper.jp/strJ000971733/?vos=nhppalsa000016" },
        "lunch": "あり",
        "english": "なし",
        "close": "不定休",
        "service_area": {
          "name": "福岡",
          "code": "SA91"
        },
        "budget_memo": "※サービス料10%(ディナー)",
        "tv": "なし",
        "private_room": "なし",
        "coupon_urls": {
          "sp": "https://www.hotpepper.jp/strJ000971733/scoupon/?vos=nhppalsa000016",
          "pc": "https://www.hotpepper.jp/strJ000971733/map/?vos=nhppalsa000016"
        },
        "small_area": {
          "name": "博多駅(筑紫口・中央街)",
          "code": "X701"
        },
        "barrier_free": "あり",
        "wedding": "",
        "access": "博多駅徒歩1分 JR博多シティ9F",
        "child": "お子様連れOK",
        "capacity": "64",
        "pet": "不可",
        "free_food": "なし",
        "ktai_coupon": "1",
        "station_name": "博多",
        "catch": "",
        "free_drink": "なし"
      },
      以下省略

・・・情報量が半端ないです。
自分が必要な情報のみをフィルタリングするようにパース必須ですね。

python で結果をパースして店名リストを得る

以下のように python スクリプトを組んで、店名リストを取得するようにしました。

import requests
import json

class HotpepperApi:
    # APIのURL
    api = "http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key={key}&lat={lat}&lng={lng}&range=2&order=1&format=json"

    # コンストラクタ引数:APIキー
    def __init__(self, api_key):
        self.api_key = api_key

    # 緯度・経度を指定して最寄りの飲食店名リストを取得(とりあえず検索半径は500m固定)
    def get_shop_name_list(self, lat, lng):
        url = self.api.format(key=self.api_key, lat=lat, lng=lng)
        response = requests.get(url)        
        # jsonデータをパースする
        result_list = json.loads(response.text)["results"]["shop"]
        return [d.get("name") for d in result_list]

if __name__ == '__main__': 
    # json ファイルに「keyキー」があるものとする
    # (key:APIキー)
    f = open("HotPepperApiSetting.json", 'r')
    json_data = json.load(f)

    obj = HotpepperApi(json_data["key"])
    result = obj.get_shop_name_list("33.590543", "130.420096")  
    print(result)       

結果、以下のように出力されました。

['加賀屋 博多店', 'コカレストラン JR博多シティ', '大福うどん エキサイド店', '大福うどん 博多駅地下街店', 'ナイル 博多阪 急店', '博多ビストロ タケノヤ JR博多シティ店', 'ロンフーダイニング 博多1番街店', '博多魚がし 博多駅マイング博多通り店', '四川飯店 博多', 'グリル大宮 JR博多シティ店']

だいぶスッキリしましたね。

サクッと検索できていい感じのAPIです。

コメント

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