お天気情報の取得でAPI入門【python,JSON,API】

お天気情報の取得でAPI入門

APIってなんですか?ときかれたら、僕にもわかりません。となってしまいます。しかし待ってください。ひとつ言えることは、APIが何らかのデータを返すということでしょう。

APIが扱えるデータは決まっています。

  • 文字列
  • 整数
  • 浮動小数点
  • ブール値
  • リスト
  • 辞書
  • None

これらのデータがAPIが扱えるデータとなっているようです。逆に言えばこれ以外のデータは扱えないようです。今回はAPIを提供しているWeather API – OpenWeatherMapというサイトからお天気を取得するプログラムでAPI入門したいと思います。ただ、はじめるにあたっての下準備と必要となる知識が若干多いです。

お天気情報の取得でAPI入門【python,JSON,API】で必要となる知識

  • pythonのリスト及び辞書
  • pythonのモジュール(requests, sys)
  • JSONデータ(javascriptで書かれているらしいです。)あまり細かいことは気にしなくてよいみたいです。APIがJSONを扱っている場合があるようです。
  • openweathermapのAPIを使うには会員登録が必要(面倒な方はここで挫折すると思います。)

お天気情報の取得コード

今回はサンプルコードは「書籍:退屈なことをpythonに~」のgithubを参照してください。コードを貼り付けるのも野暮です。

automatestuff-ja/quickWeather.py at master · oreilly-japan/automatestuff-ja · GitHub

OpenWeatherMapからお天気情報を取得するにはAPIを使用する

プログラムは動きましたが、APIの操作に関して体系的に説明されてないです。なので説明しようにも動きましたという報告しかできません。ただひとつ言えることはAPIを扱うときは、必ずAPIを提供しているサイトの「ドキュメント」を見ることです。

oreilly-japanのサンプルコードはurl表記が公式ドキュメントと違います。これは本が発売されてから日が経っているというのが考えられます。そもそも「APIを使う」という表現があっているかどうかがわかりません。

例をみてください。

#これはプログラムの一部ですので動きません。
APPID='ここにAPIのキーが入ります'
assert APPID != '', 'APPIDを定義してください。'

# OpenWeatherMap.orgのAPIからJSONデータをダウンロードする
url ='http://api.openweathermap.org/data/2.5/forecast?q={}&appid={}'.format(location, APPID)

2行目と6行目を見てください。2行目でAPIキーを変数に代入して、6行目の最後でAPIキーをurlに追加しています。.format()関数の役割は、引数の部分が { ここにはいります。}

わかりにくいかもしれませんが、APPIDとlocationが合体されたものがurlになるというだけです。結果的には「APIを使う」といってもAPIキーがurlの一部に組み込まれているだけです。APIの使い方の一例にすぎないのかもしれませんが拍子抜けでした。

このプログラムを動作させるにはsysモジュールの知識とそれに付随するコマンドライン引数という知識が必要になります。これは少し長くなってしまいますので省略します。ですが、まだみてください。サンプルとして、JSONデータだけ取ってきてpprintで見てみましょう。

APIを使用してJSONデータを取得するだけのプログラムを貼り付けておきます。(APIキーは秘密キーなので外部に公開できません。自分で取ってください)

openweathermapより

#JSON形式データpprintで表示
import json, requests, pprint
APPID = ''#APIキーの定義
url ='http://api.openweathermap.org/data/2.5/forecast?q={}&appid={}'.format('Japan, JP', APPID)
#api.openweathermap.org/data/2.5/forecast?q= {都市名}、{国コード}5日バージョン
response = requests.get(url)
response.raise_for_status()

weather_data = json.loads(response.text)
print(type(weather_data))
pprint.pprint(weather_data)