天下雜誌記者林佳賢
# install httr package
install.packages("httr")
# load httr package
library(httr)
# 用GET功能把591租屋網搜尋台北市租屋的結果拿下來
doc <- GET("https://rent.591.com.tw/index.php?module=search&action=rslist&is_new_list=1&type=1&searchtype=1®ion=0&listview=txt&firstRow=40&totalRows=54040")
# 用content功能觀察剛剛拿下來的網頁內容
content(doc, "text")
# load httr package
library(httr)
library(jsonlite)
# 用GET功能把591租屋網搜尋台北市租屋的結果拿下來
doc <- GET("https://rent.591.com.tw/index.php?module=search&action=rslist&is_new_list=1&type=1&searchtype=1®ion=1&orderType=desc&listview=txt&firstRow=120&totalRows=12674")
# 用content功能觀察剛剛拿下來的網頁內容
content(doc, "text")
# 把剛剛拿下來的網頁內容,從json格式轉成R容易處理的格式
df <- fromJSON(content(doc, "text"))
# load httr package
library(httr)
library(jsonlite)
...
# 把剛剛拿下來的網頁內容,從json格式轉成R容易處理的格式
df <- fromJSON(content(doc, "text"))
# 我們還要從df這個list中,找到需要的那一部分
rent_data <- df[["main"]]
# load package
library(httr)
library(jsonlite)
library(rvest)
...
# 用rvest的read_html功能,讀取rent_data
rent_html <- read_html(rent_data)
# 用剛剛取得的css selector找尋節點
name <- html_nodes(rent_html, ".address a")
# 取出節點中需要的部分「title」
name <- html_attr(name, "title")
# load package
library(httr)
library(jsonlite)
library(rvest)
...
# 用一樣的步驟抓取縣市、行政區、租屋面積和租金
county <- html_nodes(rent_html, ".txt-sh-region")
county <- html_text(county)
town <- html_nodes(rent_html, ".txt-sh-section")
town <- html_text(town)
area <- html_nodes(rent_html, ".area")
area <- html_text(area)
price <- html_nodes(rent_html, ".price .fc-org")
price <- html_text(price)
# load package
library(httr)
library(jsonlite)
library(rvest)
...
# 最後把所有的資料存到一個檔案裡
rent_df <- data.frame(
county = county,
town = town,
name = name,
area = area,
price = price
)
# load package
library(httr)
library(jsonlite)
library(rvest)
...
# 只要改動firstRow的數字,就能爬取其他頁面的資料。
# 也就是只要一個迴圈,就可以把所有租屋資訊抓下來。
doc2 <- GET("https://rent.591.com.tw/index.php?module=search&action=rslist&is_new_list=1&type=1&searchtype=1®ion=0&listview=txt&firstRow=40&totalRows=54040")
# load package
library(httr)
library(jsonlite)
library(rvest)
library(stringr)
...
# 清理價格資訊,把逗點跟「元」清掉
rent_df$price <- str_replace_all(rent_df$price, ",|元", "")
# 再把price欄從「文字」轉成「數字」
rent_df$price <- as.numeric(rent_df$price)
# load package
library(httr)
library(jsonlite)
library(rvest)
library(stringr)
...
# 新成立type一欄,這一欄的資訊來自area欄
# 我們用「/」切割type欄
# 再取出後面的部分作為type欄的資訊
rent_df$type <-
sapply(str_split(rent_df$area, "/"), "[[", 2)
# load package
library(httr)
library(jsonlite)
library(rvest)
library(stringr)
...
# 新的area欄的資訊還ㄕ來自原本的area欄
# 我們用「/」切割type欄
# 取出前面的部分作為type欄的資訊
rent_df$area <- sapply(str_split(rent_df$area, "/"), "[[", 1)
# 接著把「坪」清掉
rent_df$area <- str_replace_all(rent_df$area, "坪", "")
# 再轉成數字格式
rent_df$area <- as.numeric(rent_df$area)
# load package
library(httr)
library(jsonlite)
library(rvest)
library(stringr)
...
# 新成立unit_price一欄
# 這一欄的資料是price欄除以area欄
rent_df$unit_price <- rent_df$price / rent_df$area
# 再四捨五入到整數位的結果
rent_df$unit_price <- round(rent_df$unit_price)
# load package
library(httr)
library(jsonlite)
library(rvest)
library(stringr)
library(dplyr)
...
# 把rent591裡面台北市的資料拿出來
rent591_tp <- filter(rent591, county == "台北市")
# 把rent591裡面租金大於1萬元的資料拿出來
rent591_expensive <- filter(rent591, price > 10000)
# 把rent591裡面的套房資料拿出來
rent591_tao <- filter(rent591, type == "套房")
# load package
library(httr)
library(jsonlite)
library(rvest)
library(stringr)
library(dplyr)
...
# 把rent591_tp的資料以租金由高到低排列
rent591_tp <- arrange(rent591_tp, desc(price))
# 把rent591_tao的資料以每坪租金由低到高排列
rent591_tao <- arrange(rent591_tao, unit_price)
# 把rent591_tao_ya根據縣市名稱做排序
rent591_tao <- arrange(rent591_tao, county)
# load package
library(httr)
library(jsonlite)
library(rvest)
library(stringr)
library(dplyr)
...
# 計算台北市各行政區的平均租金
# 先把rent591_tp根據行政區分類
rent591_tp_group <- group_by(rent591_tp, town)
# 再根據分類結果計算各行政區的平均租金
rent591_tp_price <- summarise(rent591_tp_group,
mean_price = mean(price))
# 最後把計算結果排序
rent591_tp_price <- arrange(rent591_tp_price,
desc(mean_price))
# load package
library(httr)
library(jsonlite)
library(rvest)
library(stringr)
library(dplyr)
...
# 計算台北市各行政區的套房平均租金
# 先篩選出rent591_tp的套房資料
rent591_tp <- filter(rent591_tp, type == "套房")
# 先把rent591_tp根據行政區分類
rent591_tp_group <- group_by(rent591_tp, town)
# 再根據分類結果計算各行政區的平均租金
rent591_tp_price <- summarise(rent591_tp_group, mean_price = mean(price))
# 最後把計算結果排序
rent591_tp_price <- arrange(rent591_tp_area,
desc(mean_price))
# load package
library(httr)
library(jsonlite)
library(rvest)
library(stringr)
library(dplyr)
library(ggplot2)
...
# 把台北市各行政區的平均租金繪製成長條圖
# 設定畫布跟基本資訊:
# 使用的資料:rent591_tp_price、x軸:town、y軸:mean_price
ggplot(rent591_tp_price, aes(town, mean_price)) +
# 選擇要畫的圖表類型,這裡選擇geom_bar(長條圖)
# stat = "identity"指的是用原本的數字作為長條高度
geom_bar(stat = "identity") +
# 由於R不支援中文,因此要設定字體,這裡設定STHeiti(黑體)
theme(text = element_text(family = "STHeiti"))
# load package
library(httr)
library(jsonlite)
library(rvest)
library(stringr)
library(dplyr)
library(ggplot2)
...
# 把台北市行政區轉成可排序的factor格式,再根據自己定義的順序排序factor
rent591_tp_price$town <- factor(rent591_tp_price$town,
c("信義區","中山區","松山區",
"大安區","中正區","萬華區",
"大同區","士林區","內湖區",
"南港區","北投區","文山區"))
# 再畫一次圖
ggplot(rent591_tp_price, aes(town, mean_price)) +
geom_bar(stat = "identity") +
theme(text = element_text(family = "STHeiti"))