library(magrittr)
library(data.table)
library(httr)
library(rvest)
library(XML)
library(stringi)
library(RCurl)
library(stringr)

取得資料表格

首先進入表格頁面進行觀察與測試。 選擇「台北地方法院」>房屋>一般程序>全部>查詢,進入到表格頁面的第一頁。

取得 request url 以及 query string parameters,用 ? 將兩者串接在一起,並且刪去空值的參數,得到資料頁面的url

url = "http://aomp.judicial.gov.tw/abbs/wkw/WHD2A03.jsp?"

url= "http://aomp.judicial.gov.tw/abbs/wkw/WHD2A03.jsp?pageTotal=14&saletypeX=1&proptypeX=C52&courtX=TPD&order=odcrm&query_typeX=session&hsimun=all&ctmd=all&sec=all&checkyn=all&emptyyn=all&order=odcrm&pageNow=1&930DA782205AEA0FB8EF2F4CFE8D06F4=DB71E651465196BF6CABD297ED8CDD76"

res <- GET(url) 
htmlFile = getURLContent(url)

其中原檔案使用ms590編碼,需要特殊的處理方式

htmlFileEncodingUTF8 = stri_encode(htmlFile, attr(htmlFile, "Content-Type")[2], "utf8")
table = htmlFileEncodingUTF8 %>% XML::readHTMLTable(encoding = "UTF-8")

觀察table的結構,並選取出需要的資料部分

