目標:
- 擷取政府網頁上提供的開放資料(Open Data),並將資料儲存至SQLite資料庫中。
輕量級資料庫 SQLite 簡介 (SQLite官網):
- 免費資料庫。
- 支援 C/C++、JAVA、Python 等常見程式語言。
- 入門相較於微軟、Oracle資料庫容易。
- 主要整合在用戶端程式中,作為本地端儲存資料的常見選擇,像是手機的APP應用程式、嵌入式系統、IOT等所使用。
- 具有跨平台優點。
- 容易安裝。
- 所需的記憶體空間很小(依不同平台,469kbyte~ 11 Mbyte 左右)。
- 檔案型資料庫,備份容易。
開放資料 (Open Data):
- 經過挑選與許可的資料。
- 這種資料不受著作權、專利權,以及其他管理機制所限制。
- 入門相較於微軟、Oracle資料庫容易。
- 可以開放給社會公眾,任何人都可以自由出版使用,不論是要拿來出版或是做其他的運用都不加以限制。
政府的開放資料 (Open Data) 平臺(官網):
開放資料上常見資料交換格式:
- CSV :逗號分隔值(Comma-Separated Values, CSV)有時也稱為字元分隔值,因為分隔字元也可以不是逗號。
- XML :可延伸標記式語言(Extensible Markup Language, XML),是一種標記式語言。標記指電腦所能理解的資訊符號,通過此種標記,電腦之間可以處理包含各種資訊的文章等。
- JSON: 全名為JavaScript Object Notation ,是一種輕量級的資料交換格式,純文字檔且易於閱讀。
圖片資料來源(web)
圖片資料來源(web)
圖片資料來源(web)
程式功能:擷取宜蘭縣加油站資料儲存至 SQLite 資料庫中
- 擷取加油站的公開資訊。
- 儲存到 SQLite資料庫。
圖片資料來源(web)
程式實作開始:
# 作者資訊
__Author__ = 'fatdodo'# 載入擷取剖析網頁相關套件
import requests import json# 擷取網頁資料
url = 'http://www.ilepb.gov.tw/api/ILEPB01001/format/JSON' resp = requests.get(url)# 資料總長度(字數)
print(len(resp.text))# 輸出資料 { key : value}
print(resp.text)# 將JSON文字檔轉譯成符合 Python 字典檔資料
json_dict = json.loads(resp.text)# 依關鍵字(key)儲存對映的資料(value)
data = list() for i in range(len(json_dict)): t = (json_dict[i]['加油站名稱'], json_dict[i]['加油站地址'], json_dict[i]['負責人'], json_dict[i]['聯絡電話']) data.append(t)# 印出資料(value)內容
for i in data: print(i)# 建立資料庫與連線資料庫
import sqlite3
- 由於筆者是使用Anaconda內的Jupyter Notebook,本身就有SQLite套件,直接載入SQLite資料庫套件即可。
dbname = 'gas_station.db'# db : 建立與資料連線,如果資料庫不存在,會自動創建該資料庫。
db = sqlite3.connect(dbname)# cursor : 可稱為資料指標,要查詢某一筆紀錄必須將cursor指標指到它。
cursor = db.cursor()# 建立資料表 # dbtname : 資料表名稱。
dbtname = 'ilan'- sql : 用來從資料庫讀取與儲存資料的資料庫特殊語法。
- ID : 資料的索引值。
- GAS : 加油站名稱。
- ADDR : 加油站地址。
- OWNER : 加油站負責人。
- TEL : 加油站電話號碼。
sql = '''CREATE TABLE {:s}( ID INTEGER PRIMARY KEY AUTOINCREMENT, GAS TEXT NOT NULL, ADDR TEXT NOT NULL, OWNER TEXT NOT NULL, TEL TEXT);'''.format(dbtname)# 在資料庫內建立資料表
try: cursor.execute(sql) except Exception as e: print(e)# 將加油站資料寫入資料庫中
sql = 'INSERT INTO {:s} (GAS, ADDR, OWNER, TEL) VALUES (?,?,?,?);'.format(dbtname) try: cursor.executemany(sql, data) db.commit() except Exception as e: print(e)# 秀出資料庫資料表ilan內容
def show_recs(myc): sql = 'SELECT * FROM {:s} ORDER BY id ASC;'.format(dbtname) try: myc.execute(sql) recs = myc.fetchall() print('_____總共有:{:d} 筆____'.format(len(recs))) for i, rec in enumerate(recs, 1): print(i, '>', rec) except Exception as e: print(e)
show_recs(cursor)# 關閉連線資料庫
cursor.close()
讚
回覆刪除