不動產成交案件實際資訊資料供應系統_使用python自動化下載所有資料
不動產成交案件實際資訊資料供應系統
https://plvr.land.moi.gov.tw/Index#
每月1日、11日或21日,都會維護資料到此平台彙總。
112/10/21(含)之後揭露之不動產租賃OpenData 新增以下欄位:
1.新增「出租型態」欄位:內容包括整棟(戶)出租、分層出租、獨立套房、分租套房、分租雅房
2.新增「有無管理員」欄位:內容為「有」或「無」
3.新增「租賃期間」欄位:內容為不動產租賃契約或住宅轉租契約約定之租賃期間起迄日期
4.新增「有無電梯」欄位:內容為「有」或「無」
5.新增「附屬設備」欄位:內容為依不動產租賃契約或住宅轉租契約所載之附屬設備,如冷氣、熱水器、洗衣機、電視機、冰箱、瓦斯或天然氣、有線電視、有線電視、傢俱或無等
6.新增「租賃住宅服務」欄位:內容為一般包租、一般轉租、一般代管、社會住宅包租轉租、社會住宅代管或無等
可進階選定下載類別或是特定縣市區域
在此可以透過GET請求方式去獲取對應每年特定某季的zip資料
舉例113年第3季
https://plvr.land.moi.gov.tw//DownloadSeason?season=113S3&type=zip&fileName=lvr_landxml.zip
lvr_landxml.zip
https://plvr.land.moi.gov.tw//DownloadSeason?season=113S2&type=zip&fileName=lvr_landxml.zip
113年第1季
https://plvr.land.moi.gov.tw//DownloadSeason?season=113S1&type=zip&fileName=lvr_landxml.zip
112年第4季
https://plvr.land.moi.gov.tw//DownloadSeason?season=112S4&type=zip&fileName=lvr_landxml.zip
112年第3季
https://plvr.land.moi.gov.tw//DownloadSeason?season=112S3&type=zip&fileName=lvr_landxml.zip
......
110年第1季
https://plvr.land.moi.gov.tw//DownloadSeason?season=110S1&type=zip&fileName=lvr_landxml.zip
若要改成下載xls則將紅色標記處改為xls即可。
# -*- coding: utf-8 -*- """ Created on Sun Dec 1 13:53:08 2024 @author: chous """ import os import requests from zipfile import ZipFile from io import BytesIO from time import sleep def download_real_estate_data(start_year, start_season, end_year, end_season, output_dir, auto_extract=False): """ 從不動產成交案件實際資訊資料供應系統下載指定範圍的交易資料。 :param start_year: 起始民國年 (int) :param start_season: 起始季 (1-4) :param end_year: 結束民國年 (int) :param end_season: 結束季 (1-4) :param output_dir: 資料儲存目錄 :param auto_extract: 是否自動解壓縮下載的 zip 檔 """ # 確保輸出目錄存在 os.makedirs(output_dir, exist_ok=True) # 產生下載範圍的年份和季度 years = list(range(start_year, end_year + 1)) years.reverse() # 先處理較新的年份 quarters = ["S1", "S2", "S3", "S4"] # 開始下載檔案 for year in years: for quarter in quarters: # 篩選起迄範圍內的季 if year == start_year and quarter < f"S{start_season}": continue if year == end_year and quarter > f"S{end_season}": continue # 組合下載 URL 和檔名 url = f"https://plvr.land.moi.gov.tw/DownloadSeason?season={year}{quarter}&type=zip&fileName=lvr_landxml.zip" file_name = f"{year}{quarter}_lvr_landxml.zip" file_path = os.path.join(output_dir, file_name) # 為當前年份和季度創建專屬目錄 season_dir = os.path.join(output_dir, f"{year}_{quarter}") os.makedirs(season_dir, exist_ok=True) # 跳過已下載的檔案 if os.path.exists(file_path): print(f"檔案已存在,跳過下載: {file_path}") continue print(f"嘗試下載: {url}") try: # 發送請求 response = requests.get(url, timeout=30) response.raise_for_status() # 確認是否為有效的 ZIP if not response.content.startswith(b'PK'): print(f"非有效 ZIP 檔案,可能是連結無效或資料不存在: {url}") continue # 儲存到本地檔案 with open(file_path, "wb") as f: f.write(response.content) print(f"已儲存: {file_path}") # 是否需要自動解壓縮 if auto_extract: with ZipFile(BytesIO(response.content)) as zip_file: zip_file.extractall(season_dir) print(f"已解壓縮到: {season_dir}") # 避免過多請求導致被封鎖 sleep(2) except requests.RequestException as e: print(f"下載失敗: {url}, 錯誤: {e}") # 使用範例 download_real_estate_data( start_year=110, start_season=1, end_year=113, end_season=3, output_dir="real_estate_data", auto_extract=True )
留言
張貼留言