python練習 weather API

參照文章出處: http://motherboard.vice.com/read/hack-this-scripting-deeper-better-hacks-in-python

https://straymarcs.net/2014/12/how-to-create-your-own-weather-forecast-program-using-python/


1) 申請https://www.wunderground.com帳號,透過API()來取得其網站上的氣象資料
到https://www.wunderground.com申請(免費)帳號,以便透過API方式來使用它網站上的某些氣象資料。當然免費帳戶相對能取得的東西會比較少,不過既然這裏只能簡單的練習,先用免費帳號就好了。成功申請好免費帳戶登入https://www.wunderground.com之後,請到「more」選項底下的「Weather API for Developer」頁面來申請一組API Key 密鑰,接下來申請密鑰的頁面,同樣也是選擇免費方案即可。



在API Key 資料畫面中,就是給它填入一些關於這個API要用來做什麼的基本資訊,其實這裏隨便亂填就好,不必太認真。把資料都填好後送出(purchase key),系統會自動回覆一組密鑰,這是接下來在撰寫天氣詢問的python程式碼會用到的資訊,暫時先把它存好。


2) 滙入urllib2, json 模組
在python 3的版本,urllib2改名為urllib,不過我還是習慣先學好python2,故它用來讀取網址協議的模組是urllib2。它的使用文件在https://docs.python.org/2/library/urllib2.html,例如等一下會使用到urlopen 功能,它要放入的參數是一組網址與相關要求的list
urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])
url参数可以是字串string或者是Request object。而透過這個功能,它會抓取所放入list中的網址資料,以字串string或物件object形態呈現。
我個人覺得python 官網上對於urlib2/ urllib的說明文件寫得並不清楚,讓我常有一頭霧水之感,這可能也涉及到網路上各台機器之間協議規範的複雜。反正先記得urllib2最常用也最簡單的就是.openurl(),作用是開啟一個網址,並回傳網址上的內容(object/ instance)。
其它urllib/ urllib2的中文學習介紹,請參考: http://www.cnblogs.com/wly923/archive/2013/05/07/3057122.html
而JSON (JavaScript Object Notation)這個網頁資料交換格式在python程式下的用法 https://docs.python.org/2.7/library/json.html ,同樣看得我一知半解。簡言之它提供了一種JSON資料型態編碼與解碼的方法,其主要兩個最常用到的函式為:json.dumps() 和 json.loads(),前者是把python 的資料型態轉成json,後者則是把json資料轉成python資料結構。

3)程式碼主體

7 url = 'http://api.wunderground.com/api/' + key + '/geolookup/conditions/q/PA/' + zip + '.json' ##這會依據所輸入的zip郵編資料而傳回當地的天氣(json格式資訊之網址),至於https://www.wunderground.com API的用法,可進一步參考其官網上的指引文件
8 f = urllib2.urlopen(url) ##上述網址中的json資料,先以變數f存在某個記憶體位置,也因為它是透過模組類別(class)urllib2的urlopen方式來取得,故為一個instance 
9 json_string = f.read() ##再將變數f代表某記憶體位置的內容(json型態)給讀取出來,因為python本身的資料形態並不包括python,所以這裏透過read()函式傳遞給變數json_str的是一個字串的資料型態
10 parsed_json = json.loads(json_string) ##再透過json.loads把抓回來的天氣json資料轉成dicitionary資料形態,以便接下來利用其key來抽出想讀取的value
如果稍檢視一下原始的json資料內容,其資料前半段的key為"version","termsofService","features","geolookup","conditions","location", "current_observation",其中我們主要需要的進一步了解其中"current_observation"底下的天氣狀況。(底下json檔案第306行~336行的資訊)
11 weather = parse_json['current_observation']['weather'] ##既然parse_json為dictionary型態,要讀取它的value就是用其應對key
12 temperature = parse_json['current_observation']['temp_f'] ##同上一行,這裏要取得的是華氏氣溫(F)的資訊
14 print "How about this" + weather +"?" ##打印出天氣的狀況
15 print temperature,"F degree ? This is terrible !"  ##打印出氣溫
f.close() ##最後記得把佔記憶體的instance 清除
以下是這支簡單程式執行傳回的結果(我另外加了一個打印指令,好讓我看看到底某個東西是什麼樣的資料型態)


以上是照本宣科地練習使用氣象網站資訊來查詢天氣狀況,但示範案例是以美國地區的郵編作為地理資訊查詢依據,當然學習者最好能在了解基礎之後,再進一步地運用在本地資料的API連結與查詢。

0 意見:

My Instagram