
Python勉強し始めたのはいいんだけど、なんか実際の生活に役立てられないかな?例えば、Pythonで天気予報を取得してみたりとか…

APIって聞いたことはあるけど、仕組みとか実際の使い方とか分からないな…
この記事では、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に接続すると天気予報の情報を返す」という機能を持った窓口を開いています。
詳しく言うと、「http://weather.livedoor.com/forecast/webservice/json/v1?city=130010
」というURLを叩くと、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日は波がやや高いでしょう。船舶は 高波に注意してください。
今回は東京の天気予報を取得するために「http://weather.livedoor.com/forecast/webservice/json/v1?city=130010」というURLを使用しました。他の地域の天気予報を取得するにはlivedoorお天気webサービス地域ID一覧からIDを取得し、URLパラメータcityの値にIDを設定します。
まとめ
Pythonでお天気情報を取得する方法を解説しました。APIと聞くと難しそうなイメージがありますが、今回扱ったようにURLを叩くだけで簡単に利用できるものもあります。以下の記事を参考に、Herokuと組み合わせれば毎日決まった時間に天気情報をツイートできるので、そんな使い方をしてみるのも面白いかもしれません。
Pythonで作ったTwittter botをHerokuで定期実行する方法【Windows版】
コメント