11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-25

はじめに

本記事はOpenWeatherMapの使い方を踏まえたスクレイピングの基礎についてのまとめです。

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

スクリーンショット 2018-03-25 10.33.41.png

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

OpenWeatherMap からAPIキーの取得

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

  1. OpenWeatherMapのサインアップのページにアクセスして、「Username、「Email」、「Password」、「Repeat Password」を入力し、「I agree to ...」(サイトポリシーへの同意)と「私はロボットではありません」にチェックして、Create Accountのボタンをクリックします。
    スクリーンショット 2018-03-25 10.41.15.png

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

(※)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」となっているので、今日は曇り:cloud:ということが分かりますが、特に指定がない場合は華氏(アメリカや一部の英語圏で使われている温度の単位)で出力されるため少し分かりずらいです。

スクリーンショット 2018-03-25 10.56.52.png

東京の天気情報を取得する場合(摂氏)

単位(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形式で出力され、今日の天気が日本語表示及び摂氏(日本を含む多くの国で使われている温度の単位)で表示されているので分かりやすいです。:sunny:

スクリーンショット 2018-03-25 11.17.37.png

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キーを入力します

実行結果

スクリーンショット 2018-03-25 11.30.43.png

「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キーを入力します

実行結果

スクリーンショット 2018-03-25 13.14.35.png

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

さいごに

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

参考

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

11
12
0

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
11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?