天気情報を取得する(Python weather API)
今研究で作ってるシステムで天気情報を取得する必要があったので忘備録的なあれで記事を書こうと思う.
天気取得の為のAPIは色々と調べてみたらいくつか使えそうなのがあった
僕はこの中で導入が簡単そうなpython weather apiを使用しているのでpython weather apiを使った天気情報取得について説明しようとおもう.
このAPIは本来なら
- Google weather
- Yahoo weather
- NOAA
の3種類の天候取得APIから天気を取得する事ができる.
(現在はgoogle weatherが使えないのと,日本ではNOAAが利用できないのでYahoo weatherのみの利用が可能)
【利用環境】
OS:Ubuntu 12.04LTS
使用言語:python(v2.7)
使い方
まずはここに書いてあるサンプルを動かしてみる.
import pywapi import string yahoo_result = pywapi.get_weather_from_yahoo('10001') print "Yahoo says: It is " + string.lower(yahoo_result['condition']['text']) + " and " + yahoo_result['condition']['temp'] + "C now in New York.\n\n"
結果
Yahoo says: It is fog and 14C now in New York.
どうやら地域ID的なのがわかればその土地の天気情報を取得する事ができるようです.
そこで,先ほどのHPのサンプルを借りて使ってみました.
import pywapi import string result = pywapi.get_weather_from_yahoo('JAXX0105') print '---' print result['title'] print 'city: ' + result['location']['city'] print 'date_time: ' + result['condition']['date'] print 'condition: ' + result['condition']['text'] print 'temp: ' + result['condition']['temp'] + '('+ result['units']['temperature'] + ')' print 'geo(lat,long): ' + result['geo']['lat'] + ',' + result['geo']['long'] print '---'
出力結果
--- Yahoo! Weather - Nagano, JA city: Nagano date_time: Sun, 20 Jul 2014 2:59 pm JST condition: Mostly Cloudy temp: 28(C) geo(lat,long): 36.67,138.2 ---
いい感じで取れてる.
地域IDについて
さてここまで来て問題になるのが,地域IDをどうやって取得するかである.
上記のHPではYahoo! weatherのwebページに行ってページソースから日本の地域のIDであるJAXX----なる文字列を探していたようです.
僕は取得可能な地域の全国のIDを使える必要があるので,この方法だと割りと辛い.
そこで,とりあえず適当なスクリプトを書いてJAXX----に該当する地域IDをJAXX0000~JAXX9999まで自動取得してみました.
#coding: UTF-8 import pywapi import string fp = open("location_result.dat", "w") fp.write("location ID Name Geodata(lat,long)\n") for num in xrange(10000): tag_num = '{0:04}'.format(num+1) tag_name = "JAXX" + str(tag_num) try: result = pywapi.get_weather_from_yahoo(tag_name) fp.write(tag_name + " " + result['location']['city'] + " " + result['geo']['lat'] + "," + result['geo']['long']) fp.write("\n") except: fp.write(tag_name + " N/A" + " N/A,N/A") fp.write("\n") fp.close()
(割りと雑なコードはご愛嬌)
これで取得した地域IDを見たところJAXX0148までしかIDが存在せず,それ以降のJAXX0149~JAXX9999には地域が設定されていませんでした*2.
Wikipediによると2014年4月5日の時点で市が790,特別区が23,町が745,村が183の合計1,741の地域が存在するとのことなので,IDの数と比較すると取得可能地域の粒度としては少し大きすぎるので,ちょっと粗い範囲での地域天気情報の取得になるのかなーとおもいます.