Python 無料で独習 WebAPI Pythonで楽天トラベルAPIを扱おう

Python
この記事は約23分で読めます。

Pythonで楽天トラベルAPIを扱う

前回、ぐるなびさんがAPI提供を終了されていたので
動画で概要は理解したつもりでしたが、
今回の楽天トラベルAPIでは実際にコードを打ちながら
学習を進めていきたいと思います。

まずは楽天トラベルAPIを利用するにあたって登録をします。
Googleなどの検索エンジンで
「楽天トラベルAPI」
で検索します。

でこちらのサイトへ移動します。

こちらのサイトからAPIの利用登録をするのですが
その前に楽天のユーザー登録が必要となります。
IDをもっている方はそのままログイン。
もっていない方は楽天IDを取得する必要があります。

Rakuten Developers  からアプリIDを取得

楽天などのIT系会社の場合
こういったサイトを用意して
開発者向けにAPIを提供しているので、
そこでアプリIDを取得して
APIに対してリクエストをするみたいです。
楽天IDでログインしたらこちらにすすみます。

実際のアプリ発行に必要な項目を入力します。
・アプリ名
・アプリURL
は必須となっているので、埋めていきます。

認証の数値を入れて

規約に同意して新規アプリを作成

をクリック。
すると
・アプリID/デベロッパーID
・application_secret
・アフィリエイトID
を取得することができます。
今回の講義で使用するのが
アプリID/デベロッパーID
らしいのでこちらをコピーしておきます。

それでは「楽天トラベル施設検索API」を開きます。

APIのはじめの講義で学習したように
APIのURLへリクエストを送ります。
そのURLがこちらです。

https://app.rakuten.co.jp/services/api/Travel/SimpleHotelSearch/20170426?[parameter]=[value]…

この部分は実際に欲しいデータのパラメータを入力するところなので
?[parameter]=[value]…

リクエストURLはこちらの部分になります。
楽天トラベル施設検索API
https://app.rakuten.co.jp/services/api/Travel/SimpleHotelSearch/20170426

このページには実際にどのようにリクエストすれば
いいかの例題みたいなものも掲載されています。

(1)田沢湖の宿を検索する場合
https://app.rakuten.co.jp/services/api/Travel/SimpleHotelSearch/20170426?
applicationId=[アプリID]
&format=xml&largeClassCode=japan&middleClassCode=akita&smallClassCode=tazawa

実際に入力するパラメーターですが、
同じページのすぐ下に一覧があります。
先ほど取得したアプリIDは必須項目となっています。

その下には出力パラメーターもありますが、
詳細に関しては講義を進めながら学びたいと思います。

APIテストフォーム

ではまず、APIテストフォーム へ進みます。

ページをひらくとアプリ名やアプリIDはすでに入力された状態です。
「パラメータを選択してください」とあるので
largeClassCodeを選択してjapanを入力。
middleClassCodeを選択してokinawaを入力。
smallClassCodeを選択してnahashiを入力。
するとURLの欄がこうなります。
https://app.rakuten.co.jp/services/api/Travel/SimpleHotelSearch/20170426?format=json&largeClassCode=japan&middleClassCode=okinawa&smallClassCode=nahashi&applicationId=1098946756017465148
これでGETボタンを押します。
するとこんな感じでレスポンスが返ってきます。

