不動產成交案件實際資訊資料供應系統_使用python自動化下載所有資料

 

不動產成交案件實際資訊資料供應系統
https://plvr.land.moi.gov.tw/Index#
每月1日、11日或21日,都會維護資料到此平台彙總。

112/10/21(含)之後揭露之不動產租賃OpenData 新增以下欄位:

1.新增「出租型態」欄位:內容包括整棟(戶)出租、分層出租、獨立套房、分租套房、分租雅房
2.新增「有無管理員」欄位:內容為「有」或「無」
3.新增「租賃期間」欄位:內容為不動產租賃契約或住宅轉租契約約定之租賃期間起迄日期
4.新增「有無電梯」欄位:內容為「有」或「無」
5.新增「附屬設備」欄位:內容為依不動產租賃契約或住宅轉租契約所載之附屬設備,如冷氣、熱水器、洗衣機、電視機、冰箱、瓦斯或天然氣、有線電視、有線電視、傢俱或無等
6.新增「租賃住宅服務」欄位:內容為一般包租、一般轉租、一般代管、社會住宅包租轉租、社會住宅代管或無等



可進階選定下載類別或是特定縣市區域



使用python自動化下載所有資料
在此可以透過GET請求方式去獲取對應每年特定某季的zip資料

舉例113年第3季
https://plvr.land.moi.gov.tw//DownloadSeason?season=113S3&type=zip&fileName=lvr_landxml.zip


lvr_landxml.zip

可以觀察到URL請求的一個規律性

113年第2季
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
)







留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header