實價登錄資料分析教學:從爬蟲到 SQL 資料庫完整實作
BY PJ.
-2025 年 5 月 7 日
(最後更新於: 2025 年 5 月 10 日)
在實務的數據分析場景中,經常需處理大量資料,若直接用 Python 或 Excel 分析,不僅效率低下,也容易當機。
為了解決這類問題,我們會使用 SQL 資料庫儲存及處理資料
,彙整後再傳至Python分析
,或搭配 Tableau 等工具進行視覺化
呈現。本篇文章透過實價登錄的開放資料案例,將教你如何:
- 使用 Python 爬內政部實價登錄資料
- 解壓資料並存至 SQL Server 資料庫
- 預作後續的資料分析與視覺化準備
1. SQL Server 環境建置
在正式使用 Python 將資料寫入資料庫之前,我們需要先安裝並設定 SQL Server
與 SQL Server Management Studio(SSMS)
。
📦 安裝與設定流程
你需要完成以下幾個步驟:
- 安裝 SQL Server(建議安裝「Developer Edition」版本,功能完整且免費)
- 安裝 SQL Server Management Studio (SSMS) 作為資料庫操作介面
- 在 SSMS 中建立登入帳號(選擇
SQL Server Authentication
)
- 新增一個資料庫(例如我的案例為 tasker)
若你不熟悉 SQL Server 建置流程,可參考微軟官方教學( SQL Server Management Studio (SSMS) 下載與說明 ) 或 YouTube 上的安裝與連線影片( 速攻!Microsoft SQL Server 2019 安裝教學(中文))。
完成以上安裝步驟後,你就能在 SSMS 中順利登入伺服器、建立資料庫,並準備接下來用 Python 將資料寫入 SQL Server。
2. 使用 Python 爬取實價登錄資料
內政部不動產實價登錄分為「歷史資料」
與「即時資料」
兩部分。我們先定義兩個函式來分別處理:
📦 安裝所需套件:
import requests
import os
import shutil
import zipfile
import time
import pandas as pd
⏳ 歷史資料爬蟲:
def real_estate_crawler(year, season):
if year > 1000:
year -= 1911
res = requests.get(f"https://plvr.land.moi.gov.tw//DownloadSeason?season={year}S{season}&type=zip&fileName=lvr_landcsv.zip")
fname = f"{year}{season}.zip"
open(fname, 'wb').write(res.content)
folder = f'real_estate{year}{season}'
os.makedirs(folder, exist_ok=True)
with zipfile.ZipFile(fname, 'r') as zip_ref:
zip_ref.extractall(folder)
time.sleep(10)
⚡ 即時資料爬蟲:
def new_data_crawler():
res = requests.get("https://plvr.land.moi.gov.tw/Download?type=zip&fileName=lvr_landxls.zip")
# 清除舊資料
for target in ['now.zip', 'real_estate_now']:
try:
if os.path.isfile(target):
os.remove(target)
elif os.path.isdir(target):
shutil.rmtree(target)
except Exception as e:
print(e)
open('now.zip', 'wb').write(res.content)
os.makedirs('real_estate_now', exist_ok=True)
with zipfile.ZipFile('now.zip', 'r') as zip_ref:
zip_ref.extractall('real_estate_now')
▶️ 執行爬蟲:
# 爬取歷年資料
for year in range(110, 115): # 可改為當前年份+1
for season in range(1, 5):
real_estate_crawler(year, season)
# 爬取即時資料
new_data_crawler()
3. Python 連接 SQL Server
- 安裝 pyodbc
pip install pyodbc
- 安裝 ODBC Driver 17(Windows)
(1) 下載檔案
👉 ODBC Driver 17 官方下載連結
(2) 根據系統版本選擇安裝檔案
(3) 執行安裝程式,一路點「下一步」完成安裝。
🔌 建立連線:
import pyodbc
connection_string = (
"DRIVER={ODBC Driver 17 for SQL Server};"
"SERVER=LAPTOP-QPC0EFB2;" # 改為你的主機名稱
"DATABASE=tasker;" # 改為你的資料庫名稱
"UID=你的帳號;"
"PWD=你的密碼;"
)
connection = pyodbc.connect(connection_string)
cursor = connection.cursor()
4. 建立資料表
cursor.execute("""
CREATE TABLE house_price (
鄉鎮市區 varchar(255),
交易標的 varchar(255),
土地位置建物門牌 varchar(255),
土地移轉總面積平方公尺 float,
都市土地使用分區 varchar(255),
非都市土地使用分區 varchar(255),
非都市土地使用編定 varchar(255),
交易年月日 varchar(20),
交易筆棟數 varchar(255),
移轉層次 varchar(255),
總樓層數 varchar(255),
建物型態 varchar(255),
主要用途 varchar(255),
主要建材 varchar(255),
建築完成年月 varchar(20),
建物移轉總面積平方公尺 float,
建物現況格局_房 varchar(255),
建物現況格局_廳 varchar(255),
建物現況格局_衛 varchar(255),
建物現況格局_隔間 varchar(20),
有無管理組織 varchar(20),
總價元 varchar(255),
單價元平方公尺 varchar(255),
車位類別 varchar(255),
車位移轉總面積平方公尺 float,
車位總價元 varchar(255),
編號 varchar(255),
不動產類別 varchar(10)
)
""")
connection.commit()
5. 將資料寫入 SQL Table
path = os.getcwd()
all_files = os.listdir(os.getcwd())
for file in all_files:
if 'real_estate' in file and '.ipynb' not in file and 'md' not in file:
print('.............................................')
print(path + '\\' +file)
print('.............................................')
for f in (os.listdir(path + '\\' +file)):
if len(f) == 16 and '_c' not in f and 'schema' not in f:
print(path + '\\' +file + '\\' +f)
if 'now' in file: #若為即時檔案,檔案格式為xls
if '_a' in f:
df_new = pd.read_excel(path + '\\' +file + '\\' +f,sheet_name= '不動產買賣')
df_new = df_new[['鄉鎮市區', '交易標的', '土地位置建物門牌', '土地移轉總面積平方公尺', '都市土地使用分區', '非都市土地使用分區',
'非都市土地使用編定', '交易年月日', '交易筆棟數', '移轉層次', '總樓層數', '建物型態', '主要用途', '主要建材',
'建築完成年月', '建物移轉總面積平方公尺', '建物現況格局-房', '建物現況格局-廳', '建物現況格局-衛',
'建物現況格局-隔間', '有無管理組織', '總價元', '單價元平方公尺', '車位類別', '車位移轉總面積平方公尺', '車位總價元','編號'
]]
df_new['不動產類別'] = '中古屋'
elif '_b' in f:
df_new = pd.read_excel(path + '\\' +file + '\\' +f,sheet_name= '預售屋買賣')
df_new = df_new[['鄉鎮市區', '交易標的', '土地位置建物門牌', '土地移轉總面積平方公尺', '都市土地使用分區', '非都市土地使用分區',
'非都市土地使用編定', '交易年月日', '交易筆棟數', '移轉層次', '總樓層數', '建物型態', '主要用途', '主要建材',
'建築完成年月', '建物移轉總面積平方公尺', '建物現況格局-房', '建物現況格局-廳', '建物現況格局-衛',
'建物現況格局-隔間', '有無管理組織', '總價元', '單價元平方公尺', '車位類別', '車位移轉總面積平方公尺', '車位總價元','編號'
]]
df_new['不動產類別'] = '預售屋'
else:
df_new = pd.read_csv(path + '\\' +file + '\\' +f, on_bad_lines='skip', engine='python')
if '_a' in f:
df_new = df_new[['鄉鎮市區', '交易標的', '土地位置建物門牌', '土地移轉總面積平方公尺', '都市土地使用分區', '非都市土地使用分區',
'非都市土地使用編定', '交易年月日', '交易筆棟數', '移轉層次', '總樓層數', '建物型態', '主要用途', '主要建材',
'建築完成年月', '建物移轉總面積平方公尺', '建物現況格局-房', '建物現況格局-廳', '建物現況格局-衛',
'建物現況格局-隔間', '有無管理組織', '總價元', '單價元平方公尺', '車位類別', '車位移轉總面積平方公尺', '車位總價元','編號'
]]
df_new['不動產類別'] = '中古屋'
elif '_b' in f:
df_new = df_new[['鄉鎮市區', '交易標的', '土地位置建物門牌', '土地移轉總面積平方公尺', '都市土地使用分區', '非都市土地使用分區',
'非都市土地使用編定', '交易年月日', '交易筆棟數', '移轉層次', '總樓層數', '建物型態', '主要用途', '主要建材',
'建築完成年月', '建物移轉總面積平方公尺', '建物現況格局-房', '建物現況格局-廳', '建物現況格局-衛',
'建物現況格局-隔間', '有無管理組織', '總價元', '單價元平方公尺', '車位類別', '車位移轉總面積平方公尺', '車位總價元','編號'
]]
df_new['不動產類別'] = '預售屋'
df_new = df_new.drop(index=0)
#df = pd.concat([df,df_new])
#更改欄位名稱與sql一致(sql不能使用-,改為_)
df_new.columns = ['鄉鎮市區', '交易標的', '土地位置建物門牌', '土地移轉總面積平方公尺', '都市土地使用分區', '非都市土地使用分區',
'非都市土地使用編定', '交易年月日', '交易筆棟數', '移轉層次', '總樓層數', '建物型態', '主要用途', '主要建材',
'建築完成年月', '建物移轉總面積平方公尺', '建物現況格局_房', '建物現況格局_廳', '建物現況格局_衛',
'建物現況格局_隔間', '有無管理組織', '總價元', '單價元平方公尺', '車位類別', '車位移轉總面積平方公尺', '車位總價元',
'編號','不動產類別']
# 將所有的字串類型欄位中的字符長度限制為50
df_new = df_new.applymap(lambda x: x[:50] if isinstance(x, str) else x)
#寫入sql
# 計算程式開始的時間
start_time = time.time()
df_new.to_sql('house_price', con=engine, if_exists='append', index=False)
# 計算程式結束的時間
end_time = time.time()
# 計算總執行時間(以秒為單位)
execution_time = end_time - start_time
print(f"程式執行時間: {execution_time} 秒")
6. 確認資料是否成功寫入
開啟 SQL Server Management Studio,於左側導覽中選擇你的資料庫,展開 Tables > dbo.house_price,點右鍵選擇:Select Top 1000 Rows
確認資料是否正確顯示,即可進入後續分析階段。
查詢結果
小結與下一步
本篇示範如何透過 Python 建立一條從:
資料爬蟲 → 資料清洗 → SQL 儲存
的自動化流程。
後續文章將會進一步說明:
- 使用 SQL 查詢各縣市或鄉鎮市區的房價概況
- 常用 SQL 分析語法
- 資料串接 Tableau 建立互動式儀表板
如果這篇文章對你有幫助,歡迎分享給正在學習資料分析或處理實價登錄資料的朋友!