livedoor社が提供する天気予報Webサービス「Weather Hacks」を使い、天気情報を取得してみようと思います。WebAPIの仕様などがここに書かれているので読んでみてください。
では、やっていきます。
情報を取得する地域を決める
各地域ごとに識別用のidが割り当てられており、idを指定して目的の地域の天気情報を取得します。id一覧で情報を取得したい地域のidを調べます。
<pref title="滋賀県">
<warn title="警報・注意報" source="http://weather.livedoor.com/forecast/rss/warn/25.xml"/>
<city title="大津" id="250010" source="http://weather.livedoor.com/forecast/rss/area/250010.xml"/>
<city title="彦根" id="250020" source="http://weather.livedoor.com/forecast/rss/area/250020.xml"/>
</pref>
私は「大津」の天気情報を取得することにします。
情報を知るためのURLを作成する
WebAPIのURLにrequestsのget()メソッドでのGETリクエストを送信し、天気データを取得します。そのためには、先程取得した地域idを伝える必要があります。
WebAPI→http://weather.livedoor.com/forecast/webservice/json/v1
このURLの末尾にクエリパラメータとして地域idを付加して送信します。
クエリ情報を付加したURL↓
http://weather.livedoor.com/forecast/webservice/json/v1?city=250010
URLの末尾に「?」を付け、その後ろに「city(クエリ情報のキー)=id(値)」を書けばURL+クエリ情報が出来上がります。
このURLにアクセスしても意味がわからないので、次でデコードを行い、読みやすい形にしてみます。
情報を取得する
weather hacksから返されるデータはJSONデータです。
単にJSONデータを取得すると、Unicodeエスケープされたままの読めないデータが返ってくるので、デコードして人間が読める形に直したJSONデータを取得してみます。
import requests
url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=250010'
data = requests.get(url).json()
print(data)
$ python getJSON.py
{'pinpointLocations': [{'link': 'http://weather.livedoor.com/area/forecast/2520101', 'name': '大津市南部'},
{'link': 'http://weather.livedoor.com/area/forecast/2520400', 'name': '近江八幡市'},
...........中略...........
地震による被災地では、災害復旧活動には十分注意してくださ\nい。', 'publicTime': '2018-09-09T19:07:00+0900'}}
汎用性を高めるためにgetJSON.pyを書き換えます。実行結果は変わりません。
import requests
url = 'http://weather.livedoor.com/forecast/webservice/json/v1?'
query_params = {'city': '250010'}
data = requests.get(url, params=query_params).json()
print(data)
query_paramsのidを書き換えるだけで地域を変更できます。
今日・明日の天気を取得する
forecastsキーの値として、今日・明日の天気がリストとして格納されています。(JSONをみると明後日がない)
forecastキーの1つ目の要素である今日の天気情報を持っているJSON部分を表示してみます。
import requests
url = 'http://weather.livedoor.com/forecast/webservice/json/v1?'
query_params = {'city': '250010'}
data = requests.get(url, params=query_params).json()
# 今日の天気のJSON部分を表示する
print(data['forecasts'][0])
{'dateLabel': '今日', 'telop': '曇のち雨', 'date': '2018-09-13', 'temperature': {'min': {'celsius': '18', 'fahrenheit': '64.4'}, 'max': {'celsius': '24', 'fahrenheit': '75.2'}}, 'image': {'width': 50, 'url': 'http://weather.livedoor.com/img/icon/13.gif', 'title': '曇のち雨', 'height': 31}}
以下のように指定すればデータを取得できます。
指定 | 取得データ |
---|---|
data['forecasts'][0]['dateLabel'] | 今日 |
data['forecasts'][0]['telop'] | 曇のち雨 |
data['forecasts'][0]['date'] | 2018-09-13 |
では、実際に今日・明日の天気情報を取得し、表示するコードを作成します。
import requests
url = 'http://weather.livedoor.com/forecast/webservice/json/v1?'
query_params = {'city': '250010'}
data = requests.get(url, params=query_params).json()
for weather in data['forecasts']:
print(weather['dateLabel'] + 'の天気:' + weather['telop'])
for文の処理内容は、dataリストから要素を一つづつ取得し、'dataLabel'キーの値(予報日)と'telop'キーの値(天気)を出力しています。
今日の天気:曇のち雨
明日の天気:曇り
これを応用して何か作ってみるのも良いかと。
では、またヾ(・ω・ )