Skip to main content

用Python來抓取政府公開資料(JSON) -2 :YouBike 2.0 / iBike

一、台北市YouBike 2.0

(一) 尋找開放資料

1.使用瀏覽器打開「台北市資料大平臺」: https://data.taipei/

image-1620265870330.png

2.輸入「youbike」,即可找到YouBike2.0 即時資訊, 點擊後按下右邊的放大鏡來搜尋。

image-1620265899058.png

4. 可看到右上角有「下載」就是資訊介接的網址,下方有主要欄位說明。image-1620266012605.png

(二)程式撰寫

進入Python開發環境IDLE,開啟新檔案,複製以下範例程式碼並進行修改:

import  json, ssl, urllib.request

url = 'JSON下載的網址'
context = ssl._create_unverified_context()

with urllib.request.urlopen(url, context=context) as jsondata:
    #將JSON進行UTF-8的BOM解碼,並把解碼後的資料載入JSON陣列中
     data = json.loads(jsondata.read().decode('utf-8-sig')) 

for i in data:
      print(i['sna'],'\t',i['sbi'],'\t',i['bemp'])

上例中的「sna」、「sbi」及「bemp」可依照「資料資源欄位」自行修改。

執行之後會出現以下畫面:

image-1620266156529.png

(以下略)

 

練習1:請顯示所有YouBike站的可借數量及空位數量

 

 

(三)資料的計算

 

如果要統計公開資料裡面的數字,我們可以將程式略做修改,例如我們想計算全部YouBike站的車輛數及空位數,我們可以將資料加總。

把原來的 for i in data 迴圈改寫成:

bike=0   #場站目前車輛數量 變數
empty=0  #空位數量 變數

for i in data:
         bike += int(i['sbi'])
         empty += int(i['bemp'])

print("全部車輛數量=", bike, '全部空位數量=', empty)     

 

練習2:請加總所有YouBike站車輛及空位數量

(四)資料的搜尋

 

如果我們想讓使用者依照關鍵字列出資料,可以先用input取得關鍵字,然後使用if ,配合 find 函數:

字串變數.find(要搜尋的字串)

例如:

a="This is a book"
b="a"
print(a.find(b))

結果為8  

意思就是b字串出現在a字串的第幾個字(第一個字的位置是0),如果>=0 表示a字串中有b字串,否則傳回-1

 

因此我們可以將這個搜尋函數應用在資料的搜尋上,例如name字串變數是使用者要搜尋的站名,只要在i的for迴圈中,加上 if i['sna'].find(name) >= 0 就表示學校名稱中含有使用者要搜尋的文字:

image-1620266645513.png

執行結果為:

image-1620266615874.png五)ㄠ

練習3:讓使用者輸入站名或地址的關鍵字,列出空位有10個以上的站點之車輛及空位數量 (結果要截圖上傳)

(五)其他開放資料的應用

 

練習4:請自行找一項政府開放資料,試著統計或列出裡面你感興趣的資料  (必須有搜尋功能,結果截圖上傳)

 

(六)上面這隻程式可以用在哪種JSON資料?

只要JSON格式的最前面是 [ { 開頭,接下來就直接是資料的欄位名稱 這種JSON都可用以上程式。

例如:image-1620793558914.png臺中市停車場剩餘車位 

 

image-1639668809371.png


 

二、台中iBike公開資料

1.先到台中市政府資料開放平台(https://opendata.taichung.gov.tw

image-1620792598996.png

捲到下方找到iBike的即時車位資料:

image-1620792591823.png

目前iBike只提供JSON格式資料可下載:

image-1620792658332.png

下方提供資料的欄位說明:

image-1620792682503.png

上方的「網址」就是 JSON的下載網址:

image-1620792737871.png

因為台中市iBike的資料格式非標準格式,寫法會有所不同,程式需要略為修改。

import  json, ssl, urllib.request

url = 'JSON下載網址'
context = ssl._create_unverified_context()

with urllib.request.urlopen(url, context=context) as jsondata:
    #將JSON進行UTF-8的BOM解碼,並把解碼後的資料載入JSON陣列中
     data = json.loads(jsondata.read().decode('utf-8-sig')) 

for key,value in data["retVal"].items():
    sna = value["sna"]    #站名
    sbi = value["sbi"]    #車輛數
    bemp = value["bemp"]  #空位數
    print(sna , "車輛數=",sbi, " 空位數=",bemp)

執行結果:

image-1620792902751.png