table %>% str()
## List of 7
##  $ NULL:'data.frame':    22 obs. of  13 variables:
##   ..$ V1 : Factor w/ 19 levels "","[1]\n  \n2\n  \n3\n  \n4\n  \n5\n  \n6\n  \n7\n  \n8\n  \n9\n  \n10\n  \n下一頁>\n  \n下10頁>>\n  \n最後一頁>>",..: 1 1 1 18 3 10 11 12 13 14 ...
##   ..$ V2 : Factor w/ 10 levels "","100司執字第123806號\r\n            \r\n              (洪股)",..: NA 9 8 10 2 2 2 2 2 2 ...
##   ..$ V3 : Factor w/ 7 levels "","105/07/12\r\n              \r\n\r\n                 第1拍",..: NA 1 1 7 2 2 2 2 2 2 ...
##   ..$ V4 : Factor w/ 6 levels "臺北市\r\n                松山區",..: NA NA NA 5 2 2 2 2 2 2 ...
##   ..$ V5 : Factor w/ 13 levels "房屋地址/樓層面積",..: NA NA NA 1 5 5 6 9 7 7 ...
##   ..$ V6 : Factor w/ 7 levels "1,200,000","2,340,000",..: NA NA NA 7 3 3 3 3 3 3 ...
##   ..$ V7 : Factor w/ 3 levels "不點交","點交",..: NA NA NA 2 3 3 3 3 3 3 ...
##   ..$ V8 : Factor w/ 2 levels "","空屋": NA NA NA 2 1 1 1 1 1 1 ...
##   ..$ V9 : Factor w/ 3 levels "","1","標 別": NA NA NA 3 1 1 1 1 1 1 ...
##   ..$ V10: Factor w/ 2 levels "","備 註": NA NA NA 2 1 1 1 1 1 1 ...
##   ..$ V11: Factor w/ 2 levels "看圖","看照片": NA NA NA 1 2 2 2 2 2 2 ...
##   ..$ V12: Factor w/ 2 levels "採通訊投標","否": NA NA NA 1 2 2 2 2 2 2 ...
##   ..$ V13: Factor w/ 2 levels "查詢","土地有無遭受污染": NA NA NA 2 1 1 1 1 1 1 ...
##  $ NULL:'data.frame':    15 obs. of  13 variables:
##   ..$ 筆次                                                     : Factor w/ 15 levels "1","10","11",..: 1 8 9 10 11 12 13 14 15 2 ...
##   ..$ 字號
##                 股別                             : Factor w/ 6 levels "100司執字第123806號\r\n            \r\n              (洪股)",..: 1 1 1 1 1 1 1 1 1 2 ...
##   ..$ 拍賣日期
##               
##                      拍賣次數: Factor w/ 5 levels "105/07/12\r\n              \r\n\r\n                 第1拍",..: 1 1 1 1 1 1 1 1 1 5 ...
##   ..$ 縣市                                                     : Factor w/ 5 levels "臺北市\r\n                松山區",..: 2 2 2 2 2 2 2 2 2 5 ...
##   ..$ 房屋地址/樓層面積                                        : Factor w/ 12 levels "台北市松山區慶城街46巷24號三樓\n\r\n              \r\n              \r\n               \r\n                  \r\n              "| __truncated__,..: 4 4 5 8 6 6 6 3 7 12 ...
##   ..$ 總拍賣底價(元)                                           : Factor w/ 6 levels "1,200,000","2,340,000",..: 3 3 3 3 3 3 3 3 3 6 ...
##   ..$ 點交                                                     : Factor w/ 2 levels "不點交","如備註或使用情形欄所示": 2 2 2 2 2 2 2 2 2 2 ...
##   ..$ 空屋                                                     : Factor w/ 1 level "": 1 1 1 1 1 1 1 1 1 1 ...
##   ..$ 標 別                                                    : Factor w/ 2 levels "","1": 1 1 1 1 1 1 1 1 1 1 ...
##   ..$ 備 註                                                    : Factor w/ 1 level "": 1 1 1 1 1 1 1 1 1 1 ...
##   ..$ 看圖                                                     : Factor w/ 1 level "看照片": 1 1 1 1 1 1 1 1 1 1 ...
##   ..$ 採通訊投標                                               : Factor w/ 1 level "否": 1 1 1 1 1 1 1 1 1 1 ...
##   ..$ 土地有無遭受污染                                         : Factor w/ 1 level "查詢": 1 1 1 1 1 1 1 1 1 1 ...
##  $ NULL:'data.frame':    1 obs. of  1 variable:
##   ..$ 合計件數: 200 件: Factor w/ 1 level "[1]\n  \n2\n  \n3\n  \n4\n  \n5\n  \n6\n  \n7\n  \n8\n  \n9\n  \n10\n  \n下一頁>\n  \n下10頁>>\n  \n最後一頁>>": 1
##  $ NULL:'data.frame':    1 obs. of  1 variable:
##   ..$ V1: Factor w/ 1 level "": 1
##  $ NULL:'data.frame':    14 obs. of  3 variables:
##   ..$ V1: Factor w/ 3 levels "","建議您使用800*600全彩及Internet Explorer 8.0版本以上瀏覽器",..: 3 1 1 1 1 1 1 1 1 1 ...
##   ..$ V2: Factor w/ 13 levels "","1.","10.",..: 2 6 7 8 9 10 11 12 13 3 ...
##   ..$ V3: Factor w/ 13 levels "","本網站拍定資料只保留三個月。",..: 5 7 2 4 12 3 11 6 9 8 ...
##  $ NULL:'data.frame':    2 obs. of  3 variables:
##   ..$ V1: Factor w/ 2 levels "","司法院\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t資訊處 製作。 對於本系統功能有任何建議,\r\n\t\t\t\t\t\t\"| __truncated__: 2 1
##   ..$ V2: Factor w/ 1 level "司法院\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t資訊處 製作。 對於本系統功能有任何建議,\r\n\t\t\t\t\t\t\"| __truncated__: NA 1
##   ..$ V3: Factor w/ 1 level "": NA 1
##  $ NULL:'data.frame':    1 obs. of  3 variables:
##   ..$ V1: Factor w/ 1 level "": 1
##   ..$ V2: Factor w/ 1 level "司法院\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t資訊處 製作。 對於本系統功能有任何建議,\r\n\t\t\t\t\t\t\"| __truncated__: 1
##   ..$ V3: Factor w/ 1 level "": 1
table[[1]] %>% str
## 'data.frame':    22 obs. of  13 variables:
##  $ V1 : Factor w/ 19 levels "","[1]\n  \n2\n  \n3\n  \n4\n  \n5\n  \n6\n  \n7\n  \n8\n  \n9\n  \n10\n  \n下一頁>\n  \n下10頁>>\n  \n最後一頁>>",..: 1 1 1 18 3 10 11 12 13 14 ...
##  $ V2 : Factor w/ 10 levels "","100司執字第123806號\r\n            \r\n              (洪股)",..: NA 9 8 10 2 2 2 2 2 2 ...
##  $ V3 : Factor w/ 7 levels "","105/07/12\r\n              \r\n\r\n                 第1拍",..: NA 1 1 7 2 2 2 2 2 2 ...
##  $ V4 : Factor w/ 6 levels "臺北市\r\n                松山區",..: NA NA NA 5 2 2 2 2 2 2 ...
##  $ V5 : Factor w/ 13 levels "房屋地址/樓層面積",..: NA NA NA 1 5 5 6 9 7 7 ...
##  $ V6 : Factor w/ 7 levels "1,200,000","2,340,000",..: NA NA NA 7 3 3 3 3 3 3 ...
##  $ V7 : Factor w/ 3 levels "不點交","點交",..: NA NA NA 2 3 3 3 3 3 3 ...
##  $ V8 : Factor w/ 2 levels "","空屋": NA NA NA 2 1 1 1 1 1 1 ...
##  $ V9 : Factor w/ 3 levels "","1","標 別": NA NA NA 3 1 1 1 1 1 1 ...
##  $ V10: Factor w/ 2 levels "","備 註": NA NA NA 2 1 1 1 1 1 1 ...
##  $ V11: Factor w/ 2 levels "看圖","看照片": NA NA NA 1 2 2 2 2 2 2 ...
##  $ V12: Factor w/ 2 levels "採通訊投標","否": NA NA NA 1 2 2 2 2 2 2 ...
##  $ V13: Factor w/ 2 levels "查詢","土地有無遭受污染": NA NA NA 2 1 1 1 1 1 1 ...
data = table[[1]] %>% data.table 
# data
data %<>% .[4:19]

