Open Weather Map
前回、Rakuten Rapid APIでOpen Weather Mapを登録してブラウザ上でちょっといじってみました。
いじってみたとは言っても、自分でプログラミングしたわけではなく、準備されている入力欄をちょっといじって実行してみただけ。
ということで今回はJupyter notebookを使ってもう少し自分でプログラムを触っていきましょう。
プログラムの例をコピー
まずは基本となるプログラムをAPIのページからコピーしていきます。
Rakuten Rapid APIにアクセスして、Open Weather Mapのページに移動します。
左下のエリアで「Current Weather Data」を選択し、コードスニペットの下のプログラム名を「(Python)Requests」にします。
するとその下のプログラム例がPythonのRequestsを使った例になりますので、これをJupyter notebookにコピーします。
Jupyter notebook上で動くか確認
まずはそのままのプログラムでJupyter notebook上で動くか確認してみましょう。
ちなみにコピーしたプログラムはこんな感じです。
「’x-rapidapi-key’」はご自分のものが表示されていると思いますので、今後記載のプログラムに関しては適宜修正して用いてください。
import requests
url = "https://community-open-weather-map.p.rapidapi.com/weather"
querystring = {"q":"Tokyo, jp","lat":"0","lon":"0","callback":"test","id":"2172797","lang":"null","units":"\"metric\" or \"imperial\"","mode":"xml, html"}
headers = {
'x-rapidapi-key': " Rakuten Rapid API key",
'x-rapidapi-host': "community-open-weather-map.p.rapidapi.com"
}
response = requests.request("GET", url, headers=headers, params=querystring)
print(response.text)
実行結果
test({"coord":{"lon":139.6917,"lat":35.6895},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"base":"stations","main":{"temp":296.06,"feels_like":296.03,"temp_min":295.1,"temp_max":296.92,"pressure":1017,"humidity":62},"visibility":10000,"wind":{"speed":1.79,"deg":343,"gust":4.02},"clouds":{"all":75},"dt":1630983515,"sys":{"type":2,"id":2038398,"country":"JP","sunrise":1630959463,"sunset":1631005285},"timezone":32400,"id":1850144,"name":"Tokyo","cod":200})
特に問題なくデータの取得に成功しました。
クエリーの要素を確認
このOpen Weather APIですが、こちらからクエリー(要求)を送って、それに対するレスポンス(返答)が返ってくるものになります。
もう少し直接的にいうと、こちらから現在の天気を知りたい場所(クエリー)を送ると、その天気(レスポンス)が返ってきます。
そのクエリーをよくみてみるとこんな感じです。
querystring = {"q":"Tokyo, jp","lat":"0","lon":"0","callback":"test","id":"2172797","lang":"null","units":"\"metric\" or \"imperial\"","mode":"xml, html"}
またRakuten Rapid API上で見るにはこの真ん中の列です。
テーブルにまとめてみました。
q | 必須 | 都市名を指定(例:Tokyo、jp) |
lat | オプション | 緯度を指定(経度と一緒に使う) |
lon | オプション | 経度を指定(緯度と一緒に使う) |
callback | オプション | JavaScriptのJSONPコールバック |
id | オプション | 都市のID |
lang | オプション | アウトプットするデータの言語(残念ながら日本語はない) |
unit | オプション | 数値の単位(metric:メートル法かimperial:帝国単位) |
mode | オプション | 出力の形式(指定がない場合はJSON) |
こうみてみると必須なのは「q」の都市名だけで、あとは必要に応じて設定すれば良いようです。
ということで「q」の都市名だけをクエリーにして試してみましょう。
import requests
url = "https://community-open-weather-map.p.rapidapi.com/weather"
querystring = {"q":"Tokyo, jp"}
headers = {
'x-rapidapi-key': " Your API key",
'x-rapidapi-host': "community-open-weather-map.p.rapidapi.com"
}
response = requests.request("GET", url, headers=headers, params=querystring)
print(response.text)
実行結果
{"coord":{"lon":139.6917,"lat":35.6895},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"base":"stations","main":{"temp":296.62,"feels_like":296.8,"temp_min":295.73,"temp_max":298.13,"pressure":1014,"humidity":68},"visibility":10000,"wind":{"speed":0.45,"deg":238,"gust":2.24},"clouds":{"all":75},"dt":1631077705,"sys":{"type":2,"id":2038398,"country":"JP","sunrise":1631045908,"sunset":1631091598},"timezone":32400,"id":1850144,"name":"Tokyo","cod":200}
問題なくデータの取得に成功しました。
他のオプションになっている値をみても特に設定する必要がなさそうなので、とりあえずこれで行ってみましょう。
取得したデータの要素を確認
次に取得したデータの要素を確認してみましょう。
{"coord":{"lon":139.6917,"lat":35.6895},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"base":"stations","main":{"temp":296.62,"feels_like":296.8,"temp_min":295.73,"temp_max":298.13,"pressure":1014,"humidity":68},"visibility":10000,"wind":{"speed":0.45,"deg":238,"gust":2.24},"clouds":{"all":75},"dt":1631077705,"sys":{"type":2,"id":2038398,"country":"JP","sunrise":1631045908,"sunset":1631091598},"timezone":32400,"id":1850144,"name":"Tokyo","cod":200}
一気に見るのは大変なので、分解して行ってみましょう。
最初のかたまりは「coord」です。
"coord":{"lon":139.6917,"lat":35.6895}
ここでは「lon」と「lat」が記載されており、それぞれ経度(longitude)と緯度(latitude)です。
次は「weather」です。
"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}]
ここに現在の天気が記載されており、大まかな天気の場合は「main」を取得、さらに細かい天気を取得したい場合は「description」を取得すれば良さそうです。
「”base”:”stations”」は分かりません。
「main」には気象情報が記載されています。
特に温度を取得したい時はここです(ケルビンなので注意)
"main":{"temp":296.62,"feels_like":296.8,"temp_min":295.73,"temp_max":298.13,"pressure":1014,"humidity":68}
「”visibility”:10000」は視界(視程)で、眼で見える距離です。
「”wind”:{“speed”:0.45,”deg”:238,”gust”:2.24}」は風の情報ですね。
「”clouds”:{“all”:75}」は雲が空を覆っている量だと思われます。
「”dt”:1631077705」は分かりません。
「”sys”:{“type”:2,”id”:2038398,”country”:”JP”,”sunrise”:1631045908,”sunset”:1631091598}」は都市の情報だと思うのですが、ここに日の出日の入りが書かれているようです。
ただ時刻の形式になっていないようで、何やら変換する必要がありそうです。
「”timezone”:32400,”id”:1850144,”name”:”Tokyo”」は前からタイムゾーン、都市のID、都市名ですね。
最後の「”cod”:200」は多分アクセスに成功したかどうかを示していると思われます。
分からないものや推測のもののありますが、とりあえず「weather」の中に取得したいものがあるようなのは分かりました。
JSON形式に変換
現在、取得したデータは”表向き”はJSON形式のデータとなっています。
何故”表向き”と言ったかというと、JSON形式で書かれた文字列として取得されているからです。
つまりこのようにスライスしてみると…
print(response.text[5:10])
実行結果
rd":{
と言ったように、6番目から9番目までの文字が取得されます。
ということでこの文字列をJSONに戻してやりましょう。
import json
data = json.loads(response.text)
print(data['weather'])
実行結果
[{'id': 803, 'main': 'Clouds', 'description': 'broken clouds', 'icon': '04d'}]
これでJSON形式のデータにでき、「weather」が取得できました。
この中の「main」を取得するにはこうします。
print(data['weather'][0]['main'])
実行結果
Clouds
先ほど「weather」を取得したときの結果をよく見ると分かるのですが、データは最初にリストに納められていて、そのあと辞書形式で格納されています。
そのため「[0]」が必要になります。
これで天気データの取得ができました。
この取得したデータの使い道ですが、月に500回までしかこのようにデータを取得できませんので、例えばウェブサイトにアクセスされたときにその人の位置をIPから取得してその場所の天気を表示するなんてことをしたら簡単にオーバーしてしまいます。
ということで今回はTwitterで各地の現在の天気をつぶやくということをしてみたいと思います。
次回はそのプログラムの作成をしていきましょう。
ではでは今回はこんな感じで。
コメント