自由時報爬蟲

# 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&amp;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&amp;j=596f426d5d6b481f3b413965552d355e13739416a33353d663b41391c1c1c1c6084349393098j57&amp;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&amp;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&amp;channel=104rpt&amp;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')