資料讀取與匯出

  • read_delim()
  • read_csv()
  • read_excel()
  • readRDS() R物件有檔案小與讀取快速的優點

台北市資料大平台: 以網站上提供的API,用R讀取資料。

除了檔案的資料介面,在網際網路中為了方便傳輸資料,資料在傳遞前都會進行序列化(serialize),json、soap、binary和xml都是經常選擇的格式。

常遇到具有REST Api Http服務的資料集提供者,其中json格式大概是目前最常見的選擇,2016這年頭SQL Server也支援json儲存了,未來我們應該有許多機會常和json格式碰到面,今天來複習JSON(JavaScript Object Notation)格式載入。

臺北市公有零售市場行情

  • 主要欄位說明: 日期,種類,市場,品名,平均(元/公斤)
# install.packages("jsonlite")
library(jsonlite)
data_json <- fromJSON("https://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=f4f80730-df59-44f9-bfb8-32c136b1ae68") 
str(data_json)
## List of 1
##  $ result:List of 5
##   ..$ limit  : int 1000
##   ..$ offset : int 0
##   ..$ count  : int 24474
##   ..$ sort   : chr ""
##   ..$ results:'data.frame':  1000 obs. of  6 variables:
##   .. ..$  平均(元 / 公斤): chr [1:1000] "61.33" "70.00" "380.00" "45.00" ...
##   .. ..$  品名           : chr [1:1000] "蘿蔔" "胡蘿蔔" "青蔥                                              " "蕹菜(空心菜)                                              " ...
##   .. ..$  市場           : chr [1:1000] "士東" "士東" "士東" "士東" ...
##   .. ..$ 日期            : chr [1:1000] "2019-01-01" "2019-01-01" "2019-01-01" "2019-01-01" ...
##   .. ..$  種類           : chr [1:1000] "蔬菜" "蔬菜" "蔬菜" "蔬菜" ...
##   .. ..$ _id             : int [1:1000] 1 2 3 4 5 6 7 8 9 10 ...
data <- data_json[["result"]] [["results"]]
str(data)
## 'data.frame':    1000 obs. of  6 variables:
##  $  平均(元 / 公斤): chr  "61.33" "70.00" "380.00" "45.00" ...
##  $  品名           : chr  "蘿蔔" "胡蘿蔔" "青蔥                                              " "蕹菜(空心菜)                                              " ...
##  $  市場           : chr  "士東" "士東" "士東" "士東" ...
##  $ 日期            : chr  "2019-01-01" "2019-01-01" "2019-01-01" "2019-01-01" ...
##  $  種類           : chr  "蔬菜" "蔬菜" "蔬菜" "蔬菜" ...
##  $ _id             : int  1 2 3 4 5 6 7 8 9 10 ...
head(data, 10)
##     平均(元 / 公斤)                                                       品名
## 1             61.33                                                       蘿蔔
## 2             70.00                                                     胡蘿蔔
## 3            380.00         青蔥                                              
## 4             45.00 蕹菜(空心菜)                                              
## 5             45.00         青江白菜                                          
## 6             95.00         胡瓜                                              
## 7             95.00         絲瓜                                              
## 8             61.33                                                       蘿蔔
## 9             70.00                                                     胡蘿蔔
## 10           380.00         青蔥                                              
##     市場       日期  種類 _id
## 1   士東 2019-01-01  蔬菜   1
## 2   士東 2019-01-01  蔬菜   2
## 3   士東 2019-01-01  蔬菜   3
## 4   士東 2019-01-01  蔬菜   4
## 5   士東 2019-01-01  蔬菜   5
## 6   士東 2019-01-01  蔬菜   6
## 7   士東 2019-01-01  蔬菜   7
## 8   士東 2019-01-02  蔬菜   8
## 9   士東 2019-01-02  蔬菜   9
## 10  士東 2019-01-02  蔬菜  10

臺北市自來水事業處各水質監測站,所測得水質之濁度、餘氯、酸鹼度等數據15分鐘平均值:

