Open Data API Portalの厚生労働省 新型コロナ関連オープンデータAPIを試してみる その1:APIの使い方を勉強

目次

Open Data API Portal

前回、内閣官房 情報通信技術(IT)総合戦略室が運営するAPIプラットフォームサイト Open Data API Portalに登録しました。

今回はOpen Data API PortalにあるAPIのうち、「厚生労働省 新型コロナ関連オープンデータAPI」を試していきましょう。

API keyが必要になりますので、まだ登録していなかったり、アプリの登録、API keyの取得をしていない人は、前回の記事を参考に登録・取得をしておいてください。

それでは始めていきましょう。

デモ用プログラムの確認

まずはデモ用プログラムの確認をしてみましょう。

デモ用プログラムの場所に関しては前回解説しましたが、おさらいということで再度解説していきます。

Open Data API Portalにアクセス。

上のメニューの「APIs」をクリック。

今回は「00 厚生労働省 新型コロナ関連オープンデータAPI」を使っていきますので、こちらをクリック。

とりあえず死亡者数のデータである「/death-case」を見てみましょう。

右上の四隅だけの四角マークをクリック。

今回言語はPythonですので、「PYTHON」をクリック。

こちらの赤枠内のプログラムがデモ用プログラムです。

デモ用プログラムを読み解いてみる

それではデモ用プログラムを読み解いていってみましょう。

# Demo code sample. Not indended for production use.

# See instructions for installing Requests module for Python
# http://docs.python-requests.org/en/master/user/install/

import requests

def execute():
  requestUrl = "https://api.opendata.go.jp/mhlw/death-cases?apikey=[YOUR_API_KEY]"
  requestHeaders = {
    "Accept": "application/json"
  }

  request = requests.get(requestUrl, headers=requestHeaders)

  print request.content

if __name__ == "__main__":
  execute()

