【物聯網環控系統開發#3】利用PYTHON將資料轉出

作者:曹永忠

本專欄在前一篇文章《測試氣象局OPEN DATA的API KEY》中說明API Key如何測試可以使用,但是這些擷取OPEN DATA 網址回傳的JSON Data,並顯示在瀏覽器的頁面上,但是我們發現這一大串的資料無法更進一步使用,所以本文要透過Python的程式,將這些OPEN DATA 網址回傳的JSON Data解譯出來,儲存mySQL資料庫之中。

透過API Key擷取OpenData

如下圖所示,我們進入API 主頁。請讀者複製下圖紅框區的API字串。

複製API字串

如下圖所示,請讀者開啟Chrome瀏覽器後,在網址列輸入這串API字串,輸完畢後按下『Enter』鍵。

開啟瀏覽器輸入API字串

如下圖所示,我們發現,輸入API字串後,我們可以在Chrome瀏覽器,取得回傳的JSON資料。

輸入API字串後取得回傳的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程式:

執行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)產品開發相關技術。敬請期待更多的文章。

(責任編輯:王姵文)

Author: 曹永忠

目前為自由作家,已有二十多年的開發資訊系統經驗,專長為於軟體工程、軟體開發與設計、物件導向程式設計、Arduino/Ameba/LinkIt 等開發版開發與應用、嵌入式系統開發,同時也喜歡商品攝影及人像攝影,並持續發表作品及相關專業著作。 原始碼網址:https://github.com/brucetsao/

Share This Post On
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x