自由時報爬蟲
# Method 1
library(rvest)
## Warning: package 'rvest' was built under R version 3.4.2
## Loading required package: xml2
newsurl <- 'http://news.ltn.com.tw/list/breakingnews'
# read_html(newsurl)
# Method 2
library(httr)
#GET(newsurl)
li <- read_html(newsurl) %>% html_nodes('.imm li')
#li[1] %>% as.character()
title <- li %>% html_node('.tit p') %>%
html_text() %>% trimws()
dt <- li %>% html_node('.tit span') %>%
html_text() %>% trimws()
url <- li %>% html_node('.tit') %>%
html_attr('href')
tag <- li %>% html_node('.tagarea') %>%
html_text() %>% trimws()
newsdf <- data.frame(title = title, time = dt,
link = url, tag= tag,
stringsAsFactors = FALSE)
str(newsdf)
## 'data.frame': 18 obs. of 4 variables:
## $ title: chr "網路提案國中小全裝冷氣 國教署搖頭:電費增8億" "三義高中全國技藝競賽大放異彩 商業類得獎人數苗縣之冠" "印度北部火車脫軌 3死9傷" "影帝性侵控訴又多一起 警方展開新一輪調查" ...
## $ time : chr "16:02" "16:02" "16:01" "15:57" ...
## $ link : chr "http://news.ltn.com.tw/news/politics/breakingnews/2263624" "http://news.ltn.com.tw/news/life/breakingnews/2263617" "http://news.ltn.com.tw/news/world/breakingnews/2263601" "http://ent.ltn.com.tw/news/breakingnews/2263655" ...
## $ tag : chr "政治\n 臺北市" "生活" "國際" "娛樂" ...
View(newsdf)
Trimws
cat('下週回暖上看30度吳德榮:「秋老虎」再現!\t\t\t\t\t\t\t\t\t\t\t\t\t')
## 下週回暖上看30度吳德榮:「秋老虎」再現!
cat(trimws('下週回暖上看30度吳德榮:「秋老虎」再現!\t\t\t\t\t\t\t\t\t\t\t\t\t'))
## 下週回暖上看30度吳德榮:「秋老虎」再現!
cat('1 2 3\n100 200 300\n')
## 1 2 3
## 100 200 300
cat('1\t2\t3\n100\t200\t300\n')
## 1 2 3
## 100 200 300
#?trimws
蘋果新聞爬蟲
getArticle <- function(url){
e <- read_html(url)
title <- e %>% html_node('h1') %>% html_text()
article <- e %>% html_node('.ndArticle_margin p') %>%
html_text()
dt <- e %>% html_node('.ndArticle_creat') %>%
html_text()
clicked <- e %>% html_node('.ndArticle_view') %>%
html_text()
category <- e %>% html_node('.ndgTag .current') %>%
html_text()
newsdf <- data.frame(title, article, dt, category, clicked, stringsAsFactors = FALSE)
newsdf
}
newsurl <- 'https://tw.appledaily.com/new/realtime/'
dfall <- data.frame()
for (page in 1:1){
apple <- read_html(paste0(newsurl, page) )
rtddt <- apple %>% html_nodes('.rtddt a')
for(ele in rtddt){
url <- ele %>% html_attr('href') %>% trimws()
df <- getArticle(url)
dfall <- rbind(dfall,df)
}
}
View(dfall)
write.csv(x= dfall, file= 'applenews.csv')
#dfall
讀取蘋果新聞 & 資料轉換
download.file('https://raw.githubusercontent.com/ywchiu/fubonr/master/data/applenews.csv', 'applenews.csv')
applenews <- read.csv('applenews.csv', stringsAsFactors = FALSE)
View(applenews)
# remove X from applenews
applenews$X <- NULL
# change data type from string to factor
applenews$category <- as.factor(applenews$category)
applenews$clicked <- as.integer(applenews$clicked)
applenews$clicked <- as.numeric(applenews$clicked)
str(applenews)
## 'data.frame': 31 obs. of 5 variables:
## $ title : chr "【縱火9死】「腦中有聲音叫我去做」 兇嫌遭收押" "脊椎斷了穿背架 扯!還被紅衣老婆婆逼讓座" "【新莊店】開店一小時 排隊人籠不減反增" "【特企】都會新時尚 smart 靈活購車無負擔!" ...
## $ article : chr "(更新:法院裁押理由)中和興南路二段一處出租公寓前晚遭縱火釀9死慘劇,縱火嫌犯李國輝昨遭警方拘提到案,李男稱「常"| __truncated__ "現今雖不斷宣導博愛座是給有需要的人坐,但仍有長輩觀念未改,認為「長輩優先!」一名女網友就在臉書《爆廢公社》發文"| __truncated__ "台灣第一次!在美國已辦多年的好市多「黑色購物節」,今年首度移師台灣,全台共17處分店,統一從今天開始展開為期三天"| __truncated__ "【特別企劃】Swatch之父Nicolas Hayek有感於大型車商都忽略了小型車的市場,突發奇想,要是能製造一輛很小的車,駕駛著"| __truncated__ ...
## $ dt : chr "建立時間:2017/11/24 10:14" "建立時間:2017/11/24 10:13" "建立時間:2017/11/24 10:13" "建立時間:2017/11/24 07:00" ...
## $ category: Factor w/ 8 levels "生活","社會",..: 2 1 1 1 4 2 8 1 7 1 ...
## $ clicked : num 14945 NA NA 1393 NA ...
a <- 'aaa@bbb@ccc'
a.split <- strsplit(a, '@')
a.split[[1]]
## [1] "aaa" "bbb" "ccc"
paste(a.split[[1]], collapse = ' ')
## [1] "aaa bbb ccc"
a <- c('aaa@bbb@ccc' , 'ddd@ee@ff')
strsplit(a, '@')
## [[1]]
## [1] "aaa" "bbb" "ccc"
##
## [[2]]
## [1] "ddd" "ee" "ff"
b <- c('aaa', 'bbb', 'ccc')
paste(b, collapse = '')
## [1] "aaabbbccc"
paste(b, collapse = '|')
## [1] "aaa|bbb|ccc"
a <- ' this is a long text'
a.split <- strsplit(a, ' ')[[1]]
paste(a.split, collapse = '')
## [1] "thisisalongtext"
a <- ' \n this is a long text \n\t '
cat(a)
##
## this is a long text
##
cat(trimws(a) )
## this is a long text
?trimws
## starting httpd help server ... done
trimws(a, which = 'left')
## [1] "this is a long text \n\t "
trimws(a, which = 'l')
## [1] "this is a long text \n\t "
trimws(a, which = 'right')
## [1] " \n this is a long text"
trimws(a, which = 'r')
## [1] " \n this is a long text"
a <- "建立時間:2017/11/24 10:14"
strsplit(a, '建立時間:')[[1]][2]
## [1] "2017/11/24 10:14"
res <- lapply(applenews$dt, function(e){
strsplit(e, '建立時間:')[[1]][2]
})
applenews$dt <- unlist(res)
str(applenews)
## 'data.frame': 31 obs. of 5 variables:
## $ title : chr "【縱火9死】「腦中有聲音叫我去做」 兇嫌遭收押" "脊椎斷了穿背架 扯!還被紅衣老婆婆逼讓座" "【新莊店】開店一小時 排隊人籠不減反增" "【特企】都會新時尚 smart 靈活購車無負擔!" ...
## $ article : chr "(更新:法院裁押理由)中和興南路二段一處出租公寓前晚遭縱火釀9死慘劇,縱火嫌犯李國輝昨遭警方拘提到案,李男稱「常"| __truncated__ "現今雖不斷宣導博愛座是給有需要的人坐,但仍有長輩觀念未改,認為「長輩優先!」一名女網友就在臉書《爆廢公社》發文"| __truncated__ "台灣第一次!在美國已辦多年的好市多「黑色購物節」,今年首度移師台灣,全台共17處分店,統一從今天開始展開為期三天"| __truncated__ "【特別企劃】Swatch之父Nicolas Hayek有感於大型車商都忽略了小型車的市場,突發奇想,要是能製造一輛很小的車,駕駛著"| __truncated__ ...
## $ dt : chr "2017/11/24 10:14" "2017/11/24 10:13" "2017/11/24 10:13" "2017/11/24 07:00" ...
## $ category: Factor w/ 8 levels "生活","社會",..: 2 1 1 1 4 2 8 1 7 1 ...
## $ clicked : num 14945 NA NA 1393 NA ...
list(a = 'abc', b = 99)
## $a
## [1] "abc"
##
## $b
## [1] 99
li <- list(c(1,2,3), c(2,3,4))
li[[2]]
## [1] 2 3 4
a <- ' this is a long text'
a.split <- strsplit(a, ' ')[[1]]
a.split
## [1] "" "" "" "" "" "" "" "" "this" ""
## [11] "" "" "" "" "" "" "is" "" "" ""
## [21] "" "" "" "" "" "" "" "" "a" ""
## [31] "" "" "" "" "" "" "long" "" "" ""
## [41] "text"
a.split[a.split!='']
## [1] "this" "is" "a" "long" "text"
paste(a.split[a.split!=''], collapse = '|')
## [1] "this|is|a|long|text"
Time Conversion
s <- '11 24,2017 11:12'
dt <- strptime(s,'%m %d,%Y %H:%M')
class(s)
## [1] "character"
class(dt)
## [1] "POSIXlt" "POSIXt"
?strptime
dt1 <- as.POSIXlt(as.Date('2017-11-01'))
class(dt)
## [1] "POSIXlt" "POSIXt"
class(dt1)
## [1] "POSIXlt" "POSIXt"
dt - dt1
## Time difference of 23.13333 days
s <- '好時間2017年11月11日11點11分11秒'
strptime(s, '好時間%Y年%m月%d日%H點%M分%S秒')
## [1] "2017-11-11 11:11:11 CST"
?strptime
s <- c('好時間2017年11月11日11點11分11秒','好時間2014年06月06日06點06分06秒')
strptime(s, '好時間%Y年%m月%d日%H點%M分%S秒')
## [1] "2017-11-11 11:11:11 CST" "2014-06-06 06:06:06 CST"
class(applenews$dt)
## [1] "character"
applenews$dt
## [1] "2017/11/24 10:14" "2017/11/24 10:13" "2017/11/24 10:13"
## [4] "2017/11/24 07:00" "2017/11/24 10:10" "2017/11/24 10:06"
## [7] "2017/11/24 10:05" "2017/11/24 10:02" "2017/11/24 10:02"
## [10] "2017/11/24 10:01" "2017/11/24 10:00" "2017/11/24 09:58"
## [13] "2017/11/24 09:58" "2017/11/24 09:58" "2017/11/24 09:55"
## [16] "2017/11/24 09:54" "2017/11/24 09:52" "2017/11/24 09:52"
## [19] "2017/11/24 09:52" "2017/11/24 09:50" "2017/11/24 09:50"
## [22] "2017/11/24 09:50" "2017/11/24 09:47" "2017/11/24 09:47"
## [25] "2017/11/24 09:42" "2017/11/24 09:41" "2017/11/24 09:38"
## [28] "2017/11/24 09:35" "2017/11/24 09:31" "2017/11/24 09:31"
## [31] "2017/11/24 09:30"
strptime(applenews$dt,'%Y/%m/%d %H:%M')
## [1] "2017-11-24 10:14:00 CST" "2017-11-24 10:13:00 CST"
## [3] "2017-11-24 10:13:00 CST" "2017-11-24 07:00:00 CST"
## [5] "2017-11-24 10:10:00 CST" "2017-11-24 10:06:00 CST"
## [7] "2017-11-24 10:05:00 CST" "2017-11-24 10:02:00 CST"
## [9] "2017-11-24 10:02:00 CST" "2017-11-24 10:01:00 CST"
## [11] "2017-11-24 10:00:00 CST" "2017-11-24 09:58:00 CST"
## [13] "2017-11-24 09:58:00 CST" "2017-11-24 09:58:00 CST"
## [15] "2017-11-24 09:55:00 CST" "2017-11-24 09:54:00 CST"
## [17] "2017-11-24 09:52:00 CST" "2017-11-24 09:52:00 CST"
## [19] "2017-11-24 09:52:00 CST" "2017-11-24 09:50:00 CST"
## [21] "2017-11-24 09:50:00 CST" "2017-11-24 09:50:00 CST"
## [23] "2017-11-24 09:47:00 CST" "2017-11-24 09:47:00 CST"
## [25] "2017-11-24 09:42:00 CST" "2017-11-24 09:41:00 CST"
## [27] "2017-11-24 09:38:00 CST" "2017-11-24 09:35:00 CST"
## [29] "2017-11-24 09:31:00 CST" "2017-11-24 09:31:00 CST"
## [31] "2017-11-24 09:30:00 CST"
applenews$dt <- as.POSIXct(applenews$dt)
str(applenews)
## 'data.frame': 31 obs. of 5 variables:
## $ title : chr "【縱火9死】「腦中有聲音叫我去做」 兇嫌遭收押" "脊椎斷了穿背架 扯!還被紅衣老婆婆逼讓座" "【新莊店】開店一小時 排隊人籠不減反增" "【特企】都會新時尚 smart 靈活購車無負擔!" ...
## $ article : chr "(更新:法院裁押理由)中和興南路二段一處出租公寓前晚遭縱火釀9死慘劇,縱火嫌犯李國輝昨遭警方拘提到案,李男稱「常"| __truncated__ "現今雖不斷宣導博愛座是給有需要的人坐,但仍有長輩觀念未改,認為「長輩優先!」一名女網友就在臉書《爆廢公社》發文"| __truncated__ "台灣第一次!在美國已辦多年的好市多「黑色購物節」,今年首度移師台灣,全台共17處分店,統一從今天開始展開為期三天"| __truncated__ "【特別企劃】Swatch之父Nicolas Hayek有感於大型車商都忽略了小型車的市場,突發奇想,要是能製造一輛很小的車,駕駛著"| __truncated__ ...
## $ dt : POSIXct, format: "2017-11-24 10:14:00" "2017-11-24 10:13:00" ...
## $ category: Factor w/ 8 levels "生活","社會",..: 2 1 1 1 4 2 8 1 7 1 ...
## $ clicked : num 14945 NA NA 1393 NA ...
資料存儲
library(RSQLite)
con <- dbConnect(SQLite(), 'test.sqlite')
data(iris)
View(iris)
#dbWriteTable(con, 'iris2', iris)
dbListTables(con)
## [1] "applenews" "iris2"
dbDisconnect(con)
con <- dbConnect(SQLite(), 'test.sqlite')
rs <- dbSendQuery(con, 'select * from iris2;')
d1 <- fetch(rs,n= 10)
d1
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
dbHasCompleted(rs)
## [1] FALSE
d2 <- fetch(rs,n= 10)
d2
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.4 3.7 1.5 0.2 setosa
## 2 4.8 3.4 1.6 0.2 setosa
## 3 4.8 3.0 1.4 0.1 setosa
## 4 4.3 3.0 1.1 0.1 setosa
## 5 5.8 4.0 1.2 0.2 setosa
## 6 5.7 4.4 1.5 0.4 setosa
## 7 5.4 3.9 1.3 0.4 setosa
## 8 5.1 3.5 1.4 0.3 setosa
## 9 5.7 3.8 1.7 0.3 setosa
## 10 5.1 3.8 1.5 0.3 setosa
dbHasCompleted(rs)
## [1] FALSE
d3 <- fetch(rs, n = -1)
d3
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.4 3.4 1.7 0.2 setosa
## 2 5.1 3.7 1.5 0.4 setosa
## 3 4.6 3.6 1.0 0.2 setosa
## 4 5.1 3.3 1.7 0.5 setosa
## 5 4.8 3.4 1.9 0.2 setosa
## 6 5.0 3.0 1.6 0.2 setosa
## 7 5.0 3.4 1.6 0.4 setosa
## 8 5.2 3.5 1.5 0.2 setosa
## 9 5.2 3.4 1.4 0.2 setosa
## 10 4.7 3.2 1.6 0.2 setosa
## 11 4.8 3.1 1.6 0.2 setosa
## 12 5.4 3.4 1.5 0.4 setosa
## 13 5.2 4.1 1.5 0.1 setosa
## 14 5.5 4.2 1.4 0.2 setosa
## 15 4.9 3.1 1.5 0.2 setosa
## 16 5.0 3.2 1.2 0.2 setosa
## 17 5.5 3.5 1.3 0.2 setosa
## 18 4.9 3.6 1.4 0.1 setosa
## 19 4.4 3.0 1.3 0.2 setosa
## 20 5.1 3.4 1.5 0.2 setosa
## 21 5.0 3.5 1.3 0.3 setosa
## 22 4.5 2.3 1.3 0.3 setosa
## 23 4.4 3.2 1.3 0.2 setosa
## 24 5.0 3.5 1.6 0.6 setosa
## 25 5.1 3.8 1.9 0.4 setosa
## 26 4.8 3.0 1.4 0.3 setosa
## 27 5.1 3.8 1.6 0.2 setosa
## 28 4.6 3.2 1.4 0.2 setosa
## 29 5.3 3.7 1.5 0.2 setosa
## 30 5.0 3.3 1.4 0.2 setosa
## 31 7.0 3.2 4.7 1.4 versicolor
## 32 6.4 3.2 4.5 1.5 versicolor
## 33 6.9 3.1 4.9 1.5 versicolor
## 34 5.5 2.3 4.0 1.3 versicolor
## 35 6.5 2.8 4.6 1.5 versicolor
## 36 5.7 2.8 4.5 1.3 versicolor
## 37 6.3 3.3 4.7 1.6 versicolor
## 38 4.9 2.4 3.3 1.0 versicolor
## 39 6.6 2.9 4.6 1.3 versicolor
## 40 5.2 2.7 3.9 1.4 versicolor
## 41 5.0 2.0 3.5 1.0 versicolor
## 42 5.9 3.0 4.2 1.5 versicolor
## 43 6.0 2.2 4.0 1.0 versicolor
## 44 6.1 2.9 4.7 1.4 versicolor
## 45 5.6 2.9 3.6 1.3 versicolor
## 46 6.7 3.1 4.4 1.4 versicolor
## 47 5.6 3.0 4.5 1.5 versicolor
## 48 5.8 2.7 4.1 1.0 versicolor
## 49 6.2 2.2 4.5 1.5 versicolor
## 50 5.6 2.5 3.9 1.1 versicolor
## 51 5.9 3.2 4.8 1.8 versicolor
## 52 6.1 2.8 4.0 1.3 versicolor
## 53 6.3 2.5 4.9 1.5 versicolor
## 54 6.1 2.8 4.7 1.2 versicolor
## 55 6.4 2.9 4.3 1.3 versicolor
## 56 6.6 3.0 4.4 1.4 versicolor
## 57 6.8 2.8 4.8 1.4 versicolor
## 58 6.7 3.0 5.0 1.7 versicolor
## 59 6.0 2.9 4.5 1.5 versicolor
## 60 5.7 2.6 3.5 1.0 versicolor
## 61 5.5 2.4 3.8 1.1 versicolor
## 62 5.5 2.4 3.7 1.0 versicolor
## 63 5.8 2.7 3.9 1.2 versicolor
## 64 6.0 2.7 5.1 1.6 versicolor
## 65 5.4 3.0 4.5 1.5 versicolor
## 66 6.0 3.4 4.5 1.6 versicolor
## 67 6.7 3.1 4.7 1.5 versicolor
## 68 6.3 2.3 4.4 1.3 versicolor
## 69 5.6 3.0 4.1 1.3 versicolor
## 70 5.5 2.5 4.0 1.3 versicolor
## 71 5.5 2.6 4.4 1.2 versicolor
## 72 6.1 3.0 4.6 1.4 versicolor
## 73 5.8 2.6 4.0 1.2 versicolor
## 74 5.0 2.3 3.3 1.0 versicolor
## 75 5.6 2.7 4.2 1.3 versicolor
## 76 5.7 3.0 4.2 1.2 versicolor
## 77 5.7 2.9 4.2 1.3 versicolor
## 78 6.2 2.9 4.3 1.3 versicolor
## 79 5.1 2.5 3.0 1.1 versicolor
## 80 5.7 2.8 4.1 1.3 versicolor
## 81 6.3 3.3 6.0 2.5 virginica
## 82 5.8 2.7 5.1 1.9 virginica
## 83 7.1 3.0 5.9 2.1 virginica
## 84 6.3 2.9 5.6 1.8 virginica
## 85 6.5 3.0 5.8 2.2 virginica
## 86 7.6 3.0 6.6 2.1 virginica
## 87 4.9 2.5 4.5 1.7 virginica
## 88 7.3 2.9 6.3 1.8 virginica
## 89 6.7 2.5 5.8 1.8 virginica
## 90 7.2 3.6 6.1 2.5 virginica
## 91 6.5 3.2 5.1 2.0 virginica
## 92 6.4 2.7 5.3 1.9 virginica
## 93 6.8 3.0 5.5 2.1 virginica
## 94 5.7 2.5 5.0 2.0 virginica
## 95 5.8 2.8 5.1 2.4 virginica
## 96 6.4 3.2 5.3 2.3 virginica
## 97 6.5 3.0 5.5 1.8 virginica
## 98 7.7 3.8 6.7 2.2 virginica
## 99 7.7 2.6 6.9 2.3 virginica
## 100 6.0 2.2 5.0 1.5 virginica
## 101 6.9 3.2 5.7 2.3 virginica
## 102 5.6 2.8 4.9 2.0 virginica
## 103 7.7 2.8 6.7 2.0 virginica
## 104 6.3 2.7 4.9 1.8 virginica
## 105 6.7 3.3 5.7 2.1 virginica
## 106 7.2 3.2 6.0 1.8 virginica
## 107 6.2 2.8 4.8 1.8 virginica
## 108 6.1 3.0 4.9 1.8 virginica
## 109 6.4 2.8 5.6 2.1 virginica
## 110 7.2 3.0 5.8 1.6 virginica
## 111 7.4 2.8 6.1 1.9 virginica
## 112 7.9 3.8 6.4 2.0 virginica
## 113 6.4 2.8 5.6 2.2 virginica
## 114 6.3 2.8 5.1 1.5 virginica
## 115 6.1 2.6 5.6 1.4 virginica
## 116 7.7 3.0 6.1 2.3 virginica
## 117 6.3 3.4 5.6 2.4 virginica
## 118 6.4 3.1 5.5 1.8 virginica
## 119 6.0 3.0 4.8 1.8 virginica
## 120 6.9 3.1 5.4 2.1 virginica
## 121 6.7 3.1 5.6 2.4 virginica
## 122 6.9 3.1 5.1 2.3 virginica
## 123 5.8 2.7 5.1 1.9 virginica
## 124 6.8 3.2 5.9 2.3 virginica
## 125 6.7 3.3 5.7 2.5 virginica
## 126 6.7 3.0 5.2 2.3 virginica
## 127 6.3 2.5 5.0 1.9 virginica
## 128 6.5 3.0 5.2 2.0 virginica
## 129 6.2 3.4 5.4 2.3 virginica
## 130 5.9 3.0 5.1 1.8 virginica
dbHasCompleted(rs)
## [1] TRUE
dbClearResult(rs)
dbDisconnect(con)
con <- dbConnect(SQLite(), 'test.sqlite')
res <- dbGetQuery(con, 'select Species, count(*) as CNT from iris2 group by Species')
res
## Species CNT
## 1 setosa 50
## 2 versicolor 50
## 3 virginica 50
res <- dbGetQuery(con, 'select Species, count(*) as CNT from iris2 where `Sepal.Length` >= 5 group by Species')
res
## Species CNT
## 1 setosa 30
## 2 versicolor 49
## 3 virginica 49
dbDisconnect(con)
con <- dbConnect(SQLite(), 'test.sqlite')
#dbWriteTable(con, 'applenews', applenews)
dbDisconnect(con)
?dbDisconnect
con <- dbConnect(SQLite(), 'test.sqlite')
res <- dbGetQuery(con, 'select category, count(*) as cnt from applenews group by category order by cnt desc')
pie(res$cnt, labels = res$category, init.angle = 90, clockwise = TRUE)

