LoginSignup
18

More than 5 years have passed since last update.

Webサービスを利用して天気情報を取得する by Python

Last updated at Posted at 2018-09-12

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データを取得してみます。

getJSON.py
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を書き換えます。実行結果は変わりません。

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を書き換えるだけで地域を変更できます。

今日・明日の天気を取得する

スクリーンショット 2018-09-09 23.33.51.png
forecastsキーの値として、今日・明日の天気がリストとして格納されています。(JSONをみると明後日がない)
forecastキーの1つ目の要素である今日の天気情報を持っているJSON部分を表示してみます。

getForecasts.py
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

では、実際に今日・明日の天気情報を取得し、表示するコードを作成します。

weather.py
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'キーの値(天気)を出力しています。

実行結果
今日の天気:曇のち雨
明日の天気:曇り

これを応用して何か作ってみるのも良いかと。
では、またヾ(・ω・ )

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18