1.update_date : 日期 2.update_time : 時間 3.qua_id : 監控站ID 4.code_name : 監控站名稱 5.longitude : 經度 6.latitude: 緯度 7.qua_cntu: 濁度(NTU) 8.qua_cl: 餘氯(mg/L) 9.qua_ph: 酸度(pH) 10.偵測值-9係維修中,暫停偵測。

data_json <- fromJSON("https://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=190796c8-7c56-42e0-8068-39242b8ec927") 
str(data_json)
## List of 1
##  $ result:List of 5
##   ..$ limit  : int 1000
##   ..$ offset : int 0
##   ..$ count  : int 93
##   ..$ sort   : chr ""
##   ..$ results:'data.frame':  93 obs. of  10 variables:
##   .. ..$ update_date: chr [1:93] "2020-03-18" "2020-03-18" "2020-03-18" "2020-03-18" ...
##   .. ..$ update_time: chr [1:93] "19:00:00  " "19:00:00  " "19:00:00  " "19:00:00  " ...
##   .. ..$ qua_ph     : chr [1:93] "7.3" "7.1" "7.2" "7" ...
##   .. ..$ longitude  : chr [1:93] "121.569433" "121.55231" "121.563886" "121.544384" ...
##   .. ..$ qua_id     : chr [1:93] "CS00        " "CS01        " "CS02        " "CS03        " ...
##   .. ..$ qua_cntu   : chr [1:93] "0.01" "0.02" "0.07" "0.14" ...
##   .. ..$ code_name  : chr [1:93] "雙溪淨水場" "衛理女中" "雙溪國小                " "華興加壓站" ...
##   .. ..$ latitude   : chr [1:93] "25.114194" "25.101757" "25.106069" "25.099517" ...
##   .. ..$ qua_cl     : chr [1:93] "0.63" "0.58" "0.62" "0.5" ...
##   .. ..$ _id        : int [1:93] 1 2 3 4 5 6 7 8 9 10 ...
data_water <- data_json[["result"]] [["results"]]
str(data_water)
## 'data.frame':    93 obs. of  10 variables:
##  $ update_date: chr  "2020-03-18" "2020-03-18" "2020-03-18" "2020-03-18" ...
##  $ update_time: chr  "19:00:00  " "19:00:00  " "19:00:00  " "19:00:00  " ...
##  $ qua_ph     : chr  "7.3" "7.1" "7.2" "7" ...
##  $ longitude  : chr  "121.569433" "121.55231" "121.563886" "121.544384" ...
##  $ qua_id     : chr  "CS00        " "CS01        " "CS02        " "CS03        " ...
##  $ qua_cntu   : chr  "0.01" "0.02" "0.07" "0.14" ...
##  $ code_name  : chr  "雙溪淨水場" "衛理女中" "雙溪國小                " "華興加壓站" ...
##  $ latitude   : chr  "25.114194" "25.101757" "25.106069" "25.099517" ...
##  $ qua_cl     : chr  "0.63" "0.58" "0.62" "0.5" ...
##  $ _id        : int  1 2 3 4 5 6 7 8 9 10 ...
head(data_water)
##   update_date update_time qua_ph  longitude       qua_id qua_cntu
## 1  2020-03-18  19:00:00      7.3 121.569433 CS00             0.01
## 2  2020-03-18  19:00:00      7.1  121.55231 CS01             0.02
## 3  2020-03-18  19:00:00      7.2 121.563886 CS02             0.07
## 4  2020-03-18  19:00:00        7 121.544384 CS03             0.14
## 5  2020-03-18  19:00:00      7.3 121.547873 CX00             0.02
## 6  2020-03-18  19:00:00      7.5 121.563997 CX02             0.07
##                  code_name  latitude qua_cl _id
## 1               雙溪淨水場 25.114194   0.63   1
## 2                 衛理女中 25.101757   0.58   2
## 3 雙溪國小                 25.106069   0.62   3
## 4               華興加壓站 25.099517    0.5   4
## 5               長興淨水場 25.014511   0.66   5
## 6                 市政大樓 25.037531   0.33   6

