這篇文章會從註冊氣象資料開放平臺開始,介紹如何取得天氣預報資料的 JSON 檔案,並使用 Python 的 Requests 函式庫,實作一個可以自動抓取氣象預報資料的網路爬蟲。
原文參考:爬取天氣預報
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
交通部中央氣象局為了便利民眾共享和應用政府資料,推出了「氣象資料開放平臺」,讓民眾可以在政府資源有限下,善用無限的創意,整合運用開放資料,提升政府資料品質及價值、優化政府服務品質。
氣象資料開放平台:https://opendata.cwb.gov.tw/index
要使用氣象資料開放平台的資料需要先「註冊」,點擊右上角的「註冊/登入」,點擊「氣象會員登入」,已有帳號的使用自己的帳號,沒有帳號可以點擊下方「加入會員」註冊帳號。
註冊成功後會成為「一般會員」,點擊「取得授權碼」按鈕,會出現個人的授權碼,如果授權碼被盜用或出現問題,可點擊「更新授權碼」重新產生。
點擊「資料主題」,選擇「預報」,搜尋「36小時天氣預報」,找到「一般天氣預報 - 今明 36 小時天氣預報」。
開啟頁面後,點擊 JSON 或 XML 的連結可以取得台灣所有縣市的預報資料,點擊 API 連結,會開啟「中央氣象局開放資料平臺之資料擷取 API」的頁面,輸入個人的授權碼,就能透過 API 取出篩選後的資料。
不論是用 JSON 檔案還是 API 的方式,開啟氣象預報資料後,可看見如下圖的 JSON 物件結構,weatherElement 裡的資料就是所需的天氣預報資料。
weatherElement 裡有五種的預報因子,可透過程式單純取出所需的預報因子。
預報因子 | 說明 |
---|---|
Wx | 天氣現象 |
MaxT | 最高溫度 |
MinT | 最低溫度 |
CI | 舒適度 |
PoP | 降雨機率 |
使用 Requests 函式庫的 get 的方法,抓取天氣預報的 JSON 網址,接著使用字典的取值方法,取出 location 裡的內容並透過 for 迴圈印出。
import requests
url = '一般天氣預報 - 今明 36 小時天氣預報 JSON 連結'
data = requests.get(url) # 取得 JSON 檔案的內容為文字
data_json = data.json() # 轉換成 JSON 格式
location = data_json['cwbopendata']['dataset']['location'] # 取出 location 的內容
for i in location:
print(f'{i}')
修改程式,取出天氣現象、最高溫、最低溫、降雨機率資訊,使用字串格式化的方式,就能顯示成所需要的氣象預報格式。
import requests
url = '一般天氣預報 - 今明 36 小時天氣預報 JSON 連結'
data = requests.get(url) # 取得 JSON 檔案的內容為文字
data_json = data.json() # 轉換成 JSON 格式
location = data_json['cwbopendata']['dataset']['location']
for i in location:
city = i['locationName'] # 縣市名稱
wx8 = i['weatherElement'][0]['time'][0]['parameter']['parameterName'] # 天氣現象
maxt8 = i['weatherElement'][1]['time'][0]['parameter']['parameterName'] # 最高溫
mint8 = i['weatherElement'][2]['time'][0]['parameter']['parameterName'] # 最低溫
ci8 = i['weatherElement'][3]['time'][0]['parameter']['parameterName'] # 舒適度
pop8 = i['weatherElement'][4]['time'][0]['parameter']['parameterName'] # 降雨機率
print(f'{city}未來 8 小時{wx8},最高溫 {maxt8} 度,最低溫 {mint8} 度,降雨機率 {pop8} %')
除了主要縣市的天氣預報,氣象局也提供了其他縣市或行政區的天氣預報,只要搜尋「鄉鎮」就能找到對應的資料。
中央氣象局的氣象資料開放平臺提供了很多好用的即時資料,只要了解爬蟲原理,就可以很輕鬆的抓取資料,進行後續的應用。
大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^