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とは
urllib
はPythonの標準ライブラリで、URLを扱うためのモジュール群です。
これには、urllib.request
、urllib.parse
、urllib.error
、urllib.robotparser
などのサブモジュールが含まれます。urllib
を利用することで、HTTPリクエストの送信、URLの解析や構築、エラーハンドリング、robots.txt
の解析など、URLに関連する様々な操作を行うことができます。
今回紹介するサンプルコードでは、urllib.request
とurllib.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でデコードしてテキストとして出力します。このコードにより、簡単に特定の都市の天気予報情報を取得できます。
コード解説
- APIエントリーポイントの定義
- 天気予報APIのエントリーポイントURLを
API
変数に格納しています。この例では、https://weather.tsukumijima.net/api/forecast
がエントリーポイントとなります。
- 天気予報APIのエントリーポイントURLを
- パラメータの定義
- APIリクエストのパラメータを
paramValue
ディクショナリに定義しています。この例では、city
パラメータに230010
(名古屋のID)を指定しています。
- APIリクエストのパラメータを
- URLエンコード
urllib.parse.urlencode
関数を使用して、パラメータをURLエンコードします。これにより、パラメータがURLに適した形式に変換されます。
- リクエストURLの生成
- エントリーポイントのURLとURLエンコードされたパラメータを結合して、リクエスト用のURLを生成します。生成されたURLはコンソールに出力されます。
- データのリクエスト
urllib.request.urlopen
関数を使用して、生成されたURLにアクセスし、データをリクエストします。
- データのデコード
- 取得したバイナリデータを
decode
メソッドを使用してUTF-8にデコードし、テキストデータに変換します。
- 取得したバイナリデータを
- データの出力
- 最後に、取得・変換したテキストデータ(天気予報情報)をコンソールに出力します。
作成した全体のソースコード
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を利用して、様々なデータを取得し、新しいアプリケーションの開発や既存アプリケーションの機能拡張に活かしていただければ幸いです。
コメント