網頁

2020年11月16日 星期一

R語言:簡易爬蟲(統一發票中獎號碼)

 首先需安裝2個爬蟲套件:rvest 與 magrittr,其中 magrittr 是為了使用 %>% 搭配 rvest 中的函數。

#安裝 rvest 與 magrittr
pkgs <- c("rvest", "magrittr")
install.packages(pkgs)

最近一期統一發票中獎號碼網址:

https://www.etax.nat.gov.tw/etw-main/web/ETW183W2_10907/ 

我將日期的部分分開用一個變數代替 ,以便可以修改成其他日期

library(rvest)
library(magrittr)
date_s <- "10907"
url <- paste0("https://www.etax.nat.gov.tw/etw-main/web/ETW183W2_", date_s)

爬取整個網頁的程式碼:

doc <- read_html(url, encoding = "UTF-8")
number <- doc %>%
  html_nodes("#tablet01") %>%
  html_nodes("td") %>%
  html_text()
head(number, n = 1); #檢查資料

其中 "tablet01" 可以用  Selector Gadget 來定位,這是一個CSS 選擇器,方便在複雜的CSS網頁定位所要資料的CSS,依 Selector Gadget 提供的步驟將Selector Gadget至於書籤欄,點選Selector Gadget後網頁下方會出現一個功能列:

接著點選要爬取的 "109年 07-08月" ,"13362795",這時下方的CSS選擇器會出現td 數量23,因為包含了一些不必要資料所以要排除掉。

 

用滑鼠點選來排除不需要的CSS:

 

這時資料已經剩下14筆應該就是我們所需要的,將"#tablet01 td"填入我們的程式碼:

doc <- read_html(url, encoding = "UTF-8")
number <- doc %>%
  html_nodes("#tablet01") %>%
  html_nodes("td") %>%
  html_text()
head(number, n = 1); #檢查資料

我們可試著執行一次看看結果是什麼:

 我們把 number 資料 1~13 筆列出,比對網頁的資料正確:


 接下來用 Selector Gadget 將獎別的 CSS 填入程式碼中:

bonus_name <- doc %>%
  html_nodes("th") %>%
  html_text()
head(bonus_name, n = 1); bonus_name[1:11]

執行上面的程式碼結果:

 

到這邊已經算是都正確了,如果要取用中獎號碼來做兌獎處理,必須還要做一些步驟,

我們可以看到 number 向量中獎號碼的索引是 2, 4, 6, 13,印出來的結果是:


 其中的號碼包含了空白還有特殊符號,利用正規式將這些字元過濾掉:

num <- gsub("^\\s|\\s$", "", number[c(2, 4, 6, 13)])
num <- unlist(strsplit(num, " ")); num

 

特別號"987" 和 "614" 中間還有一個逗號也要過濾掉:

ext_6 <- unlist(strsplit(num[6],"、")); ext_6

這樣就完成了,特別獎~頭獎存於 num[1:5],特別號存於變數 ext_6,這樣就可以利用這些來做兌獎的處理。

完整的程式碼如下:

library(rvest)
library(magrittr)
date_s <- "10907"
url <- paste0("https://www.etax.nat.gov.tw/etw-main/web/ETW183W2_", date_s)

doc <- read_html(url, encoding = "UTF-8")
number <- doc %>%
  html_nodes("#tablet01") %>%
  html_nodes("td") %>%
  html_text()
head(number, n = 1); #檢查資料

bonus_name <- doc %>%
  html_nodes("th") %>%
  html_text()
head(bonus_name, n = 1); bonus_name[1:11]

num <- gsub("^\\s|\\s$", "", number[c(2, 4, 6, 13)])
num <- unlist(strsplit(num, " ")); num

lotto_n <- num[1:5]; lotto_n
ext_6 <- unlist(strsplit(num[6],"、")); ext_6


沒有留言:

張貼留言