如果需要將資料(data.frame)轉換成JSON檔案可以使用jsonlite package所提供的toJSON()函數。

myjson <- toJSON(iris, pretty=TRUE)
str(myjson)
##  'json' chr "[\n  {\n    \"Sepal.Length\": 5.1,\n    \"Sepal.Width\": 3.5,\n    \"Petal.Length\": 1.4,\n    \"Petal.Width\":"| __truncated__

API

典型的 MVC 後端結構

MVC是一種軟體工程的開發概念, 分成3個部份:

  1. Model, 與資料庫相關, 考慮資料如何存取

  2. View, HTML, CSS, template

  3. Controller, 處理使用者的請求, 取得資料, 回應給使用者

網路通訊協定 HTTPS (HTTP)

XML document with XML (Temple Lang and CRAN Team 2019)

  1. Tags/label correspond to general labels
  1. Elements are specific examples of tags
  1. Attributes are components of the label
# install.packages("XML")
library(XML)
library(httr)
waterQ <- xmlParse(
  GET("http://data.taipei/opendata/datalist/datasetMeta/download?id=961ca397-4a59-45e8-b312-697f26b059dc&rid=190796c8-7c56-42e0-8068-39242b8ec927"), encoding = "UTF-8")
#因為XML套件處理http轉https的功能的不好,先使用GET()功能取用網址,再放入xmlParse()就不會有問題。
#取得所有"code_name"標籤內的資料
xpathSApply(waterQ, "//code_name", xmlValue)[1:10]
##  [1] "雙溪淨水場"               "衛理女中"                
##  [3] "雙溪國小                " "華興加壓站"              
##  [5] "長興淨水場"               "市政大樓"                
##  [7] "市議會"                   "捷運忠孝復興站"          
##  [9] "南港高工"                 "南港加壓站"
#取得各監測站的經度
xpathSApply(waterQ, "//longitude", xmlValue)[1:10]
##  [1] "121.569433" "121.55231"  "121.563886" "121.544384" "121.547873"
##  [6] "121.563997" "121.561975" "121.54342"  "121.607462" "121.616217"
  • //: 任意位置子結點資料,e.g.所有連結標籤: //a , /a
  • @: 屬性資料,e.g.所有連結標籤內的連結網址: // , /a[@href]

Another package xml2 (Wickham, Hester, and Ooms 2019)

# install.packages("xml2")
library(xml2)
waterQ <- read_xml("http://data.taipei/opendata/datalist/datasetMeta/download?id=961ca397-4a59-45e8-b312-697f26b059dc&rid=190796c8-7c56-42e0-8068-39242b8ec927", encoding = "UTF-8")
xml_find_all(waterQ, "//code_name")
## {xml_nodeset (93)}
##  [1] <code_name>雙溪淨水場</code_name>
##  [2] <code_name>衛理女中</code_name>
##  [3] <code_name>雙溪國小                </code_name>
##  [4] <code_name>華興加壓站</code_name>
##  [5] <code_name>長興淨水場</code_name>
##  [6] <code_name>市政大樓</code_name>
##  [7] <code_name>市議會</code_name>
##  [8] <code_name>捷運忠孝復興站</code_name>
##  [9] <code_name>南港高工</code_name>
## [10] <code_name>南港加壓站</code_name>
## [11] <code_name>挹翠加壓站</code_name>
## [12] <code_name>敦化國中                </code_name>
## [13] <code_name>信義運動中心</code_name>
## [14] <code_name>信義區公所</code_name>
## [15] <code_name>大安運動中心</code_name>
## [16] <code_name>南港運動中心</code_name>
## [17] <code_name>公館淨水場</code_name>
## [18] <code_name>捷運台北車站</code_name>
## [19] <code_name>捷運中正紀念堂站</code_name>
## [20] <code_name>萬華國中</code_name>
## ...
  • 使用xml_find_all()以及xml_text()取得指定標籤內的資料:
