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

livedoor社が提供する天気予報Webサービス「[Weather Hacks](http://weather.livedoor.com/weather_hacks/)」を使い、天気情報を取得してみようと思います。WebAPIの仕様などが[ここに](http://weather.livedoor.com/weather_hacks/webservice)書かれているので読んでみてください。
では、やっていきます。

## 情報を取得する地域を決める
各地域ごとに識別用のidが割り当てられており、idを指定して目的の地域の天気情報を取得します。[id一覧](http://weather.livedoor.com/forecast/rss/primary_area.xml)で情報を取得したい地域の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の末尾に[クエリパラメータ](https://webtan.impress.co.jp/e/2012/04/26/12663)として地域idを付加して送信します。

クエリ情報を付加したURL↓
http://weather.livedoor.com/forecast/webservice/json/v1?city=250010
URLの末尾に「?」を付け、その後ろに「city(クエリ情報のキー)=id(値)」を書けば**URL+クエリ情報**が出来上がります。
このURLにアクセスしても意味がわからないので、次でデコードを行い、読みやすい形にしてみます。

## 情報を取得する
weather hacksから返されるデータはJSONデータです。
単にJSONデータを取得すると、Unicodeエスケープされたままの読めないデータが返ってくるので、デコードして人間が読める形に直したJSONデータを取得してみます。

```python:getJSON.py
import requests
url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=250010'
data = requests.get(url).json()
print(data)
```

```result:実行結果
$ 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を書き換えます。実行結果は変わりません。

```python: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](https://qiita-image-store.s3.amazonaws.com/0/227026/8680db61-9d47-1df8-dac5-6668fa683384.png)
**forecasts**キーの値として、今日・明日の天気がリストとして格納されています。(JSONをみると明後日がない)
forecastキーの１つ目の要素である今日の天気情報を持っているJSON部分を表示してみます。

```python: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])
```

```result:実行結果
{'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 |

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

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

```result:実行結果
今日の天気：曇のち雨
明日の天気：曇り
```
これを応用して何か作ってみるのも良いかと。
では、またヾ(･ω･ )