requests

【Python】OpenWeatherのAPI使用方法

【Python】OpenWeatherのAPI使用方法
naoki-hn

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

OpenWeather

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

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

この記事では、Python を使って OpenWeather の API を使ったデータ取得をする方法について紹介します。なお、APIの呼び出しでは、requestsモジュールを使います。

requests の基本的な使い方は「requestsの基本的な使い方」を参考にしてください。

API キーの取得方法

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

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

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 Docs」をクリックすると各 API に関する詳細を確認できます。

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

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

以降で紹介するプログラムは以下構成で配置されているものと思ってください。

 project/
├─ rest_api.py
├─ get_current_weather.py
├─ get_geocode.py
└─ config.ini

エンドポイントの設定とAPI キーの設定

config.ini

REST API では、エンドポイントとなる URL を指定します。URL は、config.ini フィルに記載しておくこととします。

[API]
url_current_weather_data = https://api.openweathermap.org/data/2.5/weather
環境変数としての API キー設定

API キーは、config.ini に記述することもできますが、GitHub などに誤って公開してしまうリスクがあります。そのため、実務では環境変数で管理する方法が推奨されます。この記事では環境変数に設定し、プログラムから読み込む方式で紹介します。

PowerShell で以下を実行します。キーの部分は、上記で取得した API キーの文字列を入力してください。

setx OPENWEATHER_API_KEY "あなたのAPIキー"

環境変数は、再起動後に反映されるため IDE やターミナルを再起動してください。設定されている内容は、以下で確認できます。

$env:OPENWEATHER_API_KEY

共通の API 呼び出し処理

REST API 呼び出しは、エンドポイントの URL とメソッド(GET / POST / PUT / DELETE など)により決まるため、共通処理の rest_api.py に定義しておき、以降で共通的に使用することとします。

rest_api.py
from typing import Any

import requests


def call_rest_api(
    method: str,
    url: str,
    params: dict[str, Any],
    timeout: int = 5,
) -> dict[str, Any]:
    """REST API を呼び出す

    Args:
        method (str): HTTP メソッド (例: "GET", "POST")
        url (str): API のエンドポイント URL
        params (dict[str, Any]): クエリパラメータ
        timeout (int, optional): タイムアウト時間 (秒). Defaults to 5.

    Raises:
        RuntimeError: API リクエスト中にエラーが発生した場合

    Returns:
        dict[str, Any]: API レスポンスの JSON データ
    """
    try:
        # APIリクエストの送信
        response = requests.request(
            method=method.upper(),
            url=url,
            params=params,
            timeout=timeout,
        )

        # HTTPエラーが発生した場合に例外をスロー
        response.raise_for_status()
        return response.json()

    except requests.exceptions.RequestException as ex:
        # エラーが発生した場合は、例外をスロー
        raise RuntimeError(f"API リクエスト中にエラーが発生しました: {ex}") from ex

call_rest_api 関数は、引数を受け取り、API のリクエストを送信して結果を返却します。内部では、requests モジュールの request 関数を使用しています。

HTTP リクエストでエラーが発生した場合は、raise_for_status で例外がスローされるため、RuntimeError として呼び出し元に例外を送出します。

現在天気情報の取得

get_current_weather.py

現在天気情報の取得は、共通関数の call_rest_api を呼び出して実行します。

import configparser
import os
from pprint import pprint

from rest_api import call_rest_api


def main():
    # REST API のエンドポイント URL を config.ini から読み込む
    config = configparser.ConfigParser()
    config.read("./config.ini")
    url_current_weather_data = config["API"]["url_current_weather_data"]

    # APIキーは環境変数から取得
    api_key = os.getenv("OPENWEATHER_API_KEY")
    if not api_key:
        print("APIキーが環境変数に設定されていません。")
        return

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

    try:
        # データの取得
        response = call_rest_api(
            method="GET",
            url=url_current_weather_data,
            params=params,
            timeout=5,
        )
    except Exception as ex:
        print(ex)
        return

    #  レスポンスを表示
    pprint(response)


if __name__ == "__main__":
    main()
【実行結果例】
{'base': 'stations',
 'clouds': {'all': 100},
 'cod': 200,
 'coord': {'lat': 35.69, 'lon': 139.69},
 'dt': 1774558836,
 'id': 1850144,
 'main': {'feels_like': 10,
          'grnd_level': 1012,
          'humidity': 84,
          'pressure': 1014,
          'sea_level': 1014,
          'temp': 10.68,
          'temp_max': 10.68,
          'temp_min': 10.68},
 'name': '東京都',
 'sys': {'country': 'JP', 'sunrise': 1774557338, 'sunset': 1774601863},
 'timezone': 32400,
 'visibility': 10000,
 'weather': [{'description': '厚い雲',
              'icon': '04d',
              'id': 804,
              'main': 'Clouds'}],
 'wind': {'deg': 353, 'gust': 5.51, 'speed': 3.46}}