#取得所有"code_name"標籤內的資料
code_name <- xml_find_all(waterQ, "//code_name") %>% 
  xml_text()
code_name[1:10]
##  [1] "雙溪淨水場"               "衛理女中"                
##  [3] "雙溪國小                " "華興加壓站"              
##  [5] "長興淨水場"               "市政大樓"                
##  [7] "市議會"                   "捷運忠孝復興站"          
##  [9] "南港高工"                 "南港加壓站"
#取得各監測站的經度longitude
longitude <- xml_find_all(waterQ, "//longitude") %>% 
  xml_text()
longitude[1:10]
##  [1] "121.569433" "121.55231"  "121.563886" "121.544384" "121.547873"
##  [6] "121.563997" "121.561975" "121.54342"  "121.607462" "121.616217"
  • 以上兩種套件均可完成XML檔案的處理,可依喜好選擇套件.

網頁爬蟲 Webscraping

#以東華應數系網站為例,可直接逐行讀取 readLines()
# readLines(file("https://am.ndhu.edu.tw/", encoding = "UTF-8"), n = 10)
htmlCode <- readLines(file("https://am.ndhu.edu.tw/p/412-1038-2920.php?Lang=zh-tw", encoding = "UTF-8"))
htmlCode[1:10]
##  [1] "<!DOCTYPE html>"                                                                                              
##  [2] "<html lang=\"zh-tw\">"                                                                                        
##  [3] "<head>"                                                                                                       
##  [4] "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"                                      
##  [5] "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\" />"                                         
##  [6] "<meta name=\"viewport\" content=\"initial-scale=1.0, user-scalable=1, minimum-scale=1.0, maximum-scale=3.0\">"
##  [7] "<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">"                                                 
##  [8] "<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">"                                      
##  [9] "<meta name=\"keywords\" content=\"請填寫網站關鍵記事,用半角逗號(,)隔開\" />"                                 
## [10] "<meta name=\"description\" content=\"請填寫網站簡述\" />"
str(htmlCode)
##  chr [1:1436] "<!DOCTYPE html>" "<html lang=\"zh-tw\">" "<head>" ...
grep("<a href=", htmlCode, value = T)[1:6]
## [1] "<a href=\"#start-C\" class=\"focusable\" title=\"跳到主要內容區塊\">跳到主要內容區塊</a>"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
## [2] "\t\t\t\t<li   id=\"Hln_3047\" class=\"dropdown\"><a class=\"dropdown-toggle\" data-toggle=\"dropdown\" href=\"javascript:void(0)\" title=\"招生\">招生</a><ul class=\"dropdown-menu\"><li  id=\"Hln_3048\"><a href=\"/p/412-1038-17033.php?Lang=zh-tw\" title=\"招生宣言\">招生宣言</a></li><li  id=\"Hln_3049\"><a href=\"https://exam.ndhu.edu.tw/index.php\" target=\"_blank\"  title=\"招生訊息(另開新視窗)\">招生訊息</a></li><li  id=\"Hln_3050\"><a href=\"https://epage.ndhu.edu.tw/files/11-1000-9758.php?Lang=zh-tw\" target=\"_blank\"  title=\"東華學生(另開新視窗)\">東華學生</a></li><li  id=\"Hln_3051\"><a href=\"/p/412-1038-17308.php?Lang=zh-tw\" title=\"畢業校友見證\">畢業校友見證</a></li></ul></li>"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
## [3] "\t\t\t\t<li   id=\"Hln_3052\" class=\"dropdown\"><a class=\"dropdown-toggle\" data-toggle=\"dropdown\" href=\"javascript:void(0)\" title=\"簡介\">簡介</a><ul class=\"dropdown-menu\"><li  id=\"Hln_3053\"><a href=\"/p/412-1038-4351.php?Lang=zh-tw\" title=\"歷史沿革\">歷史沿革</a></li><li  id=\"Hln_3054\"><a href=\"/p/412-1038-4352.php?Lang=zh-tw\" title=\"發展方向\">發展方向</a></li><li  id=\"Hln_3055\"><a href=\"/p/412-1038-5213.php?Lang=zh-tw\" title=\"教育目標\">教育目標</a></li><li  id=\"Hln_3056\"><a href=\"/p/412-1038-4353.php?Lang=zh-tw\" title=\"進修與就業\">進修與就業</a></li><li  id=\"Hln_3057\"><a href=\"/p/412-1038-4354.php?Lang=zh-tw\" title=\"系所設備\">系所設備</a></li></ul></li>"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
## [4] "\t\t\t\t<li   id=\"Hln_3059\" class=\"dropdown\"><a class=\"dropdown-toggle\" data-toggle=\"dropdown\" href=\"javascript:void(0)\" title=\"成員\">成員</a><ul class=\"dropdown-menu\"><li  id=\"Hln_3060\"><a href=\"/p/412-1038-2920.php?Lang=zh-tw\" title=\"師資\">師資</a></li><li  id=\"Hln_3061\"><a href=\"/p/412-1038-17041.php?Lang=zh-tw\" title=\"助理\">助理</a></li></ul></li>"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
## [5] "\t\t\t\t<li   id=\"Hln_3423\" class=\"dropdown\"><a class=\"dropdown-toggle\" data-toggle=\"dropdown\" href=\"javascript:void(0)\" title=\"課程資訊\">課程資訊</a><ul class=\"dropdown-menu\"><li  id=\"Hln_3424\"><a href=\"/p/412-1038-6069.php?Lang=zh-tw\" title=\"聯合微積分教學\">聯合微積分教學</a></li><li  id=\"Hln_3425\"><a href=\"/p/412-1038-2929.php?Lang=zh-tw\" title=\"開課課程表\">開課課程表</a></li><li  id=\"Hln_3571\"><a href=\"/p/412-1038-2930.php?Lang=zh-tw\" title=\"課程及學程規劃\">課程及學程規劃</a></li><li  id=\"Hln_3572\"><a href=\"/p/412-1038-2931.php?Lang=zh-tw\" title=\"課程大綱\">課程大綱</a></li><li  id=\"Hln_3573\"><a href=\"/p/412-1038-2932.php?Lang=zh-tw\" title=\"教學計畫表\">教學計畫表</a></li><li  id=\"Hln_3574\"><a href=\"/p/412-1038-2933.php?Lang=zh-tw\" title=\"Office Hour\">Office Hour</a></li><li  id=\"Hln_3575\"><a href=\"/p/412-1038-2934.php?Lang=zh-tw\" title=\"導師時間表\">導師時間表</a></li><li  id=\"Hln_3576\"><a href=\"/p/412-1038-8904.php?Lang=zh-tw\" title=\"電腦教室使用狀況\">電腦教室使用狀況</a></li><li  id=\"Hln_3577\"><a href=\"http://faculty.ndhu.edu.tw/~yltseng/help.html\" target=\"_blank\"  title=\"數學小天地(另開新視窗)\">數學小天地</a></li></ul></li>"
## [6] "\t\t\t\t<li   id=\"Hln_3582\" class=\"dropdown\"><a class=\"dropdown-toggle\" data-toggle=\"dropdown\" href=\"/p/412-1038-3013.php?Lang=zh-tw\" title=\"學程化及未來方向\">學程化及未來方向</a><ul class=\"dropdown-menu\"><li  id=\"Hln_3583\"><a href=\"/p/412-1038-3015.php?Lang=zh-tw\" title=\"學程化\">學程化</a></li><li  id=\"Hln_3584\"><a href=\"/p/412-1038-4989.php?Lang=zh-tw\" title=\"未來方向\">未來方向</a></li><li  id=\"Hln_3585\"><a href=\"/p/412-1038-8450.php?Lang=zh-tw\" title=\"課程關係圖及課程地圖\">課程關係圖及課程地圖</a></li><li  id=\"Hln_3586\"><a href=\"/p/412-1038-5214.php?Lang=zh-tw\" title=\"專業能力指標\">專業能力指標</a></li></ul></li>"
ndhuAM <- read_html("https://am.ndhu.edu.tw/p/412-1038-2920.php?Lang=zh-tw")
xml_find_all(ndhuAM, "//html")
## {xml_nodeset (1)}
## [1] <html lang="zh-tw">\n<head>\n<meta http-equiv="Content-Type" content="tex ...
xml_find_all(ndhuAM, "//*[contains(concat(' ', @class, ' '), concat(' ', 'mcol',' '))]") %>% xml_text() 
## [1] "\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\n\n\n\t師資\n\n         \n\n\n\n\n\t\n\t\t\n \t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\n\n\n\n\n\n\t\t\n\t\n\n\n\n\n\n\n\t\n\t\n\t\t\n\t\t\n\n標題\n\n\t\t職稱\n\n\t\t研究領域\n\n\t\t電話\n\n\t\tE-MAIL\n\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t王立中\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t代數幾何、泛函分析、密碼學\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903529\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tlcwang@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t王昆<U+6E76>\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t富氏分析、調和分析、小波分析\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903555\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tkcwang@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t王家禮\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t作業研究、排隊理論\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903515\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tcwang@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t朱至剛\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t無母數迴歸、時間序列分析\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903536\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tchu@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t吳建銘\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t系主任-教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t類神經網路、資訊技術應用\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903531\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tjmwu@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t周君彥\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t泛函分析、算子代數\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903557\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tchoucy@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t張菁華\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t古典、泛函分析\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903558\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tchchang@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t曹振海\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t統計證據、穩健貝氏分析、統計機器學習\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903520\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tchtsao@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t郭大衛\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t組合數學、圖形理論、演算法\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903525\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tdavidk@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t黃延安\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t對局論、數理經濟\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903516\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tyahwang@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t黃淑琴\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t複變數函數論、里曼曲面\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903530\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tshuang@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t黃顯棟\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t量子資訊、算子理論、泛函分析\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903528\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tsdhuang@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t謝思民\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t經驗過程、大樣本理論、數理統計\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903524\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\ttse@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t吳韋瑩\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t副教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t空間統計\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903533\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\twuweiying1011@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t胡鍇\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t副教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tDNA幾何與拓樸\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903523\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tkhu@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t張子貴\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t副教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t數學教育、微積分教學、統計資料分析\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903560\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\ttzu@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t陳中壹\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t副教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t解析數論、分析、熱傳導方程式\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903556\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tjongyi@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t曾玉玲\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t副教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t數理統計、集合估計論、擬經驗貝氏方法\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903518\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tyltseng@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t趙維雄\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t助理教授\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t生物統計、長期追蹤資料分析、隨機過程\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t03-8903519\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\twhchao@gms.ndhu.edu.tw\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\t\n\t\n\t\t\n\t\t\n\n            .page-goto,\n            .mpgbar {\n                display: flex;\n                justify-content: center;\n                align-items: center;\n            }\n            .mpgbar .input-group {\n                max-width: 100px;\n            }\n            .mpgbar .form-control {\n                text-align: center;\n            }\n            .mpgbar .pg-txt {\n                padding: 6px 12px;\n            }\n            .mpgbar .pagination {\n                display: block;\n            }\n            @media(max-width: 768px) {\n                .mpgbar { flex-direction: column; }\n                .mpgbar .pg-first,\n                .mpgbar .pg-last,\n                .mpgbar > .pg-txt {\n                    display: none;\n                }\n            }\n        \n\t\n\n$(document).ready(function(){\nvar a = [];\na.push({name:'Cg',value:2920});\na.push({name:'IsTop',value:0});\nvar option = {\n\tpageMode:'0',\n\tcurrentPage:1,\n\tflag:0,\n\tover:0,\n\turl:'/app/index.php?Action=mobilecgmolist',\n\turlPrefix:  'https://am.ndhu.edu.tw/p/412-1038-2920-PAGE.php?Lang=zh-tw',\n\ttotalPage:1,\n\tOp:'getpartlist',\n\tparam:a,\n\tpageListObj:$(\"#pageptlist\"),\n\tnextPageObj:$(\"#_cgptlist_next_page\")\n}\nvar cgptlist = new HvPagelist();\ncgptlist.init(option);\n\n\n\n   cgptlist.loadPage();\n   window.onscroll = function(){\n      cgptlist.loadPage();\n   }\n\n});\n\n\n\t\t\t\t\t\n\t\t\t\t\t"
# #或是使用XML工具分析擷取網頁 (XML package),使用方法與XML檔案處理方法類似,搭配XPath語言,篩選所需資料
# html <- htmlParse("https://am.ndhu.edu.tw/")
# xpathSApply(html, "//ul", xmlValue)
# xpathSApply(html, "//span[@class='ptname ']", xmlValue)

