「WebAPI」をつかえば、外部のWebサービスで公開されている情報のなかから必要情報を取得することができます。
こちらでは、PythonをつかったWebAPIでのデータ取得方法の具体例をご紹介をします。利用対象となるWebサービスは、天気情報を無料APIで公開されている「OpenWeatherMap」です。
現在、おおくのWebサービスからAPIが提供されています。
PythonのプログラムをつかってWebサービスから情報を取得する方法はいくつかありますが、いずれも「発信側」のサーバーに大小なりとも負荷を掛けることになります。
こういった点を少しでも解消するために「WebAPI」を活用して、情報の「発信側」としては比較的サーバーへの負荷を軽減することができるとともに、「受信側」としてもスムーズに情報を取得する方法が取られるケースが増えてきています。
ちなみに、「WebAPI」が有償ではなく無償で提供されている場合の背景として、情報の「発信側」として自社サービスの認知度をあげるための方法のひとつとして利用されている側面があります。そのため一部のサービスは、無償であっても双方にとってメリットのあるものとして成立しています。
ただし、「WebAPI」は「発信側」によって運営されている都合上、突然サービスが停止されるケースもあります。サービスが停止されるとWebAPIをつかった情報取得ができなくなりますので、ご利用の際にはあらかじめご留意ください。
OpenWeatherMapとは
「OpenWeatherMap」とは、天気情報のAPIを提供するWebサービスのひとつです。
「OpenWeatherMap」では、現時点での天気データ、天気予報、過去の天候情報など、さまざまな気象情報がWebAPIをつかって公開されています。
APIの仕様
APIの呼出
こちらでは「OpenWeatherMap」の数あるサービスのなかから、「現在の気象データ」に関するWebAPIを使用します。
詳細は後述しますが、APIの呼出方法は以下のとおりです。
URL
https://api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key}
パラメーター
項目 | 要否 | 内容 |
q | 必須 | 市名、州コード、国コード |
appid | 必須 | 取得済のAPIキー |
mode | 任意 | 応答形式。「xml」「html」のいずれかを指定する。指定しない場合は「JSON」になる。 |
units | 任意 | 測定単位。「standard(標準)」「metric(メートル法)」「imperial(帝国単位)」のいずれかを指定。指定しない場合は「standard(標準)」 |
lang | 任意 | 出力言語(languageの略) |
APIレスポンス
APIで取得されるデータです。
「OpenWeatherMap」では、「XML形式」による提供もされていますが、こちらでは「JSON形式」での内容を掲載しています。
データ形式の違いについては、のちほどご説明します。
項目1 | 項目2 | 内容 |
coord | lon | 経度 |
lat | 緯度 | |
weather | id | 気象条件ID |
main | 気象パラメータのグループ(雨、雪、極端など) | |
description | グループ内の気象条件 | |
icon | 天気アイコンID | |
base | – | 内部パラメータ |
main | temp | 湿度(単位のデフォルト:ケルビン、メートル法:摂氏、インペリアル:華氏) |
feels_like | 人間の天気の知覚での温度(単位のデフォルト:ケルビン、メートル法:摂氏、インペリアル:華氏) | |
pressure | 大気圧(sea_levelまたはgrnd_levelデータがない場合は、海面上)、hPa | |
humidity | 湿度(%) | |
temp_min | 現時点での最低気温(単位のデフォルト:ケルビン、メートル法:摂氏、インペリアル:華氏) | |
temp_max | 時点での最高気温(単位のデフォルト:ケルビン、メートル法:摂氏、インペリアル:華氏) | |
sea_level | 海面の大気圧、hPa | |
grnd_level | 地表面の大気圧、hPa | |
visibility | – | 視程、メーター(視程の最大値は10km) |
wind | speed | 風速(単位デフォルト:メートル/秒、メートル法:メートル/秒、インペリアル:マイル/時) |
deg | 風向、度(気象) | |
gust | 突風(単位デフォルト:メートル/秒、メートル法:メートル/秒、インペリアル:マイル/時) | |
clouds | all | 曇り(%) |
rain | 1h | 過去1時間の雨量(mm) |
3h | 過去3時間の雨量(mm) | |
dt | – | データ計算の時間(UNIX、UTC) |
sys | type | 内部パラメータ |
id | 内部パラメータ | |
message | 内部パラメータ | |
country | 国コード(GB、JPなど) | |
sunrise | 日の出時刻(UNIX、UTC) | |
sunset | 日没時間(UNIX、UTC) | |
timezone | – | UTCから秒単位でシフト |
id | – | 都市ID |
name | – | 都市名 |
cod | – | 内部パラメータ |
APIキーの取得方法
こちらは「OpenWeatherMap」の「価格表」ですが、今回は左端の「無料」からAPIキーを取得します。
「APIキーを取得する」を選択して、必要情報を入力してアカウントを作成します。
作成したアカウントをつかってログイン後に「APIキー」を生成します。
「APIキー」のタブを選択して、「APIキー名」を入力して「生成」をクリックすれば「APIキー」を生成することができます。
「APIキー」は32桁の数字とアルファベット(小文字)の組合せで構成されているかと思います。後ほどプログラミングで使用しますので、メモ帳などに保存しておきましょう。
スポンサーリンク
JSONとは
「WebAP」で取得されるデータの形式として、代表的なものに「CSV形式」「XML形式」「JSON形式」があります。
それぞれのデータ形式の特徴はつぎのとおりです。
形式 | 特徴 |
CSV | CSVは「Comma Separated Value」の略称。 テキスト形式のデータをカンマ区切りにすることによって、表形式のデータを表現することができます。 |
XML | XMLは「Extensible Markup Language」の略称。 データ記述用のマークアップ言語で「タグ」をつかってデータを構造的に表現できます。 |
JSON | JSONは「JavaScript Object Notation」の略称。 JavaScriptのオブジェクト構文にもとづいてデータを構造的に表現できます。 |
こちらでは、シンプルで可読性が高いことを理由に「JSON」にてデータを取得する方法をご紹介します。
JSONとは「JavaScript Object Notation」の略称で、JavaScriptのオブジェクト構文にもとづいた構造的なテキスト形式のデータのことです。
JSONは、「ヒトが読みやすい」、「データが軽量」、「プログラムでデータを取り扱いやすい」などといった理由から、WebAPIでの利用されるケースが増えています。
JSONの取扱方法
PythonでつかえるJSONデータを取扱うための関数をご紹介します。
関数 | 内容 |
load | JSON形式のファイルを辞書型で読み込むための関数 |
loads | JSON形式の文字列を、辞書型、リスト型などに変換するための関数 |
dump | ファイルをJSON形式で出力するための関数 |
dumps | 辞書型、リスト型などの文字列をJSON形式に変換するための関数 |
load|JSONファイルの読込
JSONファイルを読込みます。
こちらのJSON形式のファイルをつかって確認をします。
import json a = open('sample.json') b = json.load(a) a.close() print (b) #出力値:{'user': 'Taro', 'age': 25, 'gender': 'Man'} type(b) #出力値:dict
loads|JSON形式の文字列を変換
JSON形式の文字列を変換します。
リスト形式の文字列がリスト型に変換されています。
import json list_form = '["num", {"one":["ichi", null, 3, 4.0]}]' type(list_form) #出力値:str j = json.loads(list_form) type(j) #出力値:list print(j) #出力値:['num', {'one': ['ichi', None, 3, 4.0]}]
dump|JSON形式で出力
JSON形式でファイルを書込みします。
import json data = { 'Name': 'Taro', 'Age': 10, } with open("result.json", "w") as f: json.dump(data, f)
ファイル名「result.json」の内容はこちらです。
dumps|文字列をJSON形式に変換
辞書型データをJSON形式に変換しています。
import json data = { 'Name': 'Taro', 'Age': 10, } type(data) # dict j = json.dumps(data) type(j) #出力値:str print(j) #出力値:{"Name": "Taro", "Age": 10}
APIの呼出|サンプルコード
具体的なサンプルコードをご紹介します。
手順1|必要なライブラリをインポート
まずは今回必要なライブラリをインポートします。
import pandas as pd import requests import datetime
手順2|APIキーを入力
アカウント作成後に取得したAPIキーを変数に代入します。
APIキーは、32桁の数字とアルファベット(小文字)の組合せで構成されています。
こちらに取得したAPIキーを入力してください。
API_KEY = ""
手順3|地理情報の入力
気象データの取得対象となる都市名を指定します。
city_name = ["Tokyo", "Osaka", "London"]
手順4|必要情報の選択
取得対象となる情報を格納するための変数を準備します。
APIレスポンスのなかから任意で選択した値を設定をします。
name = [] country = [] main = [] description = [] wind = [] temp = [] temp_max = [] temp_min = [] dt = []
手順5|必要情報の取得
繰返し処理をつかって「都市ごと」に情報の取得をおこないます。
取得したデータのなかから必要情報を抽出して、先ほどの手順で設定した変数に追加しています。
for i in city_name: api = "http://api.openweathermap.org/data/2.5/weather?units=metric&q=" + (i) + "&appid=" + API_KEY response = requests.get(api) data = response.json() name.append(data['name']) country.append(data['sys']['country']) main.append(data['weather'][0]['main']) description.append(data['weather'][0]['description']) wind.append(data['wind']['speed']) temp.append(data['main']['temp']) temp_max.append(data['main']['temp_max']) temp_min.append(data['main']['temp_min']) dt.append(data['dt'])
手順6|日付単位の変換
日付の取得データを「秒単位」から「日付単位」に変換します。
取得されるはデータは「1970年1月1日午前0時0分0秒」からの経過秒数ですので、「fromtimestamp」をつかって日付に変換をします。
dt_ch = [] for i in dt: dt_ch.append(datetime.datetime.fromtimestamp(i))
手順7|取得情報の集約
取得した情報を集約します。
data_list = [country, main, description, wind, temp, temp_max, temp_min, dt_ch]
手順8|行名の設定
取得情報の行名を設定します。
index = ["country", "weather_main", "weather_description", "wind", "temp", "temp_max", "temp_min", "dt_ch"]
手順9|データフレームの作成
「Pandas」をつかってデータフレーム形式に変換します。
df = pd.DataFrame(data_list, index=index, columns=name)
このような形で表現することができます。
手順10|データの出力
さいごに取得した情報をCSV形式で出力します。
df.to_csv("result_OpenWeatherMap.csv")
以下はExcelで開いていますが、このような形で出力されます。
まとめ
「OpenWeatherMap」を使って「WebAPI」をつかった具体的なデータ取得方法をご紹介しました。
今回ご紹介しました「OpenWeatherMap」以外にも無償のサービスはたくさんありますので、いろいろな「WebAPI」を積極的に活用してみてください。