ホットペッパーのAPIを使ってレストランのデータを取得する

3 min read

概要

WHY?

レストランのレコメンドをするアプリをつくりたい

HOW?

飲食店検索アプリのAPIを用いて、レストランのデータを取得する

WHAT?

  • 主要(?)の飲食店検索アプリのAPIを調べた

この記事を参考にした
読んで思ったことは、食べログが意外にロゴが個性的だった
あと、食べログ 百名店がいい感じで彼女とのデートで使おうと思ったけど、よく考えたら彼女がいなかった

以上から、いまのところ無料で使えるのはホットペッパーだけだった

実装

package

terminal
pip install jupyterlab requests pandas python-dotenv
  • python-dotenv
    apiの環境変数まわり

  • jupyterlab
    遊び場、データをいじって、理解を深める場所

  • requests
    apiに投げる

  • pandas
    データをいい感じにする

フォルダの構成

.
├── .env
├── Pipfile
├── config.py
├── ext_data.ipynb
├── ext_data.py
└── restaurants_tokyo.csv

*Pipfileは,pipenvを用いる際のファイル
*ext_data.ipynbはいろいろためすときに使ったファイル

.env
HOTPEPPER_API_KEY="YOUR_API_KEY"
config.py
from dotenv import load_dotenv
load_dotenv()

import os
HOTPEPPER_API_KEY = os.getenv('HOTPEPPER_API_KEY')
ext_data.py
import json
import requests
import pandas as pd
# config.py
import config

api_key = config.HOTPEPPER_API_KEY

i_start = 1
restaurant_datas=[]

while True:
	query = {
		'key': api_key,
		'large_area': 'Z011', # 東京
		'order': 1, #名前の順
		'start': i_start, #検索結果の何番目から出力するか
		'count': 100, #最大取得件数
		'format': 'json'
	}
	url_base = 'http://webservice.recruit.co.jp/hotpepper/gourmet/v1/'
	responce = requests.get(url_base, query)
	result = json.loads(responce.text)['results']['shop']
	if len(result) == 0:
		break
	for restaurant in result:
		restaurant_datas.append([restaurant['name'], restaurant['address'], restaurant['budget']['code'], restaurant['genre']['code']])
	i_start += 100
	print(i_start)

columns = ['name', 'address', 'budget', 'genre']
df_restaurants = pd.DataFrame(restaurant_datas, columns=columns)
df_restaurants.to_csv('restaurants_tokyo.csv')

Tips

実装中でのつまったとこなど

Q. ホットペッパーグルメのapiで大サービスエリアコードの地方と値の対応がわからない
A. ホットペッパーグルメのマスタAPIを利用して、レスポンスXMLを出力

terminal
$curl http://webservice.recruit.co.jp/hotpepper/large_service_area/v1/?key=YOUR_API_KEY | xmllint --format -
<?xml version="1.0" encoding="UTF-8"?>
<results xmlns="http://webservice.recruit.co.jp/HotPepper/">
  <api_version>1.20</api_version>
  <results_available>9</results_available>
  <results_returned>9</results_returned>
  <results_start>1</results_start>
  <large_service_area>
    <code>SS10</code>
    <name>関東</name>
  </large_service_area>
  <large_service_area>
    <code>SS20</code>
    <name>関西</name>
  </large_service_area>
  <large_service_area>
    <code>SS30</code>
    <name>東海</name>
  </large_service_area>
  <large_service_area>
    <code>SS40</code>
    <name>北海道</name>
  </large_service_area>
  <large_service_area>
    <code>SS50</code>
    <name>東北</name>
  </large_service_area>
  <large_service_area>
    <code>SS60</code>
    <name>北陸・甲信越</name>
  </large_service_area>
  <large_service_area>
    <code>SS70</code>
    <name>中国</name>
  </large_service_area>
  <large_service_area>
    <code>SS80</code>
    <name>四国</name>
  </large_service_area>
  <large_service_area>
    <code>SS90</code>
    <name>九州・沖縄</name>
  </large_service_area>
</results>

参考にしたサイト

packageの各document

https://pypi.org/
https://stackoverflow.com/questions/16090869/how-to-pretty-print-xml-from-the-command-line
https://qiita.com/m-wakatsuru/items/e8af6b9ba674b6cabf7f