requests

【Python】OpenWeatherのAPI使用方法

【Python】OpenWeatherのAPI使用方法

Pythonを使ってOpenWeatherのAPIを使ったデータ取得をする方法を解説します。

OpenWeather

OpenWeatherは、グローバルな気象データサービスを提供する会社です。OpenWeatherサービスでは、世界中の天気予報、歴史的気象データ、気象条件のリアルタイムデータ、衛星画像、気象アラート、およびその他の気象関連情報を提供しています。

OpenWeatherでは、各種データへアクセスするためのRest APIを提供しているため、このAPIを使って独自のアプリケーションやサービスに気象データを組み込むことができるようになっています。

本記事では、Pythonを使ってOpenWeatherのAPIを使ったデータ取得をする方法について紹介します。

なお、APIの呼び出しでは、requestsモジュールを使います。この記事は、requestsモジュールを使ったAPI呼び出しの練習にもなります。なお、requestsモジュール基本的な使い方は「requestsの基本的な使い方」にまとめているので参考にしてください。

APIキーの取得方法

OpenWeatherのデータを使用するには、OpenWeatherのウェブサイトにアクセスしてアカウントを作成し、APIキーを取得しておく必要があります。ここで簡単に手順を紹介します。使用回数などの制限がありますが、無償で使用できるのでまずは登録して使ってみてもらえればと思います。

sign upのページへ行くと以下のようなアカウント登録の画面が表示されます。

OpenWeather アカウント作成

上記のページで、ユーザー名, メールアドレス、パスワードを入力します。年齢やプライバシーポリシー等のチェックがあるので確認してチェックを入れてください。

完了するとメールアドレス確認のメールが届きますので、確認を進めてください。その後、サイトに登録した情報でサインインして、API keysの項目を見るとAPIキーが表示されます。以降で、Pythonを使ったAPIの使い方を紹介しますが、その際にAPIキーが必要になります。

OpenWeather API Key

なお、OpenWeatherにはサブスクリプション版もあります。無償版とサブスクリプション版には、データ取得期間やAPI呼び出しの制限数に違いがあります。

記事執筆時点で、APIのページには「1,000 API calls per day for free」という記載があるため、無償版でも1日1,000回はAPIを呼び出すことが可能です。サブスクリプションを契約すると1,000回を超えた分に対して課金がされ「0.0012 GBP per API call over the daily limit」ということなので、追加のAPI呼び出し1回あたり0.0012イギリスポンド(GBP)の料金が発生するということになります。目的などにより必要に応じてサブスクリプション版も検討してもらえばよいと思います。

Pythonを使ってOpenWeatherのAPIを利用する

ここからはPythonでAPIを使ってデータを取得する方法について紹介していきます。OpenWeatherのAPIページには各種APIの説明があり、「API doc」をクリックすると各APIに関する詳細を確認できます。

現在の天気情報を取得する

ここでは、現在の天気情報が取得できるCurrent weather data APIを使用してみたいと思います。Current weather data APIのドキュメントページはこちらになります。APIの呼び出しでは、requestsモジュールを使います。基本的な使い方は「requestsの基本的な使い方」にまとめているので参考にしてください。

【設定ファイル】config.ini

[API]
key = xxxxxxxxxxxxxxxxxxxxxxxx
url_current_weather_data = https://api.openweathermap.org/data/2.5/weather

【現在の天気情報の取得】get_current_weather.py

import configparser
from pprint import pprint

import requests


def main():
    # APIキーの読み込み
    config = configparser.ConfigParser()
    config.read("./config.ini")
    api_key = config["API"]["key"]
    url_current_weather_data = config["API"]["url_current_weather_data"]

    # 東京 緯度: 35.6894 経度: 139.6917
    params = {
        "lat": 35.6894,
        "lon": 139.6917,
        "appid": api_key,
        "lang": "ja",
    }

    # データの取得
    response = requests.get(
        url_current_weather_data,
        params=params,
    )
    pprint(response.json())


if __name__ == "__main__":
    main()
【実行結果】
{'base': 'stations',
 'clouds': {'all': 20},
 'cod': 200,
 'coord': {'lat': 35.6894, 'lon': 139.6917},
 'dt': 1709940404,
 'id': 1850144,
 'main': {'feels_like': 275.9,
          'humidity': 64,
          'pressure': 1007,
          'temp': 279.33,
          'temp_max': 281.23,
          'temp_min': 276.9},
 'name': '東京都',
 'sys': {'country': 'JP',
         'id': 2001249,
         'sunrise': 1709931642,
         'sunset': 1709973787,
         'type': 2},
 'timezone': 32400,
 'visibility': 10000,
 'weather': [{'description': '薄い雲',
              'icon': '02d',
              'id': 801,
              'main': 'Clouds'}],
 'wind': {'deg': 340, 'speed': 5.14}}

上記例では、APIキーやAPIの対象URLをconfig.iniという設定ファイルにまとめておくように作成しています。キーの情報が入っているようなファイルは公開リポジトリなどにアップロードしないように注意してください。設定ファイルの扱いが分からない方は「configparserによる設定ファイル管理」を参考にしてください。

キーはそれぞれ取得した人により異なるので「key = xxxxxxxxxxxxxxxxxxxxxxxx」の部分に取得したAPIキーを入力してください。また「url_current_weather_data = https://api.openweathermap.org/data/2.5/weather」は現在の天気情報を取得するためのAPIのエンドポイントです。各APIごとにエンドポイントは異なります。

