【WebAPI】2つのAPI(HeartRailsGeo、ホットペッパー)を使用して店舗を検索してみる

2つのAPIを組み合わせ!

前回のWebAPIの記事では
「キーワードから緯度と経度と郵便番号を取得」
を行ってみました。

【WebAPI】キーワードから緯度と経度と郵便番号を取得

2022年3月20日
その際に別のWebAPIとも組み合わせができそう。
と記載したのですが、早速試してたくなったので実行です。
今回はこちらのサイトをご参考にさせて頂きました。

やりたい事

前回取得した緯度と経度を使用して、
ホットペッパーのAPIからお店を検索する。
というものです。
また緯度と経度だけでなく、
「飲み放題、食べ放題、個室」の条件によっても
表示される店舗を絞り込めるようにしたいと思います。
内容としては以下ですね。
・キーボードで市町村を入力
・飲み放題、食べ放題、個室のありなしをキーボードで入力
・HeartRailsGeoAPIから緯度と経度を取得
・ホットペッパーAPIから各種条件をで絞り込んだ店舗を表示させる

実装する前に

今回使用するホットペッパーのAPIは事前に登録が必要です。
登録にはメールアドレスが必要ですので
使用してみたい方はこちらから登録を行って
発行されるAPIキーを使用してください。

下記の画面でメールアドレスを入れるだけで簡単に登録できます。

今回のソースコード

ソースコードとは別に、
ホットペッパーで取得したAPIキーを.envファイルに記載してください。
↓こんな感じ。HotPepperAPI変数に自分のAPIキーを入れるだけです。

.envの使い方についてはこちら。
使い方といっても、実行ファイルと同フォルダ内に.envファイルを格納して
そこにAPIキーを入力するだけです。

【環境変数】.envファイルを使ってみる

2022年3月20日

改めて、ソースコードは以下になります。

実行結果

今回のソースコードを実行すると、
最初にキーボード入力が求められます。
地域は必須ですが、店舗の条件はあってもなくてもOKです。
地域だけ入力した場合は以下になります。

この状態でEnterキーを押下すると、絞り込んだ店舗が表示されます。

もし条件を絞り込んで絞り込んだ場合は以下の店舗が表示されます。

同じ地域で条件をデフォルトで絞り込んだ結果は
・食べ放題、飲み放題、個室がなし。
の条件です。
本当に条件で結果が変わっているか確認してみましょう。
1店舗目は同じ店舗となっているので、2店舗目のお店のURLをそれぞれ確認してみます。
まずは条件がデフォルトの2店舗目です。
■ 炭火焼鳥酒場 虜 大宮店
飲み放題はありますが、食べ放題と、個室は「なし」になっていますね。


次に「食べ放題、飲み放題、個室が全てあり」の2店舗目です。
■ 個室隠れ家酒場 蔵重 大宮本店
「食べ放題、飲み放題、個室が全てあり」になっています!

自分が探したい条件で探せるので、凄く便利ですね。

解説

簡単にソースコードの解説です。

まず.envファイルに記載したAPIキーの変数を取得しています。

# .envに記載した環境変数を使用
hotpepper_api_key = "?key=" + os.getenv('HotPepperAPI')

続いてキーボード入力された市町村から住所検索を行って
「緯度と経度」の取得。の部分です。
飲み放題などの各種条件は後でホットペッパーAPIに渡すので、
一旦変数に格納しています。

# キーワードによる住所検索 API
  # JSON(P) 形式
  url = 'http://geoapi.heartrails.com/api/json?method=suggest'

  # キーワードを入力する
  keyword = "&keyword=" + input('店舗を検索する市区町村を入力: ')
  
  free_drink = "&free_drink=" + input('飲み放題ありなら「1」: ')

  free_food = "&free_food=" + input('食べ放題ありなら「1」: ')

  private_room = "&private_room=" + input('個室ありなら「1」: ')

  # 部分一致で取得する
  matching = "&matching=like"

  # URLにキーワード + 部分一致
  geoapi_url = url + keyword + matching
  geoapi_text_detail_y,geoapi_text_detail_x = Geo_Api(geoapi_url)

呼び出された「Geo_Api」関数です。
前回使用したものと同じ内容ですので、特に説明不要かと思いますが、
渡した住所、例だと「埼玉県さいたま市大宮区」から緯度と経度を取得してリターンしています。

def Geo_Api(geoapi_url):
# 作成したURLでリクエストを投げる
  geoapi = requests.get(geoapi_url)

  # JSONのフォーマットをPythonのオブジェクトに変換する
  geoapi_text = json.loads(geoapi.text)

  # いくつかヒットするので00番目だけを取得する
  geoapi_text_detail = geoapi_text["response"]["location"][00]

  # 緯度
  geoapi_text_detail_y = geoapi_text_detail["y"]

  # 経度
  geoapi_text_detail_x = geoapi_text_detail["x"]

  return(geoapi_text_detail_y,geoapi_text_detail_x)

続いてホットペッパーAPIです。
変数名が長くなってしまいました。。。
引数には緯度と経度、店舗を絞り込む条件(食べ放題等)を渡しています。

hotpepper_parm_list = store_search(geoapi_text_detail_y,geoapi_text_detail_x,free_drink,free_food,private_room)

store_search関数では、
受け取った各種条件を「&xxx=」として「requests.get」する
URLに渡しています。この条件で絞り込まれたレスポンスが返ってきます。

def store_search(latitude,longitude,free_drink,free_food,private_room):
  # 変数
  shop_api_url = 'http://webservice.recruit.co.jp/hotpepper/gourmet/v1/'

  # 緯度
  latitude = "&lat=" + latitude

  # 経度
  longitude = "&lng=" + longitude

  # 緯度経度から1Km以内の範囲
  range = "&range=3"

  # おすすめ順 
  order = "&order=4"

  # 最大データ取得件数(上位10店舗)
  count = "&count=10"

  # jsonデータにて取得
  format = "&format=json"

  # 飲み放題で絞り込むかどうか。絞り込む場合は「1」
  free_drink = "&free_drink=" + free_drink

  # 食べ放題で絞り込むかどうか。絞り込む場合は「1」
  free_food = "&free_food=" + free_food

  # 個室で絞り込むかどうか。絞り込む場合は「1」
  private_room = "&private_room=" + private_room
 
  # URLを設定する
  hotpepper = shop_api_url + hotpepper_api_key + latitude + longitude + range + order + count + format + free_drink + free_food + private_room


最後に取得したデータから、
・インデックス番号、店舗名、店舗のURL
を表示しています。

 # 抽出されたリストを1つずつ表示する
  for n,i in enumerate(hotpepper_parm_list,1):
    # インデックス + 店名 + URL
    print(str(n) + ":" + str(i.get("name")) + " / " + str(i.get("urls")["pc"]))

条件はホットペッパーAPIで記載されているので、
こちらから確認が行えます。
一部抜粋すると下記のような内容です。

色々な条件で絞り込めるので楽しいですね!
APIも少しだけ慣れてきました。
調べてみるとたくさんのAPIがあるので
業務効率化できそうなAPIを探して実装してみたいです。

今回は以上となります。
最後までお読みいただきありがとうございました!