網路公開資訊擷取技巧

要從網路上取得資訊,第一個地方不是網頁,而是提供網公開資訊的地方,只有在公開資訊網站中找不到,才需要自己到網頁中尋找並擷取以及剖析,因為只要是呈現在網頁上的,都是二手資料,最原始完整的資料,都是被放在單位機構的資料庫裡面的,網頁上的內容,只是經由程式去資料庫中撈取再編排顯示後的結果。

現代社會把資訊公開已是大家的共識,尤其是政府機構,更有義務把從公眾取得的資訊,或是對大眾有益的資訊提供出來讓人們檢閱,我們的政府也不例外。政府的公開資料,大部份都被放在政府資料開放平臺這個網站中:

進入該網站之後,即分門別類列出各政府機構所整理的各項資料:

同學們可以從上面的分類中找出自已感興趣的資料下載,再從下載的檔案中加以分析及整理,當然也可以利用該檔案的網址,直接在Python的程式中進行即時下載分析的作業。此平台上也提供了關鍵字的搜尋功能,讓一般社會大眾可以更快地找出想要的資料。以水庫每日營運狀況為例,我們找到的網址是:https://data.gov.tw/dataset/41568 ,它的網頁畫面如下:

從畫面上的說明可以瞭解此資訊提供的主要內容為何以及更新的頻率,另外最重要的是它的資料格式,分別包括JSON、CSV、XML、以及API,其中 JSON以及CSV是最容易使用也是最常用的資料格式。

JSON是JavaScript Object Notation的縮寫,是JavaScript程式語言的物件表示法。它是一個輕量級的資料交換語言,最主要的特色是以文字的方式以簡單的格式來描述要交換的資料內容,除了人們容易閱讀之外,對於程式來說也非常容易解析。

在JSON格式中有兩種結構,分別是物件(Object)和陣列(Array)。物件是以大括號{}含括起來的內容,而陣列則是以中括號[]來含括。每一個物件都是一個「{name:value}」的格式,而陣列則是「[value, value]」的型式,這點和串列結構是類似的。

在 此例中,我們先點選JSON後面的「檢視資料」連結,即可看到如下所示的資料格式說明以及資料連結網址:

請複製箭頭所指的位置之網址,編寫以下的程式碼:

import urllib.request, json, ssl
url = 'https://data.wra.gov.tw/Service/OpenData.aspx?format=json&id=50C8256D-30C5-4B8D-9B84-2E14D5C6DF71'
context = ssl._create_unverified_context()
with urllib.request.urlopen(url, context=context) as jsondata:
data = json.loads(jsondata.read().decode())
print(data)

上 述的程式會把水庫的每日資訊下載回來,放到data變數中,當我們列印data的內容時,即可看到以下的內容:

儘管這樣看起來密密麻麻地不太好理解,其實對於電腦來說已經是結構化很容易處理的資料了。我們透過工具程式把上述的資料整理如下(只顯示出部份內容):

從整理過的格式同學們應該就可以看出來每一個文字和數值所代表的意義了。很明顯地,此份資料的最上層是一個叫做'DailyOperationalStatisticsOfReservoirs_OPENDATA'的KEY,而在這份資料下就包含了每一個水庫的詳細資料,例如'ReservoirName'就是水庫的名稱,'DeadStorageLevel'是呆水位,'FullWaterLevel'是滿水位等等資料。以下的程式列出的是所有水庫的有效蓄水量:

import urllib.request, json, ssl
url = 'https://data.wra.gov.tw/Service/OpenData.aspx?format=json&id=50C8256D-30C5-4B8D-9B84-2E14D5C6DF71'
context = ssl._create_unverified_context()
with urllib.request.urlopen(url, context=context) as jsondata:
data = json.loads(jsondata.read().decode())
data = data['DailyOperationalStatisticsOfReservoirs_OPENDATA']
for d in data:
print("{}:{}".format(d['ReservoirName'], d['EffectiveCapacity']))

執行之結果如下:

石門水庫:19740.5
西勢水庫:43.69
新山水庫:1002
榮華壩:62858
青潭堰:71.89
直潭壩:191.89
寶山水庫:503.5
隆恩堰:
寶山第二水庫:3147.18
鯉魚潭水庫:11448.69
德基水庫:15082.2
石岡壩:145.07
士林堰:70.4
霧社水庫:4019.82
日月潭水庫:12857.64
集集攔河堰:411.13
明湖下池:1110
湖山水庫:5085
仁義潭水庫:2531.9
蘭潭水庫:925.8
內埔子:68.0659
白河水庫:691.0324
德元埤:178.8487
烏山頭水庫:7828
曾文水庫:51002
南化水庫:9145.4
鏡面水庫:98.3
虎頭埤:107.2531
鹽水埤:50.8142
阿公店水庫:1509.86
甲仙攔河堰:
牡丹水庫:2632.91
成功水庫:104
興仁水庫:63.7
東衛水庫:18.5
赤崁水庫:25.45
西安水庫:24
七美水庫:22.84
小池水庫:20.57
烏溝蓄水塘:3.54