最初に上の4行のコメントアウトしてある部分(頭に#がついている行)はプログラムではなくコメントですので飛ばします。

インポートはHTTPの制御を行う「request」のみです。

import requests

実行する関数として「execute」が定義されています。

def execute():

最後の2行をみると、main関数が定義されています。

if __name__ == "__main__":
  execute()

ということは「.pyファイル」を作成してダブルクリックで実行したり、他のプログラムから呼び出ししたりできるということです。

execute関数の中身を見ていきましょう。

まずはアクセスするURLの定義をしています。

requestUrl = "https://api.opendata.go.jp/mhlw/death-cases?apikey=[YOUR_API_KEY]"

このURLは先ほどのAPIの説明画面のこちらに記載されているものです。

URLの最後の方に「?apikey=[YOUR_API_KEY]」と書かれていますが、この[YOUR_API_KEY]の部分を自分のAPI keyに書き換えて使用します。

次に「requestHeaders」が定義されています。

  requestHeaders = {
    "Accept": "application/json"
  }

ここはよく分かりませんが、URLにアクセスして、情報の送信を要求した際に、どのような形式でファイルを送ってもらうかということのようです。

  request = requests.get(requestUrl, headers=requestHeaders)

  print request.content

そしてrequests.getを使って、URLにアクセスし、request.contentで情報の中身を取得し、print関数で表示しています。

ちなみにprint関数の書き方から、この記事を書いている2021年7月現在主流なPython3ではなく、Python2を使っているようです。

Python3の書き方としてはみなさんご存知の通り「print(request.content)」ですね。

プログラムを組み替えてみる

それではデモ用プログラムを元に自分が使いやすい形のプログラムに組み替えていきましょう。

ちなみに私が使い難いなと思った点はこの3点です。

  • 関数(main、execute)を使っている
  • API keyがURLに組み込まれている
  • 取得した情報がバイト形式になっている

ということでこんなプログラムに組み替えてみました。

import requests
import json

apikey = 'YOUR_API_KEY'

url = f'https://api.opendata.go.jp/mhlw/death-cases?apikey={apikey}'

requestHeaders = {
"Accept": "application/json"
}

request = requests.get(url, headers=requestHeaders)

if request.status_code == 200:
    data = json.loads(request.content.decode())
    print(data)
else:
    print(request.status_code)

まず全体として関数を使用せずに書き直しました。

APIに慣れていない今の段階では、私にはこちらの方が流れが分かりやすいです。

そしてAPI keyの部分は分割してこのようにしました。

apikey = 'YOUR_API_KEY'

url = f'https://api.opendata.go.jp/mhlw/death-cases?apikey={apikey}'

API keyを書き換えるときも楽ですし、例えば他のファイルに記載しておいて、読み込ませて使用する場合でも変数apikeyに格納すればいいだけなので楽です。

「if request.status_code == 200:」以降は結構サーバーがダウンしていることが多いことから、レスポンスによって場合分けした部分です。

if request.status_code == 200:
    data = json.loads(request.content.decode())
    print(data)
else:
    print(request.status_code)

もしサーバーがダウンしておらず、正常な情報が返ってきた場合、つまり「request.status_code == 200」だった場合は、「request.content.decode()」でバイト形式の文字を変換(デコード)します。

ちなみにデコードせずに「request.content」を表示するとこんな感じです。

print(request.content)

実行結果(適宜改行しています)
b'[{"\xe6\x97\xa5\xe4\xbb\x98":"2020/2/14","\xe6\xad\xbb\xe4\xba\xa1\xe8\x80
\x85\xe6\x95\xb0":"1"},{"\xe6\x97\xa5\xe4\xbb\x98":"2020/2/15","\xe6\xad\xbb
\xe4\xba\xa1\xe8\x80\x85\xe6\x95\xb0":"1"},{"\xe6\x97\xa5\xe4\xbb\x98":"2020
/2/16","\xe6\xad\xbb\xe4\xba\xa1\xe8\x80\x85\xe6\x95\xb0":"1"},{"\xe6\x97\xa5
\xe4\xbb\x98":"2020/2/17","\xe6\xad\xbb\xe4\xba\xa1\xe8\x80\x85\xe6\x95\xb0":
"1"},{"\xe6\x97\xa5\xe4\xbb\x98":"2020/2/18","\xe6\xad\xbb\xe4\xba\xa1\xe8\
x80\x85\xe6\x95\xb0":"1"},{"\xe6\x97\xa5\xe4\xbb\x98":"2020/2/19","\xe6\xad\
xbb\xe4\xba\xa1\xe8\x80\x85\xe6\x95\xb0":"1"},{"\xe6\x97\xa5\xe4\xbb\x98":"
2020/2/20","\xe6\xad\xbb\xe4\xba\xa1\xe8\x80\x85\xe6\x95\xb0":"1"},{"\xe6\x97
\xa5\xe4\xbb\x98":"2020/2/21","\xe6\xad\xbb\xe4\xba\xa1\xe8\x80\x85\xe6\x95\x
b0":"1"},{"\xe6\x97\xa5\xe4\x (以下略)

頭のb’はバイト形式の文字であることを示しています。

変換するとデータはJSON形式なっているので、json.loadsで読み込み、変数dataに格納しました。

data = json.loads(request.content.decode())

こうすることで全体を表示するにはこうします。

print(data)

実行結果
[{'日付': '2020/2/14', '死亡者数': '1'}, {'日付': '2020/2/15', '死亡者数': '1'}, 
{'日付': '2020/2/16', '死亡者数': '1'}, {'日付': '2020/2/17', '死亡者数': '1'}, 
{'日付': '2020/2/18', '死亡者数': '1'}, {'日付': '2020/2/19', '死亡者数': '1'}, 
{'日付': '2020/2/20', '死亡者数': '1'}, {'日付': '2020/2/21', '死亡者数': '1'}, 
{'日付': '2020/2/22', '死亡者数': '1'}, {'日付': '2020/2/23', '死亡者数': '1'},
 {'日付': '2020/2/24', '死亡者数': '1'}, (以下略)

また1日毎のデータはリスト形式として、古い順に保存されていますので、特定の日を取得したい場合はこのように取得します。

print(data[0])

実行結果
{'日付': '2020/2/15', '死亡者数': '1'}

リスト内のそれぞれの要素は辞書形式で「日付」と「死亡者数」が保存されているので、それぞれ取得したい場合はこのようにします。

print(data[0]['日付'])

実行結果
2020/2/14
print(data[0]['死亡者数'])

実行結果
1

ちなみにサーバーがダウンしている場合はそのステータスが表示されます。

if request.status_code == 200:
    data = json.loads(request.content.decode())
    print(data)
else:
    print(request.status_code)

実行結果
503

これでだいぶ使いやすくなりました。

このように「503」が表示された場合は、サーバーがパンクしていますので、また時間が経ってから試してみてください。

これでデータの取得方法は分かりました。

次回は取得したデータからグラフを作成していきましょう。

ではでは今回はこんな感じで。

よかったらシェアしてね!

コメント

コメントする

目次
閉じる