天気情報を取得する(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)

導入

導入にはここ*1を参考にした.
パッケージが用意されているので,apt-getでインストールできる.

$ sudo apt-get install python-pywapi

使い方

まずはここに書いてあるサンプルを動かしてみる.

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の数と比較すると取得可能地域の粒度としては少し大きすぎるので,ちょっと粗い範囲での地域天気情報の取得になるのかなーとおもいます.

まとめ

割りと簡単にインストールできるし,純粋なpythonのみのAPIで使い方も楽なので地域情報をとりあえず取得したいというぐらいなら問題なく使えると思います.

*1:2014/07/20現在記事にアクセスできなくなっているようです2014/07/22接続可能であることを確認しました

*2:取得データのリストはこちらでDL可能