この記事では、Pythonで天気予報を取得する方法について解説します。APIの基本的な仕組みについても併せて解説しているので、「APIって名前だけ聞いたことあるけど、どういう仕組みで動いているの?」と疑問に思っている方は必見です。
- 内容
- Pythonで天気予報を取得する方法
- APIの基本的な仕組み
- 実行環境
- Windows 10
- Python 3.7
Pythonで天気予報を取得する仕組みの解説
Pythonで天気予報を取得するためには、APIを使用します。APIとはApplicationn Programing Interfaceの略で、「アプリケーションをプログラミングで使用するためのインタフェース」という意味です。簡単に説明すると、アプリケーションの機能を外部から利用する際の窓口、それがAPIです。
そのAPIの中でもよく使われるのがWeb APIというWeb上で使用するAPIです。今回もWeb APIのサービスを使用して天気予報を取得します。このAPIは「あるURLに接続すると天気予報の情報を返す」という機能を持った窓口を開いています。
このURLにリクエストを送信します。
http://weather.livedoor.com/forecast/webservice/json/v1?city=130010
すると、json形式で以下のような情報が返って来ます。
{
"location": {
"city": "東京",
"area": "関東",
"prefecture": "東京都"
},
"publicTime": "2019-10-28T05:00:00+0900",
"copyright": {
"provider": [
{
"link": "http://tenki.jp/",
"name": "日本気象協会"
}
],
"link": "http://weather.livedoor.com/",
"title": "(C) LINE Corporation",
"image": {
"width": 118,
"link": "http://weather.livedoor.com/",
"url": "http://weather.livedoor.com/img/cmn/livedoor.gif",
"title": "livedoor 天気情報",
"height": 26
}
},
"title": "東京都 東京 の天気",
"description": {
"text": " 前線が本州の南岸に停滞しています。また、関東甲信地方を上空の気圧の谷が通過中です。一方、東シナ海には高気圧があって東へ移動しています。\n\n 東京 地方は、おおむね曇りとなっています。\n\n 28日は、高気圧に覆われて晴れま すが、気圧の谷や湿った空気の影響により朝晩を中心に曇るでしょう。伊豆諸島南部では雨や雷雨となる所がある見込みです。\n\n 29日は、前線や低気圧が伊豆諸島付近を通過する見込みです。このため曇り時々雨となるでしょう。伊豆諸島では雷を伴い激しく降る所がある見込みです。\n\n<天気変化等の留意点>\n 28日は、晴れで朝晩は曇りとなるでしょう。\n 29日は、曇り時々雨となるでしょう。\n(雨の予想)\n 28日06時から29日06時までに予想される24時間降水量は、多い所で、\n 東京地方 10ミリ\nの見込みです。\n\n【関東甲信地方】\n 関東甲信地方は、おおむね曇りで、伊豆諸島では雨の降っている所があります。\n\n 28日は、高気圧に覆われて晴れますが、気圧の谷や湿った空気の影響により朝晩を中心に曇るでしょう。伊豆諸島では雨や雷雨となる所がある見込み です。\n\n 29日は、前線や低気圧が伊豆諸島付近を通過する見込みです。このため曇りで断続的に雨となり、伊豆諸島では雷を伴い激しく降る所があるでしょう。\n\n 関東地方と伊豆諸島の海上では、うねりを伴い、28日は波が高く、29日は波がやや高いでしょう。船舶は高波に注意してください。",
"publicTime": "2019-10-28T04:37:00+0900"
}
}
余談ですが、jsonの整形にはこちらのサービスが役立ちます。ページ内のテキストボックスにjson形式の文字列を入力するだけで自動整形してくれます。
JSON Pretty Linter Ver3
天気情報を取得するPythonスクリプト
それでは、Pythonで天気予報を取得する方法について解説していきます。今回はlivedoorが提供しているWeather Hacksという天気予報サービス(Web API)を利用します。
import json
import requests
def get_weather():
url = 'http://weather.livedoor.com/forecast/webservice/json/v1'
# 東京のcityタグのid
payload = {'city': '130010'}
# お天気情報をjsonで取得
data = requests.get(url, params=payload).json()
# お天気情報を出力
print('以下が{}の天気情報になります。\n'.format(data['location']['city']))
for weather in data['forecasts']:
print('{}の天気は、{}でしょう。'.format(weather['dateLabel'], weather['telop']))
print('\n' + data['description']['text'])
if __name__ == '__main__':
get_weather()
このスクリプトを実行すると、以下のように出力されます。
以下が東京の天気情報になります。
今日の天気は、晴時々曇でしょう。
明日の天気は、曇時々雨でしょう。
前線が本州の南岸に停滞しています。また、関東甲信
を上空の気圧の谷が通過中です。一方、東シナ海には
があって東へ移動しています。
東京地方は、おおむね曇りとなっています。
28日は、高気圧に覆われて晴れますが、気圧の谷や湿
空気の影響により朝晩を中心に曇るでしょう。伊豆諸
では雨や雷雨となる所がある見込みです。
29日は、前線や低気圧が伊豆諸島付近を通過する見込
29日は、前線や低気圧が伊豆諸島付近を通過する見込
29日は、曇り時々雨となるでしょう。
(雨の予想)
28日06時から29日06時までに予想される24時間降水
量は、多い所で、
東京地方 10ミリ
の見込みです。
【関東甲信地方】
関東甲信地方は、おおむね曇りで、伊豆諸島では雨
の降っている所があります。
28日は、高気圧に覆われて晴れますが、気圧の谷や
湿った空気の影響により朝晩を中心に曇るでしょう。
伊豆諸島では雨や雷雨となる所がある見込みです。
29日は、前線や低気圧が伊豆諸島付近を通過する見
込みです。このため曇りで断続的に雨となり、伊豆諸
島では雷を伴い激しく降る所があるでしょう。
関東地方と伊豆諸島の海上では、うねりを伴い、28
日は波が高く、29日は波がやや高いでしょう。船舶は
高波に注意してください。
今回は東京の天気予報を取得するために次のURLを使いました。
http://weather.livedoor.com/forecast/webservice/json/v1?city=130010
他の地域の天気予報を取得するにはlivedoorお天気webサービス地域ID一覧からIDを取得し、URLパラメータcityの値にIDを設定します。