PythonでWebAPIから天気予報データを取得する方法

※本ページはアフィリエイト広告を利用しています

Pythonは、その読みやすさと多様性から多くの開発プロジェクトで使用されるようになっています。特に、WebAPIを利用したデータの取得や処理は、様々なアプリケーション開発で重要な要素となっています。

本記事では、Pythonを使用して、WebAPIから天気情報を取得する具体的な方法について解説します。

具体的には、urllibライブラリを用いて、特定の都市の天気予報情報を取得するシンプルなサンプルコードを紹介し、そのコードの各部分の処理内容について詳しく説明します。

この記事でわかること
  • WebAPIの概要
  • urllibの基本的な機能
  • urllibを使用してWebAPIにアクセスするたのめPythonコード
  • 天気予報APIから取得できるデータ

urllibはWebAPIにアクセスする上で必須の知識となりますので、ぜひ実際にコードを動かして確認してみてください。

目次

WebAPI(Web Application Programming Interface)とは

WebAPI(Web Application Programming Interface)は、ウェブサイトやウェブアプリケーションが外部のサービスやデータと通信するためのインターフェースです。

WebAPIを利用することで、開発者は異なるソフトウェアアプリケーション間でデータを簡単に共有・交換できます。これにより、ユーザーは様々なサービスや情報を一つのプラットフォーム上で利用できるようになります。

urllibとは

urllibPythonの標準ライブラリで、URLを扱うためのモジュール群です。

これには、urllib.requesturllib.parseurllib.errorurllib.robotparserなどのサブモジュールが含まれます。

urllibを利用することで、HTTPリクエストの送信、URLの解析や構築、エラーハンドリング、robots.txtの解析など、URLに関連する様々な操作を行うことができます。

今回紹介するサンプルコードでは、urllib.requesturllib.parseを使用します。

urllib.request

urllib.requestモジュールは、URLを開くためのインターフェースを提供します。

このモジュールを使用することで、Webサイトにアクセスし、HTTPリクエストを送信できます。また、urlopen関数を使用してURLを開くことができ、これにより得られるオブジェクトからデータを読み取ることができます。

urllib.parse

urllib.parseモジュールは、URLの解析と構築を行うためのツールを提供します。

このモジュールのurlencode関数は、パラメータをURLエンコードするのに使用されます。これにより、パラメータをURLに適した形式に変換できます。

作成したPythonコード

今回紹介するPythonコードは、urllibを利用して天気予報APIから名古屋の天気情報を取得します。

API変数にエントリーポイントを定義し、paramValueでパラメータを設定。これをURLエンコードし、リクエストURLを生成。

urlopenでURLにアクセスし、取得したバイナリデータをUTF-8でデコードしてテキストとして出力します。このコードにより、簡単に特定の都市の天気予報情報を取得できます。

コード解説

  1. APIエントリーポイントの定義
    • 天気予報APIのエントリーポイントURLをAPI変数に格納しています。この例では、https://weather.tsukumijima.net/api/forecastがエントリーポイントとなります。
  2. パラメータの定義
    • APIリクエストのパラメータをparamValueディクショナリに定義しています。この例では、cityパラメータに230010(名古屋のID)を指定しています。
  3. URLエンコード
    • urllib.parse.urlencode関数を使用して、パラメータをURLエンコードします。これにより、パラメータがURLに適した形式に変換されます。
  4. リクエストURLの生成
    • エントリーポイントのURLとURLエンコードされたパラメータを結合して、リクエスト用のURLを生成します。生成されたURLはコンソールに出力されます。
  5. データのリクエスト
    • urllib.request.urlopen関数を使用して、生成されたURLにアクセスし、データをリクエストします。
  6. データのデコード
    • 取得したバイナリデータをdecodeメソッドを使用してUTF-8にデコードし、テキストデータに変換します。
  7. データの出力
    • 最後に、取得・変換したテキストデータ(天気予報情報)をコンソールに出力します。

作成した全体のソースコード

import urllib.request
import urllib.parse

#天気予報APIのエントリーポイント
API = "https://weather.tsukumijima.net/api/forecast"

#パラメータを定義
paramValue = {
	#名古屋のIDを指定
	'city': '230010'
}

#パラメータをURLエンコードする
params = urllib.parse.urlencode(paramValue)

#リクエスト用のURL生成
url = API + "?" + params
print("url = ", url)

#データをリクエスト
data = urllib.request.urlopen(url).read()

#取得したバイナリデータをUTF-8にエンコード
text = data.decode("utf-8")

#テキストとして表示
print(text)

実行結果

先ほどPythonで記述したプログラムを実行し、以下のような天気予報データが取得できました。データはJSON形式となります。