以上是取得表格的code,將它們打包成為一個函式GetDataTable

GetDataTable = function(url){
  require(magrittr)
  require(data.table)
  require(httr)
  require(rvest)
  require(XML)
  require(stringi)
  require(RCurl)

  res <- GET(url) 
  htmlFile = getURLContent(url)
  htmlFileEncodingUTF8 = stri_encode(htmlFile, attr(htmlFile, "Content-Type")[2], "utf8")
  table = htmlFileEncodingUTF8 %>% XML::readHTMLTable(encoding = "UTF-8")
  data = table[[1]] %>% data.table 
  data %<>% .[4:19]
  
  return(data)
}

串接url

回到選擇「執行拍賣法院」,利用inspector測試, 選擇執行拍賣法院,記錄各法院的參數代號,如台北地方法院是TPD、新北為PCD、士林SLD…等等

接著進入「拍賣標的」、「拍賣程序與結果」的頁面, 選擇房屋/土地/動產,參數分別是proptype=C52/C51/C54 選擇一般程序/應買公告/拍定價格,參數分別是saletype=1/4/5

撰寫一個函式GetURL,輸入「執行拍賣法院」、「拍賣標的」、「拍賣程序與結果」等參數,即可回傳url

GetURL = function(saletypeX, proptypeX, courtX){
  
  #GetPage函數可以取得該條件參數下可以得到的所有資料有多少頁
  GetPage = function(saletypeX, proptypeX, courtX){
  request1 = "http://aomp.judicial.gov.tw/abbs/wkw/WHD2A03.jsp"
  request2 = "order=odcrm&query_typeX=session&hsimun=all&ctmd=all&sec=all&checkyn=all&emptyyn=all&order=odcrm&930DA782205AEA0FB8EF2F4CFE8D06F4=DB71E651465196BF6CABD297ED8CDD76"

  url = paste0(request1, "?", saletypeX,"&", courtX, "&", proptypeX, "&", request2)
  htmlFile = getURLContent(url)
  htmlFileEncodingUTF8 = stri_encode(htmlFile, attr(htmlFile, "Content-Type")[2], "utf8")
  last_item = htmlFileEncodingUTF8 %>% read_html %>% html_nodes(xpath = "//nobr") %>%
    as.character %>% tail(1)
  start<-regexpr("form.pageNow.value=", last_item)
  end<- regexpr("form.submit()", last_item)
  page = substr(last_item, start+19, end-2) %>% as.numeric
  return(page)
  }
  #將參數丟入 GetPage 函式中,可得到最大頁數
  page = GetPage(saletypeX, proptypeX, courtX) %>% as.numeric
  
  #將頁數範圍也作為一個參數,和其他參數黏合成為url
  if(is.na(page)==FALSE){
    (pageNow_pageTotal=paste0("pageNow=", 1:page,"&pageTotal=", 1:page))
    request1 = "http://aomp.judicial.gov.tw/abbs/wkw/WHD2A03.jsp"
    request2 = "order=odcrm&query_typeX=session&hsimun=all&ctmd=all&sec=all&checkyn=all&emptyyn=all&order=odcrm&930DA782205AEA0FB8EF2F4CFE8D06F4=DB71E651465196BF6CABD297ED8CDD76"
    url.page=vector()    
    for(p in 1:length(pageNow_pageTotal)){
      url.page[p] = paste0(request1, "?", pageNow_pageTotal[p],"&", 
                           saletypeX,"&", courtX, "&", proptypeX, "&", request2)
    }
  }
  
  return(url.page)
}

