楽天トラベル地区コードAPIで出力される全国のエリアのパラメータを保存する方法

楽天トラベル施設検索APIや楽天トラベル空室検索APIを使って、エリアを指定してホテルや旅館を検索する際、

宿泊エリアのパラメータが必要になります。

パラメータをまとめた一覧表がほしかったので、外部リンク楽天トラベル地区コードAPIを使って作ってみました。

Rakuten Web Service : API Test Form
楽天ウェブサービス(WEB SERVICE)は、WEBアプリケーションを構築するデベロッパー向けのサイトです。楽天グループのデータや機能を開発者様、企業の皆様にAPIやSDKを通じて提供いたします。

具体的には….

以下のようなjsonファイルから…

{'areaClasses': {'largeClasses': [{'largeClass': [{'largeClassCode': 'japan',
      'largeClassName': '日本'},
     {'middleClasses': [{'middleClass': [{'middleClassCode': 'hokkaido',
          'middleClassName': '北海道'},
         {'smallClasses': [{'smallClass': [{'smallClassCode': 'sapporo',
              'smallClassName': '札幌'},
             {'detailClasses': [{'detailClass': {'detailClassCode': 'A',
                 'detailClassName': '札幌・新札幌・琴似'}},
               {'detailClass': {'detailClassCode': 'B',
                 'detailClassName': '大通公園・時計台・狸小路'}},
               {'detailClass': {'detailClassCode': 'C',
                 'detailClassName': 'すすきの・中島公園'}}]}]},
           {'smallClass': [{'smallClassCode': 'jozankei',
              'smallClassName': '定山渓'}]},
           {'smallClass': [{'smallClassCode': 'wakkanai',
              'smallClassName': '稚内・留萌・利尻・礼文'}]},
           {'smallClass': [{'smallClassCode': 'abashiri',
              'smallClassName': '網走・紋別・北見・知床'}]},
           ...

以下のようなCSVファイルを作ってみました。

楽天トラベル地区コードAPIで出力したjsonファイルを保存

楽天トラベル地区コードAPIで出力される都道府県・地域のパラメータ

  • largeClassCode
  • smallClassCode
  • detailClassCode

はそう頻繁に変化することはないでしょうから、APIテストフォームで1回出力されたデータをコピーして、rakuten_api_chikucode_file.jsonとして保存しました。

※出力formatVersionはデフォルトのままにしています。

jsonファイルを読み取ってCSVへ出力するファイル

保存したjsonファイルを読み取って、

  • middleClassCode・midlleClassName(都道府県に相当。例:北海道)
  • smallClassCode・smallClassName(都道府県の大まかな区画に相当。例:札幌)
  • detailClassCode・detailClassName(smallClassCodeをさらに細かくしたエリア。大都市圏のみ存在。札幌の場合、3エリアに分かれる。(札幌・新札幌・琴似/大通公園・時計台・狸小路/すすきの・中島公園))

をCSVへ出力するpythonファイルは以下になります。

import json
import pandas as pd

with open('rakuten_api_chikucode_file.json') as f:
    res = json.load(f)

prefectures = res['areaClasses']['largeClasses'][0]['largeClass'][1]['middleClasses']

list_a = []#middleClassCode・middleClassNameを入れるリスト
list_b = []#smallClassCode・smallClassNameを入れるリスト
list_c = []#detailClassCode・detailClassNameを入れるリスト

for i in range(len(prefectures)):
    for j in range(len(prefectures[i]['middleClass'][1]['smallClasses'])):
        if len(prefectures[i]['middleClass'][1]['smallClasses'][j]['smallClass']) == 2:
            for k in range(len(prefectures[i]['middleClass'][1]['smallClasses'][j]['smallClass'][1]['detailClasses'])):
                list_a.append(prefectures[i]['middleClass'][0]['middleClassCode'] + ' ' + prefectures[i]['middleClass'][0]['middleClassName'])
                list_b.append(prefectures[i]['middleClass'][1]['smallClasses'][j]['smallClass'][0]['smallClassCode'] + ' ' + prefectures[i]['middleClass'][1]['smallClasses'][j]['smallClass'][0]['smallClassName'])
                list_c.append(prefectures[i]['middleClass'][1]['smallClasses'][j]['smallClass'][1]['detailClasses'][k]['detailClass']['detailClassCode'] + ' ' + prefectures[i]['middleClass'][1]['smallClasses'][j]['smallClass'][1]['detailClasses'][k]['detailClass']['detailClassName'])
        
        else:
            list_a.append(prefectures[i]['middleClass'][0]['middleClassCode'] + ' ' + prefectures[i]['middleClass'][0]['middleClassName'])
            list_b.append(prefectures[i]['middleClass'][1]['smallClasses'][j]['smallClass'][0]['smallClassCode'] + ' ' + prefectures[i]['middleClass'][1]['smallClasses'][j]['smallClass'][0]['smallClassName'])
            list_c.append('-')

df_a = pd.DataFrame(list_a, columns = ['largeClassCode'])
df_b = pd.DataFrame(list_b, columns = ['smallClassCode'])
df_c = pd.DataFrame(list_c, columns = ['detailClassCode'])

df_all = pd.concat([df_a, df_b, df_c], axis=1, ignore_index=False)

df_all.to_csv('rakuten_api_chikucode_ichiran.csv', index=False)

コードについて、適宜解説します。

prefectures = res['areaClasses']['largeClasses'][0]['largeClass'][1]['middleClasses']

▲こちらについては、

  • prefectures[0][‘middleClass’][0][‘middleClassCode’]がhokkaido、
  • prefectures[1][‘middleClass’][0][‘middleClassCode’]がaomori、
  • prefectures[2][‘middleClass’][0][‘middleClassCode’]がakita、
  • ・・・

となるので、prefecturesで置き換えました。

if len(prefectures[i]['middleClass'][1]['smallClasses'][j]['smallClass']) == 2:

▲detailClassesがある場合、ない場合で場合分けをしています。

smallClasses直下の要素は、

  • detailClassesがある場合は、smallClassとdetailClassesの2つ
  • detailClassesがない場合は、smallClassの1つのみ

なので、上記のような場合分けをしています。

list_a.append(prefectures[i]['middleClass'][0]['middleClassCode'] + ' ' + prefectures[i]['middleClass'][0]['middleClassName']) 
list_b.append(prefectures[i]['middleClass'][1]['smallClasses'][j]['smallClass'][0]['smallClassCode'] + ' ' + prefectures[i]['middleClass'][1]['smallClasses'][j]['smallClass'][0]['smallClassName']) 
list_c.append(prefectures[i]['middleClass'][1]['smallClasses'][j]['smallClass'][1]['detailClasses'][k]['detailClass']['detailClassCode'] + ' ' + prefectures[i]['middleClass'][1]['smallClasses'][j]['smallClass'][1]['detailClasses'][k]['detailClass']['detailClassName'])

▲こちらは、

  • middleClassに関する情報(都道府県)をlist_a(リスト)に追加
  • smallClassに関する情報(都道府県内の大まかなエリア)をlist_b(リスト)に追加
  • detailClassに関する情報(smallClassよりもさらに細かいエリア)をlist_c(リスト)に追加

しています。

list_c.append('-')

▲detailClassに関する情報がない場合はlist_c(リスト)に’-‘という記号を追加しています。

df_all = pd.concat([df_a, df_b, df_c], axis=1, ignore_index=False)

▲df_aとdf_bとdf_cを横に結合して、新たなdf_allを作成しています。

コメント

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