無料お天気APIで簡単スクレイピング

# はじめに
本記事は[OpenWeatherMap](https://openweathermap.org/)の使い方を踏まえたスクレイピングの基礎についてのまとめです。

[OpenWeatherMap](https://openweathermap.org/)は、世界中:earth_asia:の代表的な都市の天気情報:sunny:を取得することができるAPIを無料（※）で公開してます。

![スクリーンショット 2018-03-25 10.33.41.png](https://qiita-image-store.s3.amazonaws.com/0/221759/54388ae4-4951-f88e-c81c-c01811ca1be1.png)

**（※）無料プランの場合は1分間に60回までAPIを呼びだすことができます。ご注意ください。**

## OpenWeatherMap からAPIキーの取得
OpenWeatherMapのAPIを利用するためにはAPIキーが必要になります。

1. [OpenWeatherMapのサインアップのページ](https://home.openweathermap.org/users/sign_up)にアクセスして、「Username、「Email」、「Password」、「Repeat Password」を入力し、「I agree to ...」(サイトポリシーへの同意)と「私はロボットではありません」にチェックして、Create Accountのボタンをクリックします。
![スクリーンショット 2018-03-25 10.41.15.png](https://qiita-image-store.s3.amazonaws.com/0/221759/2e734e8c-d78a-7f66-6d34-99c002b6836e.png)

2. アカウント作成後、入力したメールアドレスにメールが送られきて登録が完了（※）になります。

**（※）APIキーのアクティベーションは少し時間がかかります**

## OpenWeatherMapの利用方法
APIの利用方法はとても簡単です。APIキーのアクティベーションが有効になり次第、まずはブラウザで使えることを確認します。

### **東京の天気情報を取得する場合（華氏）**

```http
# [書式] （※）APIキーには取得したAPIキーを入力します
http://api.openweathermap.org/data/2.5/weather?q=tokyo,jp&appid=（※）APIキー
```

APIの実行結果はJSONで、{ key1: value1, key2: value2 ... }のような形式で出力されます。
「description」キーの値が「clear sky」となっているので、今日は曇り:cloud:ということが分かりますが、特に指定がない場合は華氏（アメリカや一部の英語圏で使われている温度の単位）で出力されるため少し分かりずらいです。

![スクリーンショット 2018-03-25 10.56.52.png](https://qiita-image-store.s3.amazonaws.com/0/221759/e993f12a-385d-87c9-e709-b39a2e21a44c.png)

### **東京の天気情報を取得する場合（摂氏）**
単位(unit)や言語(lang)のパラメータを追加して、出力結果をカスタマイズして分かりやすくします。また、形式（mode）でxmlを指定してxmlで出力させます。

```http
# [書式] （※）APIキーには取得したAPIキーを入力します
http://api.openweathermap.org/data/2.5/weather?q=tokyo,jp&units=metric&lang=ja&mode=xml&appid=（※）APIキー
```

今度はxml形式で出力され、今日の天気が日本語表示及び摂氏（日本を含む多くの国で使われている温度の単位）で表示されているので分かりやすいです。:sunny:

![スクリーンショット 2018-03-25 11.17.37.png](https://qiita-image-store.s3.amazonaws.com/0/221759/08cc35c6-d520-9bf3-29da-15253d40fa35.png)

## Pythonでスクレイピング
Pythonでは、Webサイトにあるデータを取得するためには「urllib」ライブラリを使用します。また、取得したデータを抽出するためには「BeautifulSoup」ライブラリを使用します。

### 「urllib」でAPIの実行結果を出力
上記ブラウザでやったことをpythonで実行するプログラムです。APIの実行結果で今日の天気を日本語で出力させるために、「decode」メソッドで変換させています。

```python
#! /usr/bin/env python3
# -*- coding: utf-8 -*-

import urllib.request as req

API = "http://api.openweathermap.org/data/2.5/weather?q=tokyo,jp&units=metric&lang=ja&mode=xml&appid=（※）APIキー"

url = API
print("url=", url)
print("")

data = req.urlopen(url).read()
text = data.decode("utf-8")
print(text)
```
**（※）APIキーには取得したAPIキーを入力します**

### 実行結果
![スクリーンショット 2018-03-25 11.30.43.png](https://qiita-image-store.s3.amazonaws.com/0/221759/849af506-6cee-1149-d318-1a3daea2f90a.png)

### 「BeautifulSoup」でスクレイピング
スクレイピングするときは必要なデータ（今日の天気）として、xml形式の場合「weather」要素の「value」属性を抽出したいです。
まずは「BeautifulSoup」をインストールします。

`$ pip3 install beautifulsoup4`

```python
#! /usr/bin/env python3
# -*- coding: utf-8 -*-

import urllib.request as req
import sys
# BeautifulSoupのパスを通す
sys.path.append('/home/pi/.local/lib/python3.5/site-packages/')
from bs4 import BeautifulSoup

API = "http://api.openweathermap.org/data/2.5/weather?q=tokyo,jp&units=metric&lang=ja&mode=xml&appid=（※）APIキー"

url = API
print("url=", url)
print("")

data = req.urlopen(url).read()
text = data.decode("utf-8")
print(text)
print("")

# インスタンスの「weathre」要素を抽出
soup = BeautifulSoup(text, "html.parser")
weather = soup.find("weather")
print(weather)
print("")

# インスタンスの「weathre」要素の「value」属性を抽出
weather = soup.weather.get("value")
print(weather)
```
**（※）APIキーには取得したAPIキーを入力します**

### 実行結果

![スクリーンショット 2018-03-25 13.14.35.png](https://qiita-image-store.s3.amazonaws.com/0/221759/60f63e3c-9ac2-bf9d-ab28-f7fe833364c2.png)


**今日の天気は「晴天」:sunny:というデータが抽出できました。**

## さいごに
これで世界中の天気の情報はいつでも簡単に取得できます。

### 参考
APIで指定する都市名のパラメータは、[公式のHow to get accurate API response](https://openweathermap.org/appid#work)より、「city ID」を指定することで正確な情報が取得できる記載があります。「Cities' IDs list.」のリンクより「city ID」のリストが取得できます。