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