barplot(res$cnt, names.arg = res$category)

抓取盤後交易
library(jsonlite)
stock <- fromJSON('http://www.twse.com.tw/exchangeReport/MI_INDEX?response=json&date=20171122&type=MS&_=1511502083327')
class(stock$data2)
## [1] "matrix"
df <- as.data.frame(stock$data2)
colnames(df) <- stock$fields2
View(df)
df$收盤指數 <- as.numeric(gsub(',', '', df$收盤指數))
df$漲跌點數 <- as.numeric(gsub(',', '', df$漲跌點數))
df$`漲跌百分比(%)` <- as.numeric(gsub(',', '', df$`漲跌百分比(%)`))
df$`漲跌(+/-)`
## [1] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [3] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [5] <p style ='color:red'>+</p> <p style ='color:green'>-</p>
## [7] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [9] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [11] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [13] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [15] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [17] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [19] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [21] <p style ='color:green'>-</p> <p style ='color:green'>-</p>
## [23] <p style ='color:red'>+</p> <p style ='color:green'>-</p>
## [25] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [27] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [29] <p style ='color:red'>+</p> <p style ='color:green'>-</p>
## [31] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [33] <p style ='color:green'>-</p> <p style ='color:green'>-</p>
## [35] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [37] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [39] <p style ='color:red'>+</p> <p style ='color:green'>-</p>
## [41] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [43] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [45] <p style ='color:red'>+</p> <p style ='color:green'>-</p>
## [47] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [49] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [51] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## [53] <p style ='color:red'>+</p> <p style ='color:red'>+</p>
## Levels: <p style ='color:green'>-</p> <p style ='color:red'>+</p>
a <- "<p style ='color:red'>+</p>"
read_html(a) %>% html_text()
## [1] "+"
# method1
df$`漲跌(+/-)` <- sapply(df$`漲跌(+/-)`, function(e) read_html(as.character(e) ) %>% html_text())
# method2
levels(df$`漲跌(+/-)`) <- c('-', '+')
#df
#str(df)
df[df$報酬指數 == '臺灣50報酬指數',]
## 報酬指數 收盤指數 漲跌(+/-) 漲跌點數 漲跌百分比(%)
## 4 臺灣50報酬指數 14297.91 + 61.71 0.43
# get Taiwan Index Function
library(jsonlite)
getTWIndex <- function(dt){
stock <- fromJSON(paste0('http://www.twse.com.tw/exchangeReport/MI_INDEX?response=json&date=',dt,'&type=MS'))
df <- as.data.frame(stock$data2)
colnames(df) <- stock$fields2
df$收盤指數 <- as.numeric(gsub(',', '', df$收盤指數))
df$漲跌點數 <- as.numeric(gsub(',', '', df$漲跌點數))
df$`漲跌百分比(%)` <- as.numeric(gsub(',', '', df$`漲跌百分比(%)`))
df$`漲跌(+/-)`
levels(df$`漲跌(+/-)`) <- c('-', '+')
df[df$報酬指數 == '臺灣50報酬指數',]
}
getTWIndex('20171122')
## 報酬指數 收盤指數 漲跌(+/-) 漲跌點數 漲跌百分比(%)
## 4 臺灣50報酬指數 14297.91 + 61.71 0.43
#get all TW Index data
dfall <- data.frame()
today <- '2017-11-24'
for(i in seq(1,10)){
current_dt <- as.Date(today)
dt <- strftime(current_dt-i, format='%Y%m%d')
tryCatch({
df <- getTWIndex(dt)
df$dt <- current_dt-i
dfall <- rbind(dfall, df)
}, error = function(e) {
})
}
## Warning in getTWIndex(dt): 強制變更過程中產生了 NA
## Warning in getTWIndex(dt): 強制變更過程中產生了 NA
dfall
## 報酬指數 收盤指數 漲跌(+/-) 漲跌點數 漲跌百分比(%) dt
## 4 臺灣50報酬指數 14336.61 + 38.70 0.27 2017-11-23
## 41 臺灣50報酬指數 14297.91 + 61.71 0.43 2017-11-22
## 42 臺灣50報酬指數 14236.20 + 167.99 1.19 2017-11-21
## 43 臺灣50報酬指數 14068.21 - 87.07 -0.62 2017-11-20
## 44 臺灣50報酬指數 14155.28 + 120.20 0.86 2017-11-17
## 45 臺灣50報酬指數 14035.08 - 2.67 -0.02 2017-11-16
## 46 臺灣50報酬指數 14161.00 + 13.16 0.09 2017-11-14
#?strftime
Quantmod
library(quantmod)
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: TTR
## Version 0.4-0 included new data defaults. See ?getSymbols.
getSymbols('2330.TW', src='yahoo')
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
##
## This message is shown once per session and may be disabled by setting
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
##
## WARNING: There have been significant changes to Yahoo Finance data.
## Please see the Warning section of '?getSymbols.yahoo' for details.
##
## This message is shown once per session and may be disabled by setting
## options("getSymbols.yahoo.warning"=FALSE).
## Warning: 2330.TW contains missing values. Some functions will not work if
## objects contain missing values in the middle of the series. Consider using
## na.omit(), na.approx(), na.fill(), etc to remove or replace them.
## [1] "2330.TW"
head(`2330.TW`)
## 2330.TW.Open 2330.TW.High 2330.TW.Low 2330.TW.Close
## 2007-01-02 103.234 103.538 102.472 66.6919
## 2007-01-03 103.234 104.604 102.777 66.9874
## 2007-01-04 103.081 103.690 102.929 66.6919
## 2007-01-05 102.777 103.081 101.254 65.9038
## 2007-01-08 100.645 101.254 100.036 64.8202
## 2007-01-09 100.341 101.254 100.341 65.0172
## 2330.TW.Volume 2330.TW.Adjusted
## 2007-01-02 26292531 43.14854
## 2007-01-03 42463337 43.33972
## 2007-01-04 22444225 43.14854
## 2007-01-05 30905221 42.63865
## 2007-01-08 24350614 41.93758
## 2007-01-09 26319940 42.06504
chartSeries(`2330.TW`$'2330.TW.Close')