rvest(Wickham 2019a) package是R中最常使用的爬蟲套件

# YahooNewsurl <- "https://tw.news.yahoo.com/topic/yahoo-today"
# read_html(YahooNewsurl) %>% html_nodes("#Col1-0-TopicWrapper-Proxy")%>% html_text()
# read_html(YahooNewsurl) %>% html_nodes("#Col1-0-TopicWrapper-Proxy div>div>span")%>% html_text()
# read_html(YahooNewsurl) %>% html_nodes(xpath = "//*[@id='ad-34813707356']")
# news_title <- read_html(YahooNewsurl) %>% html_nodes(".Mb(5px)") %>% html_text()
# news_url <- read_html(YahooNewsurl) %>% html_nodes(".tpl-title a") %>% html_attr("href")
# Yahoo_news <- data.frame(title = news_title, url=news_url)
# head(Yahoo_news)
  • rvest套件,經由以下步驟進行網站解析:
    1. 使用read_html(“欲擷取的網站網址”)讀取網頁
    2. 使用html_nodes()擷取所需內容 (條件為CSS或xpath標籤)
    3. 使用html_text()處理/清洗擷取內容,留下需要的資料
    4. 使用html_attr()擷取資料參數(如連結url)
Newsurl <- "https://www.twreporter.org/a/laughing-gas-nitrous-oxid-substance-abuse-hurt-youth-health"
articlebody <- read_html(Newsurl) %>% 
  html_nodes("#article-body div") %>% html_text()