{
  "pagingInfo": {
    "recordCount": 424,
    "pageCount": 15,
    "page": 1,
    "first": 1,
    "last": 30
  },
  "hotels": [
    {
      "hotel": [
        {
          "hotelBasicInfo": {
            "hotelNo": 148000,
            "hotelName": "ハイアットリージェンシー那覇沖縄",
            "hotelInformationUrl": "https://img.travel.rakuten.co.jp/image/tr/api/hs/dQ4dX/?f_no=148000",
            "planListUrl": "https://img.travel.rakuten.co.jp/image/tr/api/hs/cHNRi/?f_no=148000&f_flg=PLAN",
            "dpPlanListUrl": "https://img.travel.rakuten.co.jp/image/tr/api/hs/TDZXm/?noTomariHotel=148000",
            "reviewUrl": "https://img.t

と、こんな感じでjsonファイルとして見ることができます。
jsonとは
JSONのルールに従って書かれた、
テキストファイルのことです

前置きはここまでで、実際にコードを書いていきます。

Pythonで楽天トラベルAPIを扱うためのコード

まずは楽天トラベルAPIにリクエストを送るための
ライブラリ、requests をインストールします。
インストールが完了したら
pandas
requests
をimport します。

! pip install requests

import requests
import pandas as pd

今回楽天のAPIにアクセスするために必要なURL
とアプリIDを変数に代入します。
この二つの値は変更する予定がないので
変数名を大文字で定義します。これについては慣習みたいです。

REQUEST_URL = 'https://app.rakuten.co.jp/services/api/Travel/SimpleHotelSearch/20170426'
APP_ID = '取得したアプリID'

そして実際にリクエストする値を辞書型で定義してAPIに渡します。
例で出ていたこれです
https://app.rakuten.co.jp/services/api/Travel/SimpleHotelSearch/20170426?applicationId=[アプリID]
&format=xml
&largeClassCode=japan
&middleClassCode=akita
&smallClassCode=tazawa

今回はformatはjsonで取得するようです。
といってもjsonについてはよくわかっていません(笑)
書式みたいなもんかな、ぐらいで理解してます。

params = {
    'format':'json',
    'largeClassCode':'japan',
    'middleClassCode':'okinawa',
    'smallClassCode':'nahashi',
    'applicationId':APP_ID,
}

パラメーターを用意できたので、
実際にreqestsメソッドをつかってデータを取得していきます。

res = requests.get(REQUEST_URL,params)
res
<Response [200]>
#ステータスコード[200]はレスポンスの取得成功を意味します。
result = res.json()
#res.json()でレスポンスの内容を表示
result

とするとresultでずらーーーーーっとホテルの情報が取得できます。
すごく複雑にみえる情報から必要なものをとっていきます。
楽天APIの詳細ページ
https://webservice.rakuten.co.jp/api/simplehotelsearch/
の出力パラメーターの欄をみます。
そこをみると出力されたデータの設計図のようなものが書いてあります。
施設情報
"<hotels> ~ </hotels>"内に複数の"<hotel> ~ </hotel>"が表示される
で実際のデータを見てみると

hotels': [{'hotel': [{'hotelBasicInfo': {'hotelNo': 148000,
      'hotelName': 'ハイアットリージェンシー那覇沖縄',

となっていて、hotelsのなかに[{'hotel'
でリストで各ホテルの情報が入っているのがわかります。
なので結果が格納されたresultからhotels[0]で一軒目の
ホテルの情報を取得することができます。

result['hotels'][0]

{'hotel': [{'hotelBasicInfo': {'hotelNo': 148000,
    'hotelName': 'ハイアットリージェンシー那覇沖縄',
    'hotelInformationUrl': 'https://img.travel.rakuten.co.jp/image/tr/api/hs/dQ4dX/?f_no=148000',
    'planListUrl': 'https://img.travel.rakuten.co.jp/image/tr/api/hs/cHNRi/?f_no=148000&f_flg=PLAN',
    'dpPlanListUrl': 'https://img.travel.rakuten.co.jp/image/tr/api/hs/TDZXm/?noTomariHotel=148000',
    'reviewUrl': 'https://img.travel.rakuten.co.jp/image/tr/api/hs/RmfmX/?f_hotel_no=148000',
    'hotelKanaName': 'はいあっとりーじぇんしーなはおきなわ',
    'hotelSpecial': '都会の喧騒を忘れさせる自然溢れる立地。ハイアットならではの贅沢なホテルステイをお楽しみください。',
    'hotelMinCharge': 7106,
    'latitude': 94357.69,
    'longitude': 459690.88,
    'postalCode': '900-0013',
    'address1': '沖縄県',
    'address2': '那覇市牧志3-6-20',
    'telephoneNo': '098-866-8888',
    'faxNo': '098-866-8111',
    'access': '那覇空港から車で約20分、ゆいレール「牧志駅」から徒歩7分',
    'parkingInformation': '有り\u3000113台\u30001500円(税込み/泊)',
    'nearestStation': None,
    'hotelImageUrl': 'https://img.travel.rakuten.co.jp/share/HOTEL/148000/148000.jpg',
    'hotelThumbnailUrl': 'https://img.travel.rakuten.co.jp/HIMG/90/148000.jpg',
    'roomImageUrl': 'https://img.travel.rakuten.co.jp/share/HOTEL/148000/148000_kan.jpg',
    'roomThumbnailUrl': 'https://img.travel.rakuten.co.jp/HIMG/INTERIOR/148000.jpg',
    'hotelMapImageUrl': 'https://img.travel.rakuten.co.jp/share/HOTEL/148000/148000map.gif',
    'reviewCount': 430,
    'reviewAverage': 4.52,
    'userReview': 'いつもお世話になっております。今年も宿泊させて頂きましたが、途中プラン変更したにも拘らずお部屋も高層階の良いお部屋をおさえて頂き最高の思い出になりました。年末から連日降ったり止んだりの雨や風でお部…\u30002021-01-08 21:34:45投稿 <a href="https://img.travel.rakuten.co.jp/image/tr/api/hs/RmfmX/?f_hotel_no=148000" class="3click">つづきはこちら</a>'}},
  {'hotelRatingInfo': {'serviceAverage': 4.4,
    'locationAverage': 4.5,
    'roomAverage': 4.44,
    'equipmentAverage': 4.54,
    'bathAverage': 4.16,
    'mealAverage': 4.43}}]}
​

内容をよく見てみると
hotel : {  
でまずhotelとホテルの情報全体が辞書型のデータになっていて、
そのホテルの各詳細データも:で区切られた辞書型になっています。
なので['hotel']を追加することによってhotelの中の情法が得られます。

result['hotels'][0]['hotel']
[{'hotelBasicInfo': {'hotelNo': 148000,
   'hotelName': 'ハイアットリージェンシー那覇沖縄',
   'hotelInformationUrl': 'https://img.travel.rakuten.co.jp/image/tr/api/hs/dQ4dX/?f_no=148000',
   'planListUrl': 'https://img.travel.rakuten.co.jp/image/tr/api/hs/cHNRi/?f_no=148000&f_flg=PLAN',
   'dpPlanListUrl': 'https://img.travel.rakuten.co.jp/image/tr/api/hs/TDZXm/?noTomariHotel=148000',
   'reviewUrl': 'https://img.travel.rakuten.co.jp/image/tr/api/hs/RmfmX/?f_hotel_no=148000',
   'hotelKanaName': 'はいあっとりーじぇんしーなはおきなわ',
   'hotelSpecial': '都会の喧騒を忘れさせる自然溢れる立地。ハイアットならではの贅沢なホテルステイをお楽しみください。',
   'hotelMinCharge': 7106,
   'latitude': 94357.69,
   'longitude': 459690.88,
   'postalCode': '900-0013',
   'address1': '沖縄県',
   'address2': '那覇市牧志3-6-20',
   'telephoneNo': '098-866-8888',
   'faxNo': '098-866-8111',
   'access': '那覇空港から車で約20分、ゆいレール「牧志駅」から徒歩7分',
   'parkingInformation': '有り\u3000113台\u30001500円(税込み/泊)',
   'nearestStation': None,
   'hotelImageUrl': 'https://img.travel.rakuten.co.jp/share/HOTEL/148000/148000.jpg',
   'hotelThumbnailUrl': 'https://img.travel.rakuten.co.jp/HIMG/90/148000.jpg',
   'roomImageUrl': 'https://img.travel.rakuten.co.jp/share/HOTEL/148000/148000_kan.jpg',
   'roomThumbnailUrl': 'https://img.travel.rakuten.co.jp/HIMG/INTERIOR/148000.jpg',
   'hotelMapImageUrl': 'https://img.travel.rakuten.co.jp/share/HOTEL/148000/148000map.gif',
   'reviewCount': 430,
   'reviewAverage': 4.52,
   'userReview': 'いつもお世話になっております。今年も宿泊させて頂きましたが、途中プラン変更したにも拘らずお部屋も高層階の良いお部屋をおさえて頂き最高の思い出になりました。年末から連日降ったり止んだりの雨や風でお部…\u30002021-01-08 21:34:45投稿 <a href="https://img.travel.rakuten.co.jp/image/tr/api/hs/RmfmX/?f_hotel_no=148000" class="3click">つづきはこちら</a>'}},
 {'hotelRatingInfo': {'serviceAverage': 4.4,
   'locationAverage': 4.5,
   'roomAverage': 4.44,
   'equipmentAverage': 4.54,
   'bathAverage': 4.16,
   'mealAverage': 4.43}}]
​

さらに先頭行が
[{'hotelBasicInfo': {'hotelNo
という辞書型になっているので、中の情報を取り出すために
さらに['hotelBasicInfo']を追加します。

result['hotels'][0]['hotel'][0]['hotelBasicInfo']

{'hotelNo': 148000,
 'hotelName': 'ハイアットリージェンシー那覇沖縄',
 'hotelInformationUrl': 'https://img.travel.rakuten.co.jp/image/tr/api/hs/dQ4dX/?f_no=148000',
 'planListUrl': 'https://img.travel.rakuten.co.jp/image/tr/api/hs/cHNRi/?f_no=148000&f_flg=PLAN',
 'dpPlanListUrl': 'https://img.travel.rakuten.co.jp/image/tr/api/hs/TDZXm/?noTomariHotel=148000',
 'reviewUrl': 'https://img.travel.rakuten.co.jp/image/tr/api/hs/RmfmX/?f_hotel_no=148000',
 'hotelKanaName': 'はいあっとりーじぇんしーなはおきなわ',
 'hotelSpecial': '都会の喧騒を忘れさせる自然溢れる立地。ハイアットならではの贅沢なホテルステイをお楽しみください。',
 'hotelMinCharge': 7106,
 'latitude': 94357.69,
 'longitude': 459690.88,
 'postalCode': '900-0013',
 'address1': '沖縄県',
 'address2': '那覇市牧志3-6-20',
 'telephoneNo': '098-866-8888',
 'faxNo': '098-866-8111',
 'access': '那覇空港から車で約20分、ゆいレール「牧志駅」から徒歩7分',
 'parkingInformation': '有り\u3000113台\u30001500円(税込み/泊)',
 'nearestStation': None,
 'hotelImageUrl': 'https://img.travel.rakuten.co.jp/share/HOTEL/148000/148000.jpg',
 'hotelThumbnailUrl': 'https://img.travel.rakuten.co.jp/HIMG/90/148000.jpg',
 'roomImageUrl': 'https://img.travel.rakuten.co.jp/share/HOTEL/148000/148000_kan.jpg',
 'roomThumbnailUrl': 'https://img.travel.rakuten.co.jp/HIMG/INTERIOR/148000.jpg',
 'hotelMapImageUrl': 'https://img.travel.rakuten.co.jp/share/HOTEL/148000/148000map.gif',
 'reviewCount': 430,
 'reviewAverage': 4.52,
 'userReview': 'いつもお世話になっております。今年も宿泊させて頂きましたが、途中プラン変更したにも拘らずお部屋も高層階の良いお部屋をおさえて頂き最高の思い出になりました。年末から連日降ったり止んだりの雨や風でお部…\u30002021-01-08 21:34:45投稿 <a href="https://img.travel.rakuten.co.jp/image/tr/api/hs/RmfmX/?f_hotel_no=148000" class="3click">つづきはこちら</a>'}

これでやっと中身を取り出すことができました。
この取得したデータをpandasのデータフレームに入れます。
早速データフレームに入れる記述をします。

hotel_info = result['hotels'][0]['hotel'][0]['hotelBasicInfo']
pd.DataFrame(hotel_info)

ValueError: If using all scalar values, you must pass an index

するとindexが無いというエラーが返ってきます。
hotel_infoは辞書型のデータなので、そのままでは
Pandasに入れることができません。
辞書型はキーとバリューしか無い為です。
indexを定義してあげる必要があるそうです。
pd.DataFrame(hotel_info,index=[0])
index=[] で何行目のデータかを指定します。

pd.DataFrame(hotel_info,index=[0])

hotelNo	hotelName	hotelInformationUrl	planListUrl	dpPlanListUrl	reviewUrl	hotelKanaName	hotelSpecial	hotelMinCharge	latitude	...	parkingInformation	nearestStation	hotelImageUrl	hotelThumbnailUrl	roomImageUrl	roomThumbnailUrl	hotelMapImageUrl	reviewCount	reviewAverage	userReview
0	148000	ハイアットリージェンシー那覇沖縄	https://img.travel.rakuten.co.jp/image/tr/api/...	https://img.travel.rakuten.co.jp/image/tr/api/...	https://img.travel.rakuten.co.jp/image/tr/api/...	https://img.travel.rakuten.co.jp/image/tr/api/...	はいあっとりーじぇんしーなはおきなわ	都会の喧騒を忘れさせる自然溢れる立地。ハイアットならではの贅沢なホテルステイをお楽しみください。	7106	94357.69	...	有り 113台 1500円(税込み/泊)	None	https://img.travel.rakuten.co.jp/share/HOTEL/1...	https://img.travel.rakuten.co.jp/HIMG/90/14800...	https://img.travel.rakuten.co.jp/share/HOTEL/1...	https://img.travel.rakuten.co.jp/HIMG/INTERIOR...	https://img.travel.rakuten.co.jp/share/HOTEL/1...	430	4.52	いつもお世話になっております。今年も宿泊させて頂きましたが、途中プラン変更したにも拘らずお部...
1 rows × 27 columns

あとはこのデータの取得方法でfor文を回します。

まず空のデータフレームを作って
enumerate():要素のインデックスと要素を同時に取り出す。
でenumerate(hotels)で要素のindexを取得して
for文を回します。
で、取得したデータを先ほど定義した空のデータフレームに
appendで追加していって df = として上書きしていきます。

df = pd.DataFrame()
hotels = result['hotels']

for i , hotel in enumerate(hotels):
    hotel_info = hotel['hotel'][0]['hotelBasicInfo']
    _df = pd.DataFrame(hotel_info,index=[i])
    df = df.append(_df)

こうすると、見事データフレームに各ホテルのデータが入っていきました。
最後のfor文の部分はまだちょっとよくわかっていないので、
繰り返し講義を聞いてみたいと思います。
いや~今回の講義はとても疲れました。。。。。
今西先生、有難うございました!

コメント

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