ret <- dailyReturn(`2330.TW`$'2330.TW.Close')
## Warning in to_period(xx, period = on.opts[[period]], ...): missing values
## removed from data
# Get Exptected Return
mean(ret)
## [1] 0.0006469755
# Get Risk
sd(ret)
## [1] 0.01729613
getSymbols('2330.TW', src='yahoo')
## Warning: 2330.TW contains missing values. Some functions will not work if
## objects contain missing values in the middle of the series. Consider using
## na.omit(), na.approx(), na.fill(), etc to remove or replace them.
## [1] "2330.TW"
getSymbols('1101.TW', src='yahoo')
## Warning: 1101.TW contains missing values. Some functions will not work if
## objects contain missing values in the middle of the series. Consider using
## na.omit(), na.approx(), na.fill(), etc to remove or replace them.
## [1] "1101.TW"
getSymbols('1102.TW', src='yahoo')
## Warning: 1102.TW contains missing values. Some functions will not work if
## objects contain missing values in the middle of the series. Consider using
## na.omit(), na.approx(), na.fill(), etc to remove or replace them.
## [1] "1102.TW"
getSymbols('2317.TW', src='yahoo')
## Warning: 2317.TW contains missing values. Some functions will not work if
## objects contain missing values in the middle of the series. Consider using
## na.omit(), na.approx(), na.fill(), etc to remove or replace them.
## [1] "2317.TW"
getSymbols('2454.TW', src='yahoo')
## Warning: 2454.TW contains missing values. Some functions will not work if
## objects contain missing values in the middle of the series. Consider using
## na.omit(), na.approx(), na.fill(), etc to remove or replace them.
## [1] "2454.TW"
getSymbols('2498.TW', src='yahoo')
## Warning: 2498.TW contains missing values. Some functions will not work if
## objects contain missing values in the middle of the series. Consider using
## na.omit(), na.approx(), na.fill(), etc to remove or replace them.
## [1] "2498.TW"
m <- cbind(`2330.TW`$'2330.TW.Close',
`1101.TW`$'1101.TW.Close',
`1102.TW`$'1102.TW.Close',
`2317.TW`$'2317.TW.Close',
`2454.TW`$'2454.TW.Close',
`2498.TW`$'2498.TW.Close')
dayreturn <- lapply(1:6, function(e)dailyReturn(m[,e]) )
## Warning in to_period(xx, period = on.opts[[period]], ...): missing values
## removed from data
## Warning in to_period(xx, period = on.opts[[period]], ...): missing values
## removed from data
## Warning in to_period(xx, period = on.opts[[period]], ...): missing values
## removed from data
## Warning in to_period(xx, period = on.opts[[period]], ...): missing values
## removed from data
## Warning in to_period(xx, period = on.opts[[period]], ...): missing values
## removed from data
## Warning in to_period(xx, period = on.opts[[period]], ...): missing values
## removed from data
m2 <- do.call('cbind', dayreturn)
head(m2)
## daily.returns daily.returns.1 daily.returns.2 daily.returns.3
## 2007-01-02 0.000000000 0.000000000 0.000000000 0.000000000
## 2007-01-03 0.004430733 -0.010087400 0.004724690 0.004209744
## 2007-01-04 -0.004411188 -0.003395550 -0.004702473 0.012578944
## 2007-01-05 -0.011817042 -0.010217837 -0.037793676 -0.026914735
## 2007-01-08 -0.016442193 -0.001724702 -0.004910354 -0.012766281
## 2007-01-09 0.003039161 0.043106550 0.019738252 0.004309545
## daily.returns.4 daily.returns.5
## 2007-01-02 0.000000000 0.000000000
## 2007-01-03 0.037450032 0.009036467
## 2007-01-04 0.013368749 0.000000000
## 2007-01-05 -0.015832011 0.008955631
## 2007-01-08 -0.037531631 -0.068048101
## 2007-01-09 -0.001394858 -0.023808907
m_mean <- sapply(1:6, function(e) mean(m2[,e],na.rm = TRUE))
m_std <- sapply(1:6, function(e) sd(m2[,e],na.rm = TRUE))
plot(m_mean, m_std, col=1:6)

