少し前のこと、気象庁のWebサイトが大幅リニューアルされて「天気予報APIが公開された」とTwitterで話題になった。実際にはWeb APIが公開された訳ではないのだが、確かに天気予報が取得できる。しかも出典さえ記載すれば商用利用も可能とのこと。今回はPythonで気象庁の天気予報APIを使ってみよう。
天気予報APIが発見された経緯
なお、冒頭で紹介したように、気象庁の天気予報APIは実際にWeb APIとして公式に公開されたものではない。それを確認するために、こちらの気象庁の天気予報のサイトを確認してみよう。ソースコードを見ると分かるが、このページ自体には天気予報情報が埋め込まれてなく画面を生成するJavaScriptが記述されているのみだ。
天気情報が表示される仕組みだが、JavaScriptがサーバーから天気情報をAjaxによって読み出し、読み出したデータを加工して、画面に表として出力するものとなっている。こうした構成のWebサイトはSPAと呼ばれ珍しいものではない。
ただし、JavaScriptがサーバーから読み出しているデータは、汎用的なJSONデータであるというのがポイントだ。サーバーが出力している天気情報のJSONデータを自分のプログラムで読み出して加工することで、好きな情報を取り出して自分のプログラム内で利用することができる。つまり、Web APIのように利用できるという訳だ。
そして、このAPIを自由に使って良いのかという点について、気象庁の方が下記のようにTwitterに投稿している。
> 仕様の継続性や運用状況のお知らせを気象庁はお約束していないという意味で、APIではないと申し上げざるを得ないのですが、一方で政府標準利用規約に準拠してご利用いただけます。(https://twitter.com/e_toyoda/status/1364504338572410885)
言い換えるなら、気象庁のホームページの利用規約に反しない限り自由に使って良さそうだ。
それでは、予告なく仕様が変わる可能性があるという点を考慮しつつ使ってみよう。
PythonでJSONファイルをダウンロードしよう
まずは、気象庁の天気予報JSONデータをダウンロードしてみよう。PythonのIDLEを起動したら、以下のプログラム(download.py)を入力して実行してみよう。
import urllib.request as req
# URLや保存ファイル名を指定
url = 'https://www.jma.go.jp/bosai/forecast/data/forecast/010000.json'
filename = 'tenki.json'
# ダウンロード
req.urlretrieve(url, filename)
上記プログラムが正しく実行されると、気象庁のページから天気予報の情報をダウンロードし、「tenki.json」という名前のファイルに保存される。
なおダウンロードに関するプログラムを実行すると、希に以下のようなエラーが出ることがある。
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)
これは、SSLの証明書が古いために表示されるエラーであり、PythonのSSL証明書を更新すれば解消する。エラーが出た場合、WindowsならPowerShell、macOSならターミナル.appを開いて以下のコマンドを実行しよう。
# Windowsの場合
pip install --upgrade certifi
# macOSの場合
pip3 install --upgrade certifi
なお、どんなJSONファイルが取得できたのか確認してみましょう。
ChromeブラウザにJSON Viewerをインストールしてあれば、このファイルをドラッグで内容を手軽に確認できる。なお、拡張機能の設定で「ファイルのURLへのアクセスを許可する」をオンにする必要がある。するとローカルにあるJSONファイルも確認できるようになる。
PythonでJSONファイルを読み込もう
なお、JSONは汎用的なファイル形式なので、Pythonの標準ライブラリのみで手軽に読み取りが可能だ。 以下のプログラムはJSONファイルを読み出して、内容を確認しながら天気情報を画面に出力する例だ。
同じくIDLEを起動したら、先ほどのプログラム(read_weather.py)と同じフォルダに保存して実行してみよう。
import json
# ダウンロードしたファイルを開く --- (*1)
with open('tenki.json', 'r', encoding="UTF-8") as f:
data = json.load(f)
# 読み出したデータを解析 --- (*2)
for area in data:
name = area['name']
print("[", name, "]")
for ts in area['srf']['timeSeries']:
times = [n for n in ts['timeDefines']]
if 'weathers' in ts['areas']:
for i,v in enumerate(ts['areas']['weathers']):
print(times[i], ":", v)
IDLEで実行すると以下のように表示される。
プログラムを確認してみよう。と言っても、(*1)の部分でダウンロードしたJSONファイルを読み込みPythonのリスト型と辞書型にパースする。
そして(*2)でパース結果を基にして地域や天気情報を取り出して表示する。JSON Viewerを見ながら少しずつJSONデータを確認していくことで任意の天気情報を取り出すことができる。もし、気象庁の天気APIの形式が変わったなら、この部分を調整することで対処できるだろう。
まとめ
以上、今回は気象庁のAPIを利用して天気予報の情報を読み出す方法について紹介した。もちろん非公式なAPIであるが、データ自体は商用利用も可能ということで、使い勝手の良いデータであるのは確かだ。なお、上記のプログラムでは、JSONデータの一部分だけを表示したもので、最低気温、最高気温、降水確率などの情報も含まれているので利用してみよう。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。