REST API の対象エンドポイントを設定ファイル config.ini から読み込みます。また、API キーは、os.getenv("OPENWEATHER_API_KEY") で環境変数から取得します。

url_current_weather_data に設定している値は、現在の天気情報を取得するための API のエンドポイントです。機能ごとに API のエンドポイントは異なります。

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

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

また、"units": "metric" を指定することで、温度を摂氏(℃)の表示になるようにします。指定しない場合は、ケルビン(K)となってしまうので分かりにくくなります。

    try:
        # データの取得
        response = call_rest_api(
            method="GET",
            url=url_current_weather_data,
            params=params,
            timeout=5,
        )
    except Exception as ex:
        print(ex)
        return

    #  レスポンスを表示
    pprint(response)

データ取得は共通関数として定義した call_rest_api 関数を呼び出して結果を表示しています。結果では、東京都の天気情報が取得できていることが分かるかと思います。

地理情報を取得する

Geocoder API の使用

もう 1 つ例を見てみましょう。東京の緯度・経度を入力して取得しましたが "tokyo" という名称で取得できると便利です。ただ、Current weather data APIには、直接指定のパラメータはなく、Geocoder API を使用するように記載があります。

Geocoder API
Current weather data API ドキュメント より引用
(記事投稿時点の画像のため、内容は変更されている可能性があります。)

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

config.ini

設定ファイルに url_direct_geocoding の部分を追記してください。

[API]
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
import os
from pprint import pprint

from rest_api import call_rest_api


def main():
    # REST API のエンドポイント URL をconfig.ini から読み込む
    config = configparser.ConfigParser()
    config.read("./config.ini")
    url_direct_geocoding = config["API"]["url_direct_geocoding"]

    # APIキーは環境変数から取得
    api_key = os.getenv("OPENWEATHER_API_KEY")
    if not api_key:
        print("APIキーが環境変数に設定されていません。")
        return

    # ===== 場所情報を取得
    params = {
        "q": "tokyo",
        "appid": api_key,
    }

    try:
        # データの取得
        response = call_rest_api(
            method="GET",
            url=url_direct_geocoding,
            params=params,
            timeout=5,
        )
    except Exception as ex:
        print(ex)
        return

    # レスポンスを表示
    pprint(response)


if __name__ == "__main__":
    main()
【実行結果】
[{'country': 'JP',
  'lat': 35.6828387,
  'local_names': {'ar': 'طوكيو',
                  'be': 'Токіа',
...(途中省略)...
                  'is': 'Tókýó',
                  'it': 'Tokyo',
                  'ja': '東京都',
                  'kn': 'ಟೋಕ್ಯೊ',
                  'ko': '도쿄도',
...(途中省略)...
                  'vi': 'Tokyo',
                  'zh': '东京都/東京都'},
  'lon': 139.7594549,
  'name': 'Tokyo'}]

基本的な構成は、天気情報の取得と同様です。パラメータの設定では、"q" パラメータで "tokyo" を指定しました。

結果として東京の緯度・経度や各国での名前に関する情報が取得できました。この API は結果がリスト(配列)で返されるため、通常は最初の要素を使用します。

上記で紹介してきたように OpenWeather の各種 API を使うことで様々な情報が取得できます。API は他にも色々ありますが、同様の考え方で使用できます。是非、色々な API を組み合わせるなどして使ってみてください。

まとめ

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

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

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

ソースコード

上記で紹介しているソースコードについては GitHub にて公開しています。参考にしていただければと思います。

あわせて読みたい
【Python Tech】プログラミングガイド
【Python Tech】プログラミングガイド
ABOUT ME
ホッシー
ホッシー
システムエンジニア
はじめまして。当サイトをご覧いただきありがとうございます。 私は製造業のメーカーで、DX推進や業務システムの設計・開発・導入を担当しているシステムエンジニアです。これまでに転職も経験しており、以前は大手電機メーカーでシステム開発に携わっていました。

プログラミング言語はこれまでC、C++、JAVA等を扱ってきましたが、最近では特に機械学習等の分析でも注目されているPythonについてとても興味をもって取り組んでいます。これまでの経験をもとに、Pythonに興味を持つ方のお役に立てるような情報を発信していきたいと思います。どうぞよろしくお願いいたします。

※キャラクターデザイン:ゼイルン様
記事URLをコピーしました