リクルートAPIでデータ抽出

 Difyで飲食店紹介botを制作するに当たり飲食店のデータを抽出する方法を探していたところ、ホットペッパーグルメに連携できるリクルートAPIというものを見つけました。実際にpythonを使用してデータ抽出をしてみたのでその過程を記録します。

リクルートAPIの取得


 リクルートWEBサービスから新規登録を行います。メールアドレスを登録して、認証を行うことでAPIを取得できます。1分くらいで結構簡単に取得することができました。

 リクルートWEBサービス:https://webservice.recruit.co.jp/

Pythonを使用しデータ抽出


 今回は、pythonを使用し、取得したデータをCSVファイルに保存しました。

 簡単にまとめると以下のような手順で進めました。

 『準備』と『コード記入』では以下のwebサイトを参考にしました。

 https://zenn.dev/shintaro/articles/053fe2ca8b3430

コード追加:「ジャンル」「予算」「営業時間」を追加

 参考にしたwebサイトでは店名と住所のデータのみ抽出しており、加えてジャンル・予算・営業時間も知りたかったので、webサイトのコードを参考にしてコードを追加しました。追加したコードは以下のようになりました。

shops = data['results'].get('shop', [])
     for shop in shops:
     writer.writerow({
     '店名': shop['name'],
     '住所': shop['address'],
     'ジャンル': shop['genre']['name'],
     '予算': shop['budget']['average'] if shop['budget'] else '不明'
     '営業時間': shop['open']
     })

※writer.writerowはデータをCSVファイルに書き込むためのメソッドです。

コード追加:愛知県内の全てのデータを取得できるようにする

 参考にしたwebサイトは50件分のデータを抽出するコードだったので、chatGPTに相談して愛知県内の全てのデータを取得するコードを生成してもらいました。1回あたりに100件ずつデータの抽出を行い、それをループして、愛知県内の全てのデータ数を上回ったら終わるという流れです。実際に生成してもらったコードは以下のようになっています。

import requests
import time

API_KEY = "あなたのAPIキー"  # APIキーをここに記入
BASE_URL = "https://webservice.recruit.co.jp/hotpepper/gourmet/v1/"
LARGE_AREA = "Z033"  # 愛知県
COUNT = 100  # 一度に取得する件数(最大100件)

def fetch_all_stores():
    start = 1  # データ取得の開始位置
    all_stores = []  # すべての店舗情報を格納するリスト

    while True:
        # APIリクエストを送信
        response = requests.get(BASE_URL, params={
            "key": API_KEY,
            "large_area": LARGE_AREA,
            "count": COUNT,
            "start": start,
            "format": "json"
        })

        # レスポンスの確認
        if response.status_code != 200:
            print(f"リクエスト失敗: {response.status_code}")
            break

        # JSONデータを解析
        data = response.json()
        shops = data["results"].get("shop", [])
        all_stores.extend(shops)

        print(f"{start}件目から{start + len(shops) - 1}件目の店舗情報を取得しました。")

        # 取得データが100件未満なら終了
        if len(shops) < COUNT:
            break

        # 次の開始位置を更新
        start += COUNT

        # API制限を考慮して少し待機
        time.sleep(1)

    return all_stores

# 店舗情報を取得して表示
if __name__ == "__main__":
    stores = fetch_all_stores()
    print(f"取得した店舗数: {len(stores)}")
    
    # 必要ならデータを保存
    # 例: JSONファイルに保存
    import json
    with open("aichi_stores.json", "w", encoding="utf-8") as f:
        json.dump(stores, f, ensure_ascii=False, indent=4)

    print("データをaichi_stores.jsonに保存しました。")

コード作成

 APIをリクエストするコード、CSVファイルに保存するコード、追加で作成したコードを結合させて最終的なコードを作成しました。

今後の課題


  • chatGPTにつくってもらったコードをしっかり理解できていないので、解析して理解するとともにより簡単なコードにすることができないか考える