article <- data.frame(content = articlebody)

CSS language

  • a 是「標籤 tag 」,必須有左邊起始標籤和右邊結尾標籤包住中間的內容,像這樣: 中間的內容

  • id, class, href標籤的屬性,屬性可以是任意的名稱,但其中 href 通常是 a 標籤底下放網頁連結的屬性。

  • id 和 class在 css中有特殊意義,一般爬蟲最常用這兩個屬性協助做定位。 照網頁設計的邏輯, id 在文件中只能出現一次;而 class 通常是讓網頁設計師用來指定一群相似內容的樣式,我們爬蟲要爬的內容一般和美術的規則也很接近。由於這兩個原因, id 和 class 很適合我們做定位。在 css 路徑中的代號id 的是 # class 的是 . 。 > 用 css 路徑定位的話,我們可以用幾種方式告訴程式我們要範例中的 a 標籤:

    • a 指定要標籤 a
    • #foo 指定要 idfoo 的標籤
    • .bar 指定 classbar 的標籤
  • CSS Selector 常見語法 參考資料

    • .xxx:select elements with class=“xxx”
    • #xxx:select elements with id=“xxx”
    • [yyy]:select elements with attribute yyy
    • [yyy=zzz]:select elements with attribute yyy=“zzz”
Newsurl <- "https://www.twreporter.org/a/laughing-gas-nitrous-oxid-substance-abuse-hurt-youth-health"
articlebody <- read_html(Newsurl) %>% 
  html_nodes("#article-body p") %>% html_text()