stock_name <- c('2330.TW', '1101.TW', '1102.TW', '2317.TW', '2454.TW', '2498.TW')
names(m_mean) <- stock_name
rbind(m_mean, m_std)
## 2330.TW 1101.TW 1102.TW 2317.TW 2454.TW
## m_mean 0.0006469755 0.0002936951 0.0002576115 0.0003841321 0.0003018846
## m_std 0.0172961304 0.0213001314 0.0206165887 0.0232153739 0.0247446031
## 2498.TW
## m_mean -0.0001396474
## m_std 0.0304165924
抓取資料科學家職缺
library(rvest)
url <- 'https://www.104.com.tw/jobs/search/?ro=0&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8%E5%AE%B6&order=1&asc=0&kwop=7&page=1&mode=s'
article <- read_html(url) %>% html_nodes('article')
as.character(article[1] )
## [1] "<article class=\"b-block--top-bord job-list-item b-clearfix js-job-item \" data-job-no=\"9377211\" data-job-name=\"資料科學家\" data-job-ro=\"1\" data-cust-no=\"130000000093134\" data-cust-name=\"烏龜移動科技股份有限公司\" data-indcat=\"1006003001\" data-indcat-desc=\"廣告行銷公關業\" data-is-save=\"0\" data-is-apply=\"0\" data-jobsource=\"\"><div class=\"b-block__left\">\n <h2 class=\"b-tit\">\n <a href=\"//www.104.com.tw/job/?jobno=5kzi3&jobsource=n104bank2\" class=\"js-job-link \" target=\"_blank\"><em class=\"b-txt--highlight\">資料</em><em class=\"b-txt--highlight\">科學家</em></a>\n </h2>\n <ul class=\"b-list-inline b-clearfix\">\n<li><a href=\"//www.104.com.tw/jobbank/custjob/index.php?r=cust&j=596f426d5d6b481f3b413965552d355e13739416a33353d663b41391c1c1c1c6084349393098j57&jobsource=n104bank2\" target=\"_blank\" title=\"公司名:烏龜移動科技股份有限公司\n公司住址:台北市松山區民權東路三段144號13樓1521室\">烏龜移動科技股份有限公司</a></li>\n <li>廣告行銷公關業</li>\n </ul>\n<ul class=\"b-list-inline b-clearfix\">\n<li><span class=\"b-txt--primary\">面議</span></li>\n <li>台北市松山區</li>\n <li>經歷不拘</li>\n <li>大學</li>\n </ul>\n<p class=\"job-list-item__info b-clearfix\">. http://www.brain.com.tw/news/articlecontent?ID=23162&sort=\n\n1. 數據分析、挖掘、建模、模式評估等相關工作,並進行模型評估 \n2. <em class=\"b-txt--highlight\">資料</em>視覺化設計\n3. 熟悉預測方法、發展推薦演算法、個人化演算法\n4. 爬蟲程式開發,並進行</p>\n <div class=\"job-list-tag\">\n <span class=\"job-list-tag__date\">11/24更新</span>\n <span class=\"b-tag--default\">無經驗可</span>\n <span class=\"b-tag--default\">員工20人</span>\n </div>\n </div>\n <div class=\"b-block__right b-pos-relative\">\n <div class=\"rule-out\">\n <button class=\"b-btn b-btn--icon b-drowdown rule-out__btn b-clear-margin js-exclude\">\n <svg class=\"b-icon--weak-gray b-icon--w12\"><use xlink:href=\"#icon-arrow-down\"></use></svg></button>\n <ul class=\"b-drowdown__menu b-drowdown__right b-hide\">\n<li class=\"js-exclude-company gtm-exclude-company\">不想看到這個公司</li>\n <li class=\"js-exclude-industry gtm-exclude-industry\">不想看到這個產業</li>\n </ul>\n</div>\n <button class=\"b-btn js-save gtm-list-save b-btn--default \">\n <svg class=\"icon-star b-icon--gray b-icon--w18 gtm-list-save\"><use xlink:href=\"#icon-star\"></use></svg><span class=\"gtm-list-save\">儲存</span>\n </button>\n <button class=\"b-btn js-apply b-btn--default\">\n <svg class=\"icon-apply b-icon--gray b-icon--w18\"><use xlink:href=\"#icon-apply\"></use></svg><span>應徵</span>\n </button>\n <a href=\"//www.104.com.tw/jobbank/joblist/apply_analyze.cfm?j=596f426d5d6b481f3b413965552d355e13739416a33353d663b41391c1c1c1c6084349393098j57&channel=104rpt&jobsource=apply_analysis\" target=\"_blank\" class=\"b-link--gray gtm-list-apply\">0~5人應徵</a>\n </div>\n </article>"
title <- article[1] %>% html_nodes('.b-tit') %>% html_text() %>% trimws()
company <- article[1] %>% html_nodes('ul.b-list-inline li') %>% .[1] %>% html_text()
biz_type <- article[1] %>% html_nodes('ul.b-list-inline li') %>% .[2] %>% html_text()
salary <- article[1] %>% html_nodes('ul.b-list-inline li') %>% .[3] %>% html_text()
area <- article[1] %>% html_nodes('ul.b-list-inline li') %>% .[4] %>% html_text()
work_exp <- article[1] %>% html_nodes('ul.b-list-inline li') %>% .[5] %>% html_text()
edu <- article[1] %>% html_nodes('ul.b-list-inline li') %>% .[6] %>% html_text()
dt <- article[1] %>% html_node('.job-list-tag__date') %>% html_text()
job_apply <- article[1] %>% html_node('.gtm-list-apply') %>% html_text()
data.frame(title, company, biz_type, salary, area, work_exp, edu, dt, job_apply, stringsAsFactors = FALSE)
## title company biz_type salary area
## 1 資料科學家 烏龜移動科技股份有限公司 廣告行銷公關業 面議 台北市松山區
## work_exp edu dt job_apply
## 1 經歷不拘 大學 11/24更新 0~5人應徵
library(rvest)
url <- 'https://www.104.com.tw/jobs/search/?ro=0&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8%E5%AE%B6&order=1&asc=0&kwop=7&page=1&mode=s'
getJobdf <- function(url){
jobs <- read_html(url) %>% html_nodes('article.job-list-item')
jobdfall <- data.frame()
for (job in jobs){
title <- job %>% html_nodes('.b-tit') %>% html_text() %>% trimws()
company <- job %>% html_nodes('ul.b-list-inline li') %>% .[1] %>% html_text()
biz_type <- job %>% html_nodes('ul.b-list-inline li') %>% .[2] %>% html_text()
salary <- job %>% html_nodes('ul.b-list-inline li') %>% .[3] %>% html_text()
area <- job %>% html_nodes('ul.b-list-inline li') %>% .[4] %>% html_text()
work_exp <- job %>% html_nodes('ul.b-list-inline li') %>% .[5] %>% html_text()
edu <- job %>% html_nodes('ul.b-list-inline li') %>% .[6] %>% html_text()
dt <- job %>% html_node('.job-list-tag__date') %>% html_text()
job_apply <- job %>% html_node('.gtm-list-apply') %>% html_text()
#print(job)
jobdf <- data.frame(title, company, biz_type, salary, area, work_exp, edu, dt, job_apply, stringsAsFactors = FALSE)
#print(jobdf)
jobdfall <- rbind(jobdfall, jobdf)
}
jobdfall
}
url <- 'https://www.104.com.tw/jobs/search/?ro=0&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8%E5%AE%B6&order=1&asc=0&kwop=7&page=1&mode=s'
getJobdf(url)
## title
## 1 資料科學家
## 2 Data Scientist/資料科學家
## 3 資料科學家
## 4 Data Scientist (資料科學家)
## 5 Python資料科學家
## 6 Data Scientist資料科學家
## 7 Data Scientist資料科學家
## 8 RS170708-資料科學家
## 9 Data Scientist 資料分析師 / 資料科學家
## 10 Data Scientist / 資料科學家
## 11 Data Scientist 資料分析師 / 資料科學家(GHQ)
## 12 I3901 Data Scientist 資料科學家
## 13 Data Scientist 資料科學家 (台北)
## 14 【顧問部】經理/協理 (金融行業顧問 資料科學家)-311A
## 15 [2018研發替代役] Data analyst/scientist (資料分析/資料科學家)-J01362
## 16 【智能製程】資料科學家 Data Scientist(鄭州/台北)
## 17 【智能製程】資料科學家 Data Scientist(鄭州/台北)
## 18 【資訊工程】資料科學家(Data Scientist)(台中廠)
## 19 【研發替代役專區】資料科學家
## 20 【顧問部】顧問師/高級顧問師/副理(企業績效 數位轉型資料科學家)-317B
## company
## 1 烏龜移動科技股份有限公司
## 2 行動基因生技股份有限公司
## 3 香港商傑風網路有限公司台灣分公司
## 4 思納捷科技股份有限公司
## 5 醫療財團法人辜公亮基金會和信治癌中心醫院
## 6 塞席爾商悠福科技股份有限公司
## 7 CatchPlay_英屬蓋曼群島商威望國際娛樂股份有限公司台灣分公司
## 8 緯創資通股份有限公司
## 9 亞洲遊科技股份有限公司
## 10 集邦科技股份有限公司_TRENDFORCE
## 11 遊戲橘子數位科技股份有限公司
## 12 遠傳電信股份有限公司
## 13 立達軟體科技股份有限公司
## 14 KPMG_安侯建業聯合會計師事務所
## 15 宏達電 HTC Corporation_宏達國際電子股份有限公司
## 16 富智康國際股份有限公司(鴻海集團)
## 17 富智康國際股份有限公司(鴻海集團)
## 18 友達光電股份有限公司
## 19 國泰金控_國泰金融控股股份有限公司
## 20 KPMG_安侯建業聯合會計師事務所
## biz_type salary area work_exp edu
## 1 廣告行銷公關業 面議 台北市松山區 經歷不拘 大學
## 2 生化科技研發業 面議 台北市內湖區 4年以上 博士
## 3 電子通訊/電腦週邊零售業 面議 台北市大安區 經歷不拘 專科
## 4 電腦軟體服務業 面議 台北市松山區 1年以上 碩士
## 5 醫院 依公司規定 台北市北投區 經歷不拘 專科
## 6 網際網路相關業 面議 台北市中山區 經歷不拘 大學
## 7 網際網路相關業 面議 台北市內湖區 5年以上 碩士
## 8 電腦及其週邊設備製造業 面議 新北市汐止區 經歷不拘 碩士
## 9 網際網路相關業 面議 台北市大安區 經歷不拘 學歷不拘
## 10 網際網路相關業 面議 台北市中山區 經歷不拘 碩士
## 11 其它軟體及網路相關業 面議 台北市內湖區 5年以上 大學
## 12 電信相關業 面議 台北市內湖區 3年以上 大學
## 13 電腦軟體服務業 面議 台北市大安區 經歷不拘 大學
## 14 會計服務業 依公司規定 台北市信義區 5年以上 碩士
## 15 消費性電子產品製造業 面議 新北市新店區 經歷不拘 碩士
## 16 消費性電子產品製造業 面議 河南省鄭州市 2年以上 碩士
## 17 消費性電子產品製造業 面議 新北市土城區 2年以上 碩士
## 18 光學器材製造業 面議 台中市西屯區 經歷不拘 碩士
## 19 金融控股業 面議 台北市信義區 經歷不拘 碩士
## 20 會計服務業 依公司規定 台北市信義區 2年以上 大學
## dt job_apply
## 1 11/24更新 0~5人應徵
## 2 11/24更新 0~5人應徵
## 3 11/22更新 0~5人應徵
## 4 11/23更新 0~5人應徵
## 5 11/09更新 0~5人應徵
## 6 10/23更新 0~5人應徵
## 7 11/22更新 0~5人應徵
## 8 11/19更新 6~10人應徵
## 9 11/21更新 11~30人應徵
## 10 11/17更新 11~30人應徵
## 11 11/23更新 11~30人應徵
## 12 11/21更新 6~10人應徵
## 13 11/20更新 0~5人應徵
## 14 11/17更新 0~5人應徵
## 15 11/16更新 11~30人應徵
## 16 11/24更新 0~5人應徵
## 17 11/24更新 0~5人應徵
## 18 11/06更新 6~10人應徵
## 19 11/21更新 6~10人應徵
## 20 11/17更新 0~5人應徵
dfall <- data.frame()
for(i in 1:2){
joburl <- paste0('https://www.104.com.tw/jobs/search/?ro=0&keyword=大數據&order=1&asc=0&kwop=7&page=',i,'&mode=s')
df <- getJobdf(joburl)
dfall <- rbind(dfall,df)
print(i)
}
## [1] 1
## [1] 2
sort(table(dfall$biz_type), decreasing = TRUE)
##
## 銀行業 電腦軟體服務業
## 6 4
## 消費性電子產品製造業 網際網路相關業
## 3 3
## 人身保險業 金融控股業
## 2 2
## 電信相關業 電腦及其週邊設備製造業
## 2 2
## 人力仲介代徵 大專校院教育事業
## 1 1
## 不動產經營業 半導體製造業
## 1 1
## 光電產業 百貨相關業
## 1 1
## 汽車及其零件製造業 其他汽機車相關業
## 1 1
## 紡紗業 通訊機械器材相關業
## 1 1
## 電子通訊/電腦週邊零售業 電視業
## 1 1
## 電腦系統整合服務業 檢測技術服務
## 1 1
## 醫院 藥品/化妝品及清潔用品批發業
## 1 1
barplot(sort(table(dfall$biz_type), decreasing = TRUE))

table(dfall[dfall$biz_type == '銀行業',]$company)
##
## 中國信託商業銀行股份有限公司 台北富邦商業銀行股份有限公司
## 2 2
## 第一銀行_第一商業銀行股份有限公司 華南商業銀行股份有限公司
## 1 1
sort(table(dfall$area), decreasing = TRUE)
##
## 台北市內湖區 台北市大安區 台北市信義區 新竹市 台北市中山區
## 8 5 4 3 2
## 台北市南港區 桃園市龜山區 新北市中和區 新北市新店區 廣東省深圳市
## 2 2 2 2 2
## 台中市北區 台北市 台北市中正區 台南市山上區 南投縣草屯鎮
## 1 1 1 1 1
## 桃園市中壢區 桃園市桃園區 新竹縣新豐鄉
## 1 1 1
sort(table(dfall$edu), decreasing = TRUE)
##
## 大學 專科 碩士 博士
## 24 8 7 1
write.csv(dfall, '104job_2.csv')