{
    "publicTime": "2021-12-11T17:00:00+09:00",
    "publicTimeFormatted": "2021/12/11 17:00:00",
    "publishingOffice": "名古屋地方気象台",
    "title": "愛知県 名古屋 の天気",
    "link": "https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=230000",
    "description": {
        "publicTime": "2021-12-11T16:33:00+09:00",
        "publicTimeFormatted": "2021/12/11 16:33:00",
        "headlineText": "",
        "bodyText": " 本州付近は、大陸の高気圧に覆われています。\n\n 東海地方は、晴れまたは曇りとなっています。\n\n 11日の東海地方は、高気圧に覆われて晴れますが、気圧の谷や湿った空気の影響で雲の広がる所
があるでしょう。\n\n 12日の東海地方は、高気圧に覆われて晴れる所もありますが、前線や湿った空気の影響で雲が広がりやすく、夕方から雨や雪の降る所がある見込みです。",
        "text": "\n\n 本州付近は、大陸の高気圧に覆われています。\n\n 東海地方は、晴れまたは曇りとなっています。\n\n 11日の東海地方は、高気圧に覆われて晴れますが、気圧の谷や湿った空気の影響で雲の広がる所
があるでしょう。\n\n 12日の東海地方は、高気圧に覆われて晴れる所もありますが、前線や湿った空気の影響で雲が広がりやすく、夕方から雨や雪の降る所がある見込みです。"
    },
    "forecasts": [
        {
            "date": "2021-12-11",
            "dateLabel": "今日",
            "telop": "晴のち曇",
            "detail": {
                "weather": "晴れ 夜遅く くもり",
                "wind": "北西の風 後 西の風",
                "wave": "0.5メートル"
            },
            "temperature": {
                "min": {
                    "celsius": null,
                    "fahrenheit": null
                },
                "max": {
                    "celsius": null,
                    "fahrenheit": null
                }
            },
            "chanceOfRain": {
                "T00_06": "--%",
                "T06_12": "--%",
                "T12_18": "--%",
                "T18_24": "0%"
            },
            "image": {
                "title": "晴のち曇",
                "url": "https://www.jma.go.jp/bosai/forecast/img/110.svg",
                "width": 80,
                "height": 60
            }
        },
        {
            "date": "2021-12-12",
            "dateLabel": "明日",
            "telop": "曇時々晴",
            "detail": {
                "weather": "くもり 昼前 まで 時々 晴れ 所により 夜 雨",
                "wind": "北の風 後 北西の風 海上 では 後 北西の風 やや強く",
                "wave": "0.5メートル"
            },
            "temperature": {
                "min": {
                    "celsius": "6",
                    "fahrenheit": "42.8"
                },
                "max": {
                    "celsius": "16",
                    "fahrenheit": "60.8"
                }
            },
            "chanceOfRain": {
                "T00_06": "0%",
                "T06_12": "0%",
                "T12_18": "10%",
                "T18_24": "20%"
            },
            "image": {
                "title": "曇時々晴",
                "url": "https://www.jma.go.jp/bosai/forecast/img/201.svg",
                "width": 80,
                "height": 60
            }
        },
        {
            "date": "2021-12-13",
            "dateLabel": "明後日",
            "telop": "晴時々曇",
            "detail": {
                "weather": "晴れ 時々 くもり",
                "wind": "北西の風",
                "wave": "1メートル"
            },
            "temperature": {
                "min": {
                    "celsius": "3",
                    "fahrenheit": "37.4"
                },
                "max": {
                    "celsius": "11",
                    "fahrenheit": "51.8"
                }
            },
            "chanceOfRain": {
                "T00_06": "10%",
                "T06_12": "10%",
                "T12_18": "10%",
                "T18_24": "10%"
            },
            "image": {
                "title": "晴時々曇",
                "url": "https://www.jma.go.jp/bosai/forecast/img/101.svg",
                "width": 80,
                "height": 60
            }
        }
    ],
    "location": {
        "area": "中部",
        "prefecture": "愛知県",
        "district": "西部",
        "city": "名古屋"
    },
    "copyright": {
        "title": "(C) 天気予報 API(livedoor 天気互換)",
        "link": "https://weather.tsukumijima.net/",
        "image": {
            "title": "天気予報 API(livedoor 天気互換)",
            "link": "https://weather.tsukumijima.net/",
            "url": "https://weather.tsukumijima.net/logo.png",
            "width": 120,
            "height": 120
        },
        "provider": [
            {
                "link": "https://www.jma.go.jp/jma/",
                "name": "気象庁 Japan Meteorological Agency",
                "note": "気象庁 HP にて配信されている天気予報を JSON データへ編集しています。"
            }
        ]
    }
}

まとめ

本記事では、Pythonのurllibライブラリを使用して、WebAPIから天気情報を取得する方法を解説しました。

サンプルコードを通じて、APIのエントリーポイントの定義、パラメータの設定とエンコード、URLの生成、データのリクエストとデコードなど、APIからデータを取得する基本的な流れを理解することができたと思います。

この知識を基に、さまざまなWebAPIを利用して、様々なデータを取得し、新しいアプリケーションの開発や既存アプリケーションの機能拡張に活かしていただければ幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次