では、データを取得するプログラムを見ていきましょう。

    # 東京 緯度: 35.6894 経度: 139.6917
    params = {
        "lat": 35.6894,
        "lon": 139.6917,
        "appid": api_key,
        "lang": "ja",
    }

上記の部分は、APIに渡す条件の情報を辞書で指定してます。今回は東京の天気を取得しようと思うので緯度"lat": 35.6894、経度"lon": 139.6917を指定し、APPのキーを"appid": api_keyで指定します。また、言語としては日本語の"lang": "ja"を指定します。

    # データの取得
    response = requests.get(
        url_current_weather_data,
        params=params,
    )
    pprint(response.json())

データの取得は簡単です。requestsモジュールのget関数を用いて、APIのURLと条件となるparamsを指定します。取得された応答のjsonメソッドを使用することでJSON形式でのデータ取得が可能です。

結果を見てみると、東京都の天気情報が取得できていることが分かるかと思います。

地理情報を取得する

基本的には、上記のような使い方で各種APIを使用することができますが、もう一つ例を見てみましょう。東京の緯度・経度を入力して取得しましたが"tokyo"とかで取得できると便利ですよね。ただ、Current weather data APIには、直接指定できるパラメータはなく、ドキュメントではGeocoder APIを使用するように記載があります。

Geocoder API

Geocoder APIのDirect geocodingを使って、"tokyo"という文字列から緯度・経度の情報を取得してみましょう。

【設定ファイル】config.ini

[API]
key = xxxxxxxxxxxxxxxxxxxxxxxx
url_current_weather_data = https://api.openweathermap.org/data/2.5/weather
url_direct_geocoding = https://api.openweathermap.org/geo/1.0/direct

【地理情報の取得】get_geocode.py

import configparser
from pprint import pprint

import requests


def main():
    # APIキーの読み込み
    config = configparser.ConfigParser()
    config.read("./config.ini")
    api_key = config["API"]["key"]
    url_direct_geocoding = config["API"]["url_direct_geocoding"]

    # ===== 場所情報を取得
    params = {
        "q": "tokyo",
        "appid": api_key,
    }
    # データの取得
    response = requests.get(
        url_direct_geocoding,
        params=params,
    )
    pprint(response.json())


if __name__ == "__main__":
    main()
【実行結果】
[{'country': 'JP',
  'lat': 35.6828387,
  'local_names': {'ar': 'طوكيو',
                  'be': 'Токіа',
                  'bg': 'Токио',
                  'ca': 'Tòquio',
                  'cs': 'Tokio',
                  'cy': 'Tokyo',
                  'da': 'Tokyo',
                  'de': 'Tokio',
                  'el': 'Τόκιο',
                  'en': 'Tokyo',
                  'eo': 'Tokio',
                  'es': 'Tokio',
                  'et': 'Tōkyō',
                  'fa': 'توکیو',
                  'fi': 'Tokio',
                  'fr': 'Tokyo',
                  'he': 'טוקיו',
                  'hr': 'Tokio',
                  'hu': 'Tokió',
                  'ia': 'Tokyo',
                  'io': 'Tokyo',
                  'is': 'Tókýó',
                  'it': 'Tokyo',
                  'ja': '東京都',
                  'kn': 'ಟೋಕ್ಯೊ',
                  'ko': '도쿄도',
                  'ku': 'Tokyo',
                  'la': 'Tokium',
                  'lb': 'Tokio',
                  'lt': 'Tokijas',
                  'lv': 'Tokija',
                  'mi': 'Tōkio',
                  'mr': 'तोक्यो',
                  'nl': 'Tokio',
                  'oc': 'Tòquio',
                  'pl': 'Tokio',
                  'pt': 'Tóquio',
                  'ru': 'Токио',
                  'sk': 'Tokio',
                  'sl': 'Tokio',
                  'sr': 'Токио',
                  'sv': 'Tokyo',
                  'ta': 'டோக்கியோ',
                  'tg': 'Токио',
                  'th': 'โตเกียว',
                  'tr': 'Tokyo',
                  'uk': 'Токіо',
                  'vi': 'Tokyo',
                  'zh': '东京都/東京都'},
  'lon': 139.7594549,
  'name': 'Tokyo'}]

まずは、設定ファイルにエンドポイントのURLとして「url_direct_geocoding = https://api.openweathermap.org/geo/1.0/direct」を追記します。あとは、天気情報を取得した時とほとんど同じです。

    # ===== 場所情報を取得
    params = {
        "q": "tokyo",
        "appid": api_key,
    }
    # データの取得
    response = requests.get(
        url_direct_geocoding,
        params=params,
    )
    pprint(response.json())

"q"パラメータで"tokyo"を指定することで、結果として東京の緯度・経度や各国での名前に関する情報が取得できました。

上記で紹介してきたように各種APIを使うことで様々な情報が取得できます。APIは色々ありますが、基本的には同じように使うことができます。是非、色々とAPIを使ってみたり、組み合わせてみたりしてほしいと思います。

まとめ

Pythonを使ってOpenWeatherのAPIを使ったデータ取得をする方法を解説しました。

OpenWeatherは、グローバルな気象データサービスを提供する会社で、様様な気象関連情報をAPI経由で取得できます。現在の天気情報や地理情報を取得する例を使って基本的な使用方法を紹介しました。

この記事ではAPIの呼び出しで、requestsモジュールを使っています。requestsモジュールの使い方の練習にもなりますので、色々なAPIを試してみてください。