article <- data.frame(content = articlebody)
head(article)
##                                                                                                                                                                                                                                                                content
## 1 俗稱笑氣的一氧化二氮(N2O)原是半導體和食品加工等工業製程中,不可或缺的氣體原料,但這些年,原料卻悄悄流入市面,並被包裝成「派對助興」的催化劑。這無色微甜的便宜氣體,看似沒有立即成癮性,但2019年長庚醫院研究團隊發表報告,確診多名青少年因吸食笑氣而癱瘓的案例。   
## 2                                                                                                                                               究竟笑氣為何在青少年間「流行」和被濫用?接手治療的醫師們怎麼看待笑氣在台灣被輕忽的危險,以及對青少年身心帶來的影響?  
## 3                                                                                                                                                                                                 「我很喜歡那種ㄎㄧㄤ ㄎㄧㄤ的、很放鬆,可以暫時不想事情的感覺。」   
## 4                                                       21歲的小柔(化名)曾經很努力戒掉過大麻、海洛因,相信自己不會再掉入吸毒的陷阱裡,「笑氣與毒品不同啊,」又不是違禁品、也不會被警察抓,她和朋友都這樣想。但這一次,為了幾秒鐘的放鬆,她付出的代價,是險些癱瘓。  
## 5                                                                                                                                                                                                            笑氣對他們來說,不過就像是菸酒,只是聚會時的助興工具。   
## 6                                     一年多前,小柔迷上交友軟體,認識了一群愛吸食笑氣的朋友。初次聚會,小柔回憶,她看著朋友將氣球套在笑氣鋼瓶的氣嘴上,灌成比一般氣球大一倍的「笑氣氣球」。因為好奇,她跟著朋友將氣球放入口中,吸一次氣,竟迎來一陣短暫麻痺的快感。
articlebody <- read_html(Newsurl) %>% 
  html_nodes("#article-body") %>% html_nodes(".body__StyledParagraph-dwuu2m-16") %>% html_text()
