【Python】はじめてのWebAPI|JSONデータの取扱方法を解説

Python

「WebAPI」をつかえば、外部のWebサービスで公開されている情報のなかから必要情報を取得することができます。

こちらでは、PythonをつかったWebAPIでのデータ取得方法の具体例をご紹介をします。利用対象となるWebサービスは、天気情報を無料APIで公開されている「OpenWeatherMap」です。

現在、おおくのWebサービスからAPIが提供されています。
PythonのプログラムをつかってWebサービスから情報を取得する方法はいくつかありますが、いずれも「発信側」のサーバーに大小なりとも負荷を掛けることになります。
こういった点を少しでも解消するために「WebAPI」を活用して、情報の「発信側」としては比較的サーバーへの負荷を軽減することができるとともに、「受信側」としてもスムーズに情報を取得する方法が取られるケースが増えてきています。

ちなみに、「WebAPI」が有償ではなく無償で提供されている場合の背景として、情報の「発信側」として自社サービスの認知度をあげるための方法のひとつとして利用されている側面があります。そのため一部のサービスは、無償であっても双方にとってメリットのあるものとして成立しています。

ただし、「WebAPI」は「発信側」によって運営されている都合上、突然サービスが停止されるケースもあります。サービスが停止されるとWebAPIをつかった情報取得ができなくなりますので、ご利用の際にはあらかじめご留意ください。

「API」とは「Application Programming Interface」の略で、プログラムをつかって情報の「発信側」と「受信側」を接続することを意味します。
「WebAPI」とは、「発信側」と「受信側」の接続をWeb情報をやりとりするための規格である「HTTP(HTTPS)」をもちいる方法のことです。

スポンサーリンク

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内容
coordlon経度
 lat緯度
weatherid気象条件ID
 main気象パラメータのグループ(雨、雪、極端など)
 descriptionグループ内の気象条件
 icon天気アイコンID
base内部パラメータ
maintemp湿度(単位のデフォルト:ケルビン、メートル法:摂氏、インペリアル:華氏)
 feels_like人間の天気の知覚での温度(単位のデフォルト:ケルビン、メートル法:摂氏、インペリアル:華氏)
 pressure大気圧(sea_levelまたはgrnd_levelデータがない場合は、海面上)、hPa
 humidity湿度(%)
 temp_min現時点での最低気温(単位のデフォルト:ケルビン、メートル法:摂氏、インペリアル:華氏)
 temp_max時点での最高気温(単位のデフォルト:ケルビン、メートル法:摂氏、インペリアル:華氏)
 sea_level海面の大気圧、hPa
 grnd_level地表面の大気圧、hPa
visibility視程、メーター(視程の最大値は10km)
windspeed風速(単位デフォルト:メートル/秒、メートル法:メートル/秒、インペリアル:マイル/時)
 deg風向、度(気象)
 gust突風(単位デフォルト:メートル/秒、メートル法:メートル/秒、インペリアル:マイル/時)
cloudsall曇り(%)
rain1h過去1時間の雨量(mm)
 3h過去3時間の雨量(mm)
dtデータ計算の時間(UNIX、UTC)
systype内部パラメータ
 id内部パラメータ
 message内部パラメータ
 country国コード(GB、JPなど)
 sunrise日の出時刻(UNIX、UTC)
 sunset日没時間(UNIX、UTC)
timezoneUTCから秒単位でシフト
id都市ID
name都市名
cod内部パラメータ

APIキーの取得方法

こちらは「OpenWeatherMap」の「価格表」ですが、今回は左端の「無料」からAPIキーを取得します。

「APIキーを取得する」を選択して、必要情報を入力してアカウントを作成します。

作成したアカウントをつかってログイン後に「APIキー」を生成します。
「APIキー」のタブを選択して、「APIキー名」を入力して「生成」をクリックすれば「APIキー」を生成することができます。

「APIキー」は32桁の数字とアルファベット(小文字)の組合せで構成されているかと思います。後ほどプログラミングで使用しますので、メモ帳などに保存しておきましょう。

スポンサーリンク

JSONとは

「WebAP」で取得されるデータの形式として、代表的なものに「CSV形式」「XML形式」「JSON形式」があります。

それぞれのデータ形式の特徴はつぎのとおりです。

形式特徴
CSVCSVは「Comma Separated Value」の略称。
テキスト形式のデータをカンマ区切りにすることによって、表形式のデータを表現することができます。
XMLXMLは「Extensible Markup Language」の略称。
データ記述用のマークアップ言語で「タグ」をつかってデータを構造的に表現できます。
JSONJSONは「JavaScript Object Notation」の略称。
JavaScriptのオブジェクト構文にもとづいてデータを構造的に表現できます。

こちらでは、シンプルで可読性が高いことを理由に「JSON」にてデータを取得する方法をご紹介します。

JSONとは「JavaScript Object Notation」の略称で、JavaScriptのオブジェクト構文にもとづいた構造的なテキスト形式のデータのことです。
JSONは、「ヒトが読みやすい」、「データが軽量」、「プログラムでデータを取り扱いやすい」などといった理由から、WebAPIでの利用されるケースが増えています。

JSONの取扱方法

PythonでつかえるJSONデータを取扱うための関数をご紹介します。

関数内容
loadJSON形式のファイルを辞書型で読み込むための関数
loadsJSON形式の文字列を、辞書型、リスト型などに変換するための関数
dumpファイルをJSON形式で出力するための関数
dumps辞書型、リスト型などの文字列をJSON形式に変換するための関数

末尾に「s」が付いているものが「文字列」に関連して、付いていないものは「ファイル」に関連しています。
(『関数名の末尾の「s」は「string」の頭文字』として覚えておきましょう。)

load|JSONファイルの読込

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)

このような形で表現することができます。


「Pandas」の基本的な使い方は「【Python】初心者もこれで安心!Pandasの基本操作をまとめてご紹介」をご覧ください。

手順10|データの出力

さいごに取得した情報をCSV形式で出力します。

df.to_csv("result_OpenWeatherMap.csv")

以下はExcelで開いていますが、このような形で出力されます。

まとめ

「OpenWeatherMap」を使って「WebAPI」をつかった具体的なデータ取得方法をご紹介しました。

今回ご紹介しました「OpenWeatherMap」以外にも無償のサービスはたくさんありますので、いろいろな「WebAPI」を積極的に活用してみてください。