以courtX=“courtX=PCD”,saletypeX =“saletypeX=5”,proptypeX=“proptypeX=C51”為例, 先丟入GetURL函式,得到所有的url,再丟入GetDataTable函式裡即可得到所有資料

urls = GetURL(saletypeX = "saletypeX=5", proptypeX = "proptypeX=C51", courtX = "courtX=PCD")

r2 = lapply(urls, GetDataTable) 
result = data.table()
for(i in 1:length(r2)){
  r = r2[[i]]
  res = data.table("筆次"=r$V1[-1],
                    "字號"=r$V2[-1] %>% str_replace_all(., "\\s", ""),
                    "拍賣日期"=r$V3[-1],
                    "縣市"=r$V4[-1] %>% str_replace_all(., "\\s", ""),
                    "土地坐落/面積"=r$V5[-1] %>% str_replace_all(., "\\s", ""),
                    "總拍賣底價(元)"=r$V6[-1],
                    "總拍定價格(元)"=r$V7[-1],
                    "採通訊投標"=r$V8[-1],
                    "土地有無遭受污染"=r$V9[-1]
                    )
  result = rbind(result, res)
}
result
##      筆次                      字號  拍賣日期         縣市
##   1:    1  103司執字第43863號(辰股) 105/06/01 新北市鶯歌區
##   2:    2  103司執字第49740號(辰股) 105/06/29 新北市三峽區
##   3:    3  103司執字第49740號(辰股) 105/06/29 新北市三峽區
##   4:    4  103司執字第49740號(辰股) 105/06/29 新北市三峽區
##   5:    5  103司執字第49740號(辰股) 105/06/29 新北市三峽區
##  ---                                                      
## 131:  131 103司執字第109798號(壯股) 105/04/18 新北市新莊區
## 132:  132 103司執字第132247號(濟股) 105/04/07 新北市林口區
## 133:  133 103司執字第139991號(土股) 105/04/25 新北市板橋區
## 134:  134 103司執字第144839號(壯股) 105/04/18 新北市中和區
## 135:  135   104司執字第1880號(蘭股) 105/04/21 新北市永和區
##                                                          土地坐落/面積
##   1:                中正段小段99-2號0坪x2分之1拍定金額:新台幣32,000元
##   2:          成福段小暗坑小段145號196坪x全部拍定金額:新台幣720,000元
##   3:        成福段小暗坑小段147號451坪x全部拍定金額:新台幣1,640,000元
##   4:        成福段小暗坑小段149號927坪x全部拍定金額:新台幣3,350,000元
##   5:      成福段小暗坑小段1051號2485坪x全部拍定金額:新台幣8,960,000元
##  ---                                                                  
## 131:             思賢段小段949號19坪x4分之1拍定金額:新台幣3,520,000元
## 132: 菁埔段粉寮水尾小段0267號3537坪x84分之2拍定金額:新台幣1,001,000元
## 133:       中山段小段24號441坪x10000分之101拍定金額:新台幣9,660,000元
## 134:             景華段小段608號34坪x8分之1拍定金額:新台幣5,600,000元
## 135:     頂溪段小段701號1275坪x10000分之96拍定金額:新台幣20,470,000元
##      總拍賣底價(元) 總拍定價格(元) 採通訊投標 土地有無遭受污染
##   1:        812,000        815,800         否             查詢
##   2:     16,640,000     16,640,000         否             查詢
##   3:     16,640,000     16,640,000         否             查詢
##   4:     16,640,000     16,640,000         否             查詢
##   5:     16,640,000     16,640,000         否             查詢
##  ---                                                          
## 131:      3,720,000      4,469,999         否             查詢
## 132:      1,000,000      1,001,000         否             查詢
## 133:     13,440,000     16,060,000         否             查詢
## 134:      3,600,000      6,000,000         否             查詢
## 135:     26,950,000     29,500,000         否             查詢