API活用

【楽天API】地区データを取得する方法

記事内に商品プロモーションを含む場合があります

こんにちは、hokkyokunです。

前回楽天APIを利用する準備としてアプリ登録を済ませました。
面倒ですが、楽天のAPIを使うためには必要なことです。
こちらの記事です

さて、今回からAPIをPythonで叩いていこうと思います。
普段の生活に直結しそうな楽天トラベルと楽天市場での情報取得を目標とします。

  • 楽天トラベルで特定の地点のホテルの空き(空室)情報をリストで取得
  • 楽天トラベルで特定のホテルの価格の動向をチェック
  • 楽天市場で特定の商品の価格動向をチェック

今回は楽天トラベルで使用する地区データを取得していきます。
地味ですね(笑)。
でもこれで情報をとっておかないと地域の指定ができないので(笑)

地区データの取得は簡単なので
APIを使ったことがない人でも練習台としていいかもしれないです。

楽天とレベルの地区データは階層的

下記は楽天トラベルのHP上の地図です。
札幌や帯広・十勝などエリアが以下のように分かれています。

ここから「札幌」をクリックすると
さらに詳細な地区を選択することができます。

楽天トラベルの地区データはいくつかの階層に分かれています。

例えば北海道の札幌市、すすきのエリアを見たい場合

北海道 ⇒ 札幌 ⇒ すすきの・中島公園
と選んでエリアを絞り込んでいきます。

この階層に分かれた区分をAPIで取得していきます。

APIを利用するための準備

APIを利用するにはアプリ登録を済ませる必要があります。

【楽天APIの準備】APIキーの発行方法 こんにちは、hokkyokunです。 前回、楽天APIをブラウザで試してみました。 ブラウザ上でもAPIを叩いて情報を取得...

Pythonコード

json

json形式で吐き出します。


JSON形式(JavaScript Object Notation)は、データを格納または転送するための軽量なデータ交換フォーマットです。人間にとって読み書きが容易であり、マシンにとっても解析や生成が容易なテキストベースの形式です。JSONは主にWebアプリケーションで使用され、サーバーとクライアント間のデータ交換に広く利用されています。

import requests
from pprint import pprint
def get_rakuten_travel_district_codes(api_key):
    # 楽天トラベルAPIのエンドポイント
    url = "https://app.rakuten.co.jp/services/api/Travel/GetAreaClass/20131024"

    # パラメータ設定
    params = {
        'applicationId': api_key, # Replace with your API Key
        'format': 'json',
    }

    # リクエスト
    response = requests.get(url, params=params)
    
    if response.status_code == 200:
        return response.json()
    else:
        return f"Error: {response.status_code}"

こんな感じで取得できました

かなり複雑な構成になっていますね
データとしてはLargeClass > middleClass > smallClass > detailClass
となっています。

LargeClassは日本(国、日本以外はなし)
middleClassは北海道(都道府県)
smallClassは地区(札幌や帯広・十勝など)
detailClassはsmallClassをさらに細分化したもの(札幌など大都市のみ)

構造が複雑で目的のデータを探すのが大変なので
データフレーム型でも取り出してみようと思います。

データフレーム型

ちょっと長くなります。

import requests
import pandas as pd
import numpy as np
def get_rakuten_travel_district_codes_to_df(api_key):
    # [ 1 ]がなぜかうまく表示できなかったので [I]で代替させます
    I=1

    # 楽天トラベルAPIのエンドポイント
    url = "https://app.rakuten.co.jp/services/api/Travel/GetAreaClass/20131024"

    # パラメータ設定
    params = {
        'applicationId': api_key, # Replace with your API Key
        'format': 'json',
    }

    # リクエスト
    response = requests.get(url, params=params)
    
    if response.status_code == 200:

        data = response.json()
        rows=[]

        #largeClass
        largeClass=data["areaClasses"]["largeClasses"][0]["largeClass"][0]
        largeclass_code=largeClass["largeClassCode"]
        largeclass_name=largeClass["largeClassName"]


        #middleClass,smallClass,detailClass(あれば)
        middleClasses=data["areaClasses"]["largeClasses"][0]["largeClass"][I]["middleClasses"]
        for middleClass in middleClasses:
            row=[]
            middleclass_code=middleClass["middleClass"][0]["middleClassCode"]
            middleclass_name=middleClass["middleClass"][0]["middleClassName"]

            for smallClass in middleClass["middleClass"][I]["smallClasses"]:
                smallclass_code=smallClass["smallClass"][0]["smallClassCode"]
                smallclass_name=smallClass["smallClass"][0]["smallClassName"]

                row.extend([largeclass_code,
                    largeclass_name,
                    middleclass_code,
                    middleclass_name,
                    smallclass_code,
                    smallclass_name
                ])

                if len(smallClass["smallClass"])>1:
                    for detailClass in smallClass["smallClass"][I]["detailClasses"]:
                        detailclass_Code=detailClass["detailClass"]["detailClassCode"]
                        detailclass_Name=detailClass["detailClass"]["detailClassName"]

                        rows.append([
                            largeclass_code,
                            largeclass_name,
                            middleclass_code,
                            middleclass_name,
                            smallclass_code,
                            smallclass_name,
                            detailclass_Code,
                            detailclass_Name
                        ])
                else:
                    detailclass_Code=np.nan
                    detailclass_Name=np.nan
                    rows.append([
                        largeclass_code,
                        largeclass_name,
                        middleclass_code,
                        middleclass_name,
                        smallclass_code,
                        smallclass_name,
                        detailclass_Code,
                        detailclass_Name
                    ])


    else:
        return f"Error: {response.status_code}"
    
    columns=[
        "largeclass_code",
        "largeclass_name",
        "middleclass_code",
        "middleclass_name",
        "smallclass_code",
        "smallclass_name",
        "detailclass_code",
        "detailclass_name"
    ]
    df_result=pd.DataFrame(rows,columns=columns)
    return df_result

jsonの形式がかなり複雑なので
取り出すのも結構苦労しました。

データフレームはこんな感じです。
csv形式で保存して、エクセルで開いてみました。

所感

Pythonを使えばAPI利用も簡単でした。
jsonだけなら数行で取り出せましたし。

ただ、そのjsonが複雑な構造をしていたので
全体像を把握するには中身を取り出して整理させないといけないですね。

こういうとき
Pythonの基礎を身に着けていると応用が利きます。
いくらPythonで簡単にコーディングできるとはいえ、基礎的なコードは自力で書ける必要がありそうだなと思いました。

プログラミング学習は独学でも学ぶことができます。
ただ、その場合は時間が多くかかることも事実です。

書籍や動画、プログラミングスクールなど有料コンテンツもたくさんあります。

お勧めは動画コンテンツでの学習です。
プログラミングは書籍だとPCの操作などでわかりにくいところもありますので
連続性のあるコンテンツの方が学習効率が高いです。

動画コンテンツはUdemy一択です。
Udemyの公式サイトはこちらです。

また、質問や相談できる環境を作ると学習効率や質はさらに上がります。
特に独学だと知識の範囲が偏りがちなので、知らないばかりに複雑なコードを書いてしまうことがよくあるので、聞ける環境を作るのはおすすめです。

SAMURAI TERAKOYAは
月額2980円で質問ができる環境を作ることができます。

次は特定の地区の空き状況を取得していきます。

ではでは

関連リンク

楽天API

ワードプレス自動化