はじめに
本記事はOpenWeatherMapの使い方を踏まえたスクレイピングの基礎についてのまとめです。
OpenWeatherMapは、世界中の代表的な都市の天気情報を取得することができるAPIを無料(※)で公開してます。
(※)無料プランの場合は1分間に60回までAPIを呼びだすことができます。ご注意ください。
OpenWeatherMap からAPIキーの取得
OpenWeatherMapのAPIを利用するためにはAPIキーが必要になります。
-
OpenWeatherMapのサインアップのページにアクセスして、「Username、「Email」、「Password」、「Repeat Password」を入力し、「I agree to ...」(サイトポリシーへの同意)と「私はロボットではありません」にチェックして、Create Accountのボタンをクリックします。
-
アカウント作成後、入力したメールアドレスにメールが送られきて登録が完了(※)になります。
(※)APIキーのアクティベーションは少し時間がかかります
OpenWeatherMapの利用方法
APIの利用方法はとても簡単です。APIキーのアクティベーションが有効になり次第、まずはブラウザで使えることを確認します。
東京の天気情報を取得する場合(華氏)
# [書式] (※)APIキーには取得したAPIキーを入力します
http://api.openweathermap.org/data/2.5/weather?q=tokyo,jp&appid=(※)APIキー
APIの実行結果はJSONで、{ key1: value1, key2: value2 ... }のような形式で出力されます。
「description」キーの値が「clear sky」となっているので、今日は曇りということが分かりますが、特に指定がない場合は華氏(アメリカや一部の英語圏で使われている温度の単位)で出力されるため少し分かりずらいです。
東京の天気情報を取得する場合(摂氏)
単位(unit)や言語(lang)のパラメータを追加して、出力結果をカスタマイズして分かりやすくします。また、形式(mode)でxmlを指定してxmlで出力させます。
# [書式] (※)APIキーには取得したAPIキーを入力します
http://api.openweathermap.org/data/2.5/weather?q=tokyo,jp&units=metric&lang=ja&mode=xml&appid=(※)APIキー
今度はxml形式で出力され、今日の天気が日本語表示及び摂氏(日本を含む多くの国で使われている温度の単位)で表示されているので分かりやすいです。
Pythonでスクレイピング
Pythonでは、Webサイトにあるデータを取得するためには「urllib」ライブラリを使用します。また、取得したデータを抽出するためには「BeautifulSoup」ライブラリを使用します。
「urllib」でAPIの実行結果を出力
上記ブラウザでやったことをpythonで実行するプログラムです。APIの実行結果で今日の天気を日本語で出力させるために、「decode」メソッドで変換させています。
#! /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キーを入力します
実行結果
「BeautifulSoup」でスクレイピング
スクレイピングするときは必要なデータ(今日の天気)として、xml形式の場合「weather」要素の「value」属性を抽出したいです。
まずは「BeautifulSoup」をインストールします。
$ pip3 install beautifulsoup4
#! /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キーを入力します
実行結果
今日の天気は「晴天」というデータが抽出できました。
さいごに
これで世界中の天気の情報はいつでも簡単に取得できます。
参考
APIで指定する都市名のパラメータは、公式のHow to get accurate API responseより、「city ID」を指定することで正確な情報が取得できる記載があります。「Cities' IDs list.」のリンクより「city ID」のリストが取得できます。