python お天気apiから近日の天気を取得する

#コードと結果

今回は、[livedoorlivedoor天気情報 | livedoorが提供するお天気情報](http://weather.livedoor.com/weather_hacks/webservice)
のapiから情報を持ってきます。
defaultでは鹿児島の天気情報を取ってきます。
引数に別の地域のコードを与えてあげるとその地域の天気情報を取ってきます。
各地域のコードは下記のURLの各地域のidを参照してください。
http://weather.livedoor.com/forecast/rss/primary_area.xml


```py:weather_api.py
#encoding:utf-8
import urllib2, sys
import json

try: citycode = sys.argv[1]
except: citycode = '460010' #デフォルト地域
resp = urllib2.urlopen('http://weather.livedoor.com/forecast/webservice/json/v1?city=%s'%citycode).read()

# 読み込んだJSONデータをディクショナリ型に変換
resp = json.loads(resp)
print '**************************'
print resp['title']
print '**************************'
print resp['description']['text']

for forecast in resp['forecasts']:
    print '**************************'
    print forecast['dateLabel']+'('+forecast['date']+')'
    print forecast['telop']
print '**************************'
```

実行すると(2015-06-29現在)

```
$ python weather_api.py
```

```
**************************
鹿児島県 鹿児島 の天気
**************************
 九州南部は、概ね晴れています。
 奄美地方は、雨で激しい雨の降っている所があります。

 九州南部は、29日は、はじめ高気圧に覆われますが、次第に気圧の谷や
湿った空気の影響を受けるでしょう。30日は、梅雨前線の影響を受ける見
込みです。
 奄美地方は、29日は、梅雨前線の影響を受けるでしょう。30日は、梅
雨前線や湿った空気の影響を受ける見込みです。

 九州南部は、29日は、晴れで夜は曇りとなるでしょう。30日は、はじ
め曇りですが次第に雨となり、雷を伴い非常に激しく降る所がある見込みで
す。
 奄美地方は、29日は、雨で雷を伴い非常に激しく降る所があるでしょう
。30日は、雨で雷を伴い激しく降る所がありますが、次第に曇りとなる見
込みです。

 奄美地方では、29日は高温が予想されるため、熱中症など健康管理に注
意してください。

 海上は、29日は、波がやや高いか多少波がある程度でしょう。30日は
、次第に波が高くなる所がある見込みです。

 霧島山(新燃岳)上空およそ1500メートルの風
 29日09時    北東の風3メートル
 29日21時の予想 東の風2メートル

 桜島上空およそ1500メートルの風
 29日09時    東の風5メートル
 29日21時の予想 南東の風2メートル

<天気変化等の留意点>
 屋久島町では、29日は、概ね曇りでしょう。30日は、はじめ曇りです
が、朝から雨となり昼過ぎから夕方にかけて雷を伴い非常に激しく降る所が
ある見込みです。
**************************
今日(2015-06-29)
晴のち曇
**************************
明日(2015-06-30)
雨
**************************
明後日(2015-07-01)
曇時々雨
**************************
```

#解説
##urllib2
urllib2はURLからネット上のリソースを取得するpythonのモジュールです。

```py
import urllib2
response = urllib2.urlopen('http://python.org/')
html = response.read()
```

参考：http://docs.python.jp/2/howto/urllib2.html

今回のコードでいうと、

```py
resp = urllib2.urlopen('http://weather.livedoor.com/forecast/webservice/json/v1?city=%s'%citycode).read()
```

のところですね。ここで「[http://weather.livedoor.com](http://weather.livedoor.com)」のapiからリソースを取得しているわけです。

##sys.argv
sysはインタープリタの動作に深く関係する関数を定義しています。
>
インタープリタ：インタプリタとは、人間がプログラミング言語で記述したソフトウェアの設計図（ソースコード）を、コンピュータが実行できる形式（オブジェクトコード）に変換しながら、そのプログラムを実行するソフトウェア。インタプリタ型の言語はプログラムの実行時に変換を行うため、その分だけコンパイラ型言語よりも遅い。
引用元：[IT用語時点e-Words | インタープリタ](http://e-words.jp/w/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF.html)

特にここでは、sys.argvを使います。これによって、コマンドラインから引数を受け取れます。```argv[0]```はスクリプト名を受け取るので、今回のコードでは、１つ目の引数```argv[1]```を使用しているというわけです。

参考：
[sys — システムパラメータと関数](http://docs.python.jp/2/library/sys.html)
[Python: コマンドライン引数の取得 – sys.argv変数](http://www.yukun.info/blog/2008/07/python-command-line-arguments.html)

##try, except
tryとexceptはエラー処理を扱います。
try節で例外が発生しなければexcept節をスキップします。
例外が発生すれば、except節を実行します。

今回は、コマンドライン引数があればそのコードを、なければ鹿児島のコードをcitycodeに与えます。
参考：[8. エラーと例外](http://docs.python.jp/2/tutorial/errors.html)


##json
取得したjsonをデコードするためにjsonのモジュールを使用しています。

```
json.loads()
```

今回は受け取ったデータをjson型からディクショナリ型に変換しています。
[18.2. json — JSON エンコーダおよびデコーダ](http://docs.python.jp/2.6/library/json.html)