【Python】天気予報APIから予報データを取得する

  • URLをコピーしました!

こんにちは、むらさめです。さて今回から実際にプログラムのソースコードを書いていろいろ試していきたいと思います。
第1回目はWebAPIを使い天気予報サービスから予報のデータを取得するプログラムを作成してみようと思います。プログラミング言語はPythonです。

目次

WebAPIとは

Web APIとはあるサイトが備えている機能を、外部からも利用できるように公開するためのインタフェースです。
多くのWeb APIにはHTTP通信が利用されます。クライアントのプログラムはAPIを提供しているサーバーに対してHTTPリクエストを送信します。
呼び出し側が挙動や入力データを指定する引数は、URLパラメータなどの形でURLの一部として指定します。するとサーバーはクライアントにXMLやJSON形式の返信をします。

天気予報API

今回はこちらの天気予報 API(livedoor 天気互換)を使用させて頂きました。

APIから情報を取得するソースコード

今回作成したソースコードは以下の通りです。

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)
5行目:
今回使用するWebAPIのエントリーポイントとなるURLを指定しています。

8行目:
APIにリクエストを送信する際に使用するパラメータです。
天気予報APIでは取得したい予報データのエリアを指定します。今回は名古屋のIDを設定してみました。パラメータが複数ある場合には、続けて指定します。

14行目:
辞書型パラメータをurllib.parseモジュールを使ってURLエンコードします。

17行目:
リクエスト用URLを生成します。

21行目:
17行目で生成したURLを使用してリソースを取得し、read()メソッドでデータを読み出します。

24行目:
取得したデータはバイナリとなりますので、UTF-8にエンコードします。

取得結果

先ほど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を使ってWeb上のデータを取得するプログラムの作成例をご紹介しました。
WebAPIを使用すると、様々なWebサービスから欲しい情報を利用できるようになります。
JSONのデータ形式についてはまた別の記事で書きたいと思います。
それでは、また次の記事でお会いしましょう。

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