作者:曹永忠
本專欄在前一篇文章《測試氣象局OPEN DATA的API KEY》中說明API Key如何測試可以使用,但是這些擷取OPEN DATA 網址回傳的JSON Data,並顯示在瀏覽器的頁面上,但是我們發現這一大串的資料無法更進一步使用,所以本文要透過Python的程式,將這些OPEN DATA 網址回傳的JSON Data解譯出來,儲存mySQL資料庫之中。
透過API Key擷取OpenData
如下圖所示,我們進入API 主頁。請讀者複製下圖紅框區的API字串。
如下圖所示,請讀者開啟Chrome瀏覽器後,在網址列輸入這串API字串,輸完畢後按下『Enter』鍵。
如下圖所示,我們發現,輸入API字串後,我們可以在Chrome瀏覽器,取得回傳的JSON資料。
到此我們可以看到,已經可以透過API字串,向中央氣象局的氣象資料開放平台擷取到我們需要的氣象資料。
撰寫Python程式
我們來撰寫一段Python程式來向中央氣象局的氣象資料開放平台擷取到我們需要的氣象資料。
請讀者安裝Python 3.7XX以上的版本,可以參考LarryLin所寫的:在Windows底下最適當安裝Python環境的方法。
網址:https://ithelp.ithome.com.tw/articles/10210071(LarryLin, 2020)
我們用NOTEPAD ++,下載網址:https://notepad-plus-plus.org/downloads/,進行程式編輯。
擷取中央氣象局的氣象資料開放平台氣象觀測資料(Python\ GetcwbData.py):
import sys import requests import json import time import datetime import math import os import http.client import unicodedata from pathlib import Path from requests.exceptions import HTTPError str1="" str2="" url='https://opendata.cwb.gov.tw/api/v1/rest/datastore/O-A0001-001?Authorization=CWB-???????????????????&format=JSON' #這個替換自己的OpenData API Key try: res = requests.get(url) res.raise_for_status() except HTTPError as http_err: print('HTTP error occurred: {http_err}') sys.exit(0) except Exception as err: print('Other error occurred: {err}') sys.exit(0) else: print('Success!') table=json.loads(res.content.decode('utf-8')) print('return value = %s' %table['success']) for data in table['records']['location']: print('item name =%s' % data['stationId']) print('item name =%s' % data['locationName']) s01 = data['stationId'] s02 = data['locationName'] s03 = data['time']['obsTime'] s04 = data['lat'] s05 = data['lon'] data2 = data['weatherElement'] s06 = data2[0]['elementValue'] s07 = data2[1]['elementValue'] s08 = data2[2]['elementValue'] s09 = data2[3]['elementValue'] s10a = data2[4]['elementValue'] s10 = float(s10a)*10 s11 = data2[5]['elementValue'] s12 = data2[6]['elementValue'] data3 = data['parameter'] s13 = data3[1]['parameterValue'] s14 = data3[0]['parameterValue'] s15 = data3[3]['parameterValue'] s16 = data3[2]['parameterValue'] str1 = "http://163.22.24.51:9999" str2 = "/opendata/rainadd.php?f01=\'%s\'&f02=\'%s\'&f03=\'%s\'&f04=%s&f05=%s&f06=%s&f07=%s&f08=%s&f09=%s&f10=%s&f11=%s&f12=%s&f13=\'%s\'&f14=\'%s\'&f15=\'%s\'&f16=\'%s\'" %(s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15, s16) str = str1+str2 print(str) try: x = requests.get(str) print(x.status_code) except: # request.exceptions.RequestException as e: #requests.exceptions.RequestException as e: print('Exception in data_output')
程式下載網址:https://github.com/brucetsao/eMap8
接下來,我們使用命令提示單元(DOS Prompt),如下表所示,開啟命令提示單元:
接下來,進入命令提示單元(DOS Prompt):
接下來,我們進入Python程式目錄:
如下表所示,我們執行Python程式:
如下圖所示,我們可以看到執行Python程式結果畫面。
比對資料是否寫入
如下圖所示,我們進入網址:http://163.22.24.51/phpMyAdmin/index.php,執行phpMyAdmin,進入NCNU資料庫查詢。
如下圖所示,我們可以看到資料表:environment(氣象觀測資料明細檔)已經寫入2020/4/16 21:00:00的資料,約有四百多筆資料:
如下圖所示,我們可以看到資料表:cwbsite(氣象觀測資料現況檔),已經寫入2020/4/16 21:00:00的資料,約有四百多筆資料:
本文主要是利用Python將資料轉出,由於取得氣象局OPEN DATA都是一大堆的未格式化的JSON資料,所以我們透過撰寫一支Python程式,把資料轉出,由於這支Python程式與雲端主機不存在同一台主機,加上筆者將雲端主機加上權限控管,資料庫存取並無法透過雲端主機之外進行資料庫存取,所以我們在雲端主機上撰寫一支rainadd.php,當我的DB Agent代理程式,進行實際資料存取,至於這一支rainadd.php:DB Agent代理程式,筆者會於下篇文章加以介紹,請讀者稍等等。
小結
本篇為『物聯網環控系統開發』系列之Open Data轉出篇:利用Python將資料轉出,由於取得氣象局Open Data都是一大堆的未格式化的JSON資料,所以筆者透過這支轉檔程式,將資料轉出,並透過DB Agent代理程式將資料實際轉入雲端平台之中。
筆者本系列是針對非資訊、電機、電子等學子攥寫的物聯網系統開發系列,這九年多來在物聯網系統開發領域寫書、發表文章、辦展、授課,常遇到許多學子訓練不足,以交作業的心態來學習,並沒有把程式底子打好。
後續筆者還會繼續發表『物聯網環控系統開發』系列的文章,在未來我們可以創造出更優質,更具未來性的物聯網(Internet of Thing:IOT)產品開發相關技術。敬請期待更多的文章。
(責任編輯:王姵文)
- 【大氣監控站台開發案例(下)】環境監控即時監控看板 - 2021/11/25
- 【大氣監控站台開發案例(中)】環境監控雲端平台系統介紹 - 2021/11/02
- 【大氣監控站台開發案例(上)】 大氣監控站建置實例介紹 - 2021/10/18
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!