楽天トラベル施設検索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を作成しています。


コメント