Swift Practice # 172 Swift 取得網頁資料並製作台灣鄉鎮氣象連結JSON

上一篇解決了使用Google Admob套件所產生的Link問題,讓廣告可以順利顯示。

這篇則是side project的延伸功能,原本不在計畫內,但思考如果多這個功能使用者應該會比較快掌握到所需要的資訊。

主要的目標是要讓使用者在點選指定地點後,能有一個按鈕可以快速連結到中央氣象局的網頁查看當地的天氣。

這篇則會分成兩個部分

取得中央氣象局的鄉鎮市區ID

透過上述取得的ID建立自己的JSON

取得中央氣象局的鄉鎮市區ID

首先可以先看下列連結,點選進入會直接進到台北市中正區的天氣資料內。

https://www.cwb.gov.tw/V8/C/W/Town/Town.html?TID=6300500

接著可以看看中央氣象局台北市北投區天氣資訊的網址

https://www.cwb.gov.tw/V8/C/W/Town/Town.html?TID=6301200

可以看到網址前面都一樣,差別只在於TID=後面的數字不一樣,所以我查看其他縣市,觀察到每一個鄉鎮市區都會有對應的ID,如果要透過所在的地點確認當地天氣,TID=後面的值應該就會對應各自的鄉鎮市區。

其實可以一個一個查看鄉鎮市區ID就好,但台灣有368個鄉鎮市區,這樣一個個查估計查到9月底,所以想到的方法是透過爬蟲把368個ID取下來,但嘗試過爬蟲發現輸入不同的網址回傳都是台北市中正區,可能是遇到了動態網站,所以透過Chrome的開發者選項(fn+F12)進入開發者選項後輸入command+R來確認網站的其他資料並搜尋關鍵字看到了一個充滿曙光的東西。

從上圖搜尋完查看到右側的程式碼,發現到一個類似JSON結構的Info_Town資料格式,嘗試把這個資料丟到下列網站解析

解析過程發現有些許的問題,但研究了JSON格式後發現將原本的 [’]改成[”]就可以了,於此我們拿到了中央氣象局幫我們建立好鄉鎮市區ID的JSON檔案(可至文末Github連結下載),大大省下一個一個輸入ID更改的時間。

建立自己的JSON

基本上如果是單純的對應鄉鎮市區ID,上述的JSON應該已經可以讓許多人練習,但因我自己已經有建立一個JSON檔案,加上中央氣象局單一縣市的鄉鎮市區排序並不像一般人習慣依照郵遞區號排序的狀態,所以我嘗試將上面的ID整合到自己的JSON內。而這引發了下一個問題,我要如何快速的將每一個ID放到自己的JSON,如果還是一個一個處理,基本上耗時又有可能輸入錯誤,所以我嘗試透過自己原本有的台灣鄉鎮市區的JSON檔案與上面建立好的中央氣象局JSON這兩個JSON檔,透過程式碼的幫忙產出單一縣市類似JSON的字串結構再貼到JSON中修改成最後使用的JSON檔案。又加上兩邊的JSON檔案的鄉鎮市區排序因為不一致,所以再處理上會再多一個判斷。

簡單而言就是透過自己目前的JSON進去中央氣象局有鄉鎮市區ID的JSON中找到對應的鄉鎮市區ID寫成String,最後再貼到JSON檔案內即可。文字無法理解的話嘗試看程式碼來理解吧。

首先先加入兩個JSON檔案到檔案中

taiwanDistrictsZip AndName.json //台灣行政區的JSON
ConvertCWBInfoFromChrome.json. //中央氣象局帶有鄉鎮市區ID的JSON

model:

ViewModel:

接著在View加入ViewModel跟在onappear執行Function即可開始列印。

接著就可以將列印到的字串轉貼到JSON上完成改寫JSON,透過這個方法不用一天就完成了原本預計手動約十天的工作。完成的檔案

taiwanCampingDistrictsWithCWBID.json

一樣放在專案內可從下方Github連結下載取得,這三個JSON可以依照使用情境自己使用,希望這些東西可以在開發路上幫助大家。

參考連結

--

--