articleB <- data.frame(content = articlebody)
head(articleB)
##                                                                                                                                                                                                                            content
## 1                                                                                                                                                             「我很喜歡那種ㄎㄧㄤ ㄎㄧㄤ的、很放鬆,可以暫時不想事情的感覺。」   
## 2                   21歲的小柔(化名)曾經很努力戒掉過大麻、海洛因,相信自己不會再掉入吸毒的陷阱裡,「笑氣與毒品不同啊,」又不是違禁品、也不會被警察抓,她和朋友都這樣想。但這一次,為了幾秒鐘的放鬆,她付出的代價,是險些癱瘓。  
## 3                                                                                                                                                                        笑氣對他們來說,不過就像是菸酒,只是聚會時的助興工具。   
## 4 一年多前,小柔迷上交友軟體,認識了一群愛吸食笑氣的朋友。初次聚會,小柔回憶,她看著朋友將氣球套在笑氣鋼瓶的氣嘴上,灌成比一般氣球大一倍的「笑氣氣球」。因為好奇,她跟著朋友將氣球放入口中,吸一次氣,竟迎來一陣短暫麻痺的快感。  
## 5                                  在酒店上班的小柔,面對同行競爭與惡言雜語,心中委屈與負面情緒無法發洩時,她便想起那幾秒鐘的放鬆感。「面對那些謠言,好像辯解也不是,不辯解也不對,因為沒人可以講,就想到可以靠著笑氣(排解)。」 
## 6                                                               在那個「忘憂」的世界裡,不必清醒地面對挫折,吸了就睡、醒了再吸,最多一天可以吸掉10公斤的笑氣,再倒頭大睡10多個小時。連續幾天後,她發現自己站不穩,無法正常走路。
articlebody <- read_html(Newsurl) %>% 
  html_nodes("#article-body") %>% html_nodes("h1") %>% html_text()
articleC <- data.frame(content = articlebody)
head(articleC)
##                                      content
## 1 從ㄎㄧㄤ掉變癱掉:「毒害」年輕人的笑氣濫用
## 2                     掉進笑氣陷阱的青少年們
## 3                           被低估的「毒害」
## 4            將笑氣列為毒品,能解決問題嗎?