忙到翻天的星期一,現在今天靠著下載120回的三國演義 來混過一天了
我選擇的網站是 "中國哲學書電子化計劃"
三國演義第1回是
https://ctext.org/sanguo-yanyi/ch1/zh?en=off
三國演義第120回是
https://ctext.org/sanguo-yanyi/ch120/zh?en=off
可以觀察到,差別只在從 ch1 變成了 ch120,所以等一下寫個迴圈就可以快速地處理
因為這次的重點還是在於後續上傳到 Elastic Cloud 的應用,所以爬蟲程式就寫得粗暴又簡單。
其中,套件 httr 是負責捉取網頁,而 rvest 是負責解析網頁。magrittr 則是 pipeline 操作的套件。
若你經常需要進行資料探索,pipeline 的語言給予我們很多的彈性,而且又容易理解;
# %>% : pipeline 操作
# 舉例來說,以下2者是等價的
sum(head(1:100))
1:100 %>% head %>% sum
同理在做網頁解析時,除了 Chrome 開發者工具提供很多選取的確認,pipeline 的操作也能加速我們的開發。
不過,如果你的爬蟲是需要定例執行,可減少 pipeline 的使用,因為多多少少會減損效能;不過對於只有120回的三國演義來說,那一種寫法都是沒有太大的差異囉。
捉取120回三國演義的 R 語法如下。
require(httr)
library(rvest)
require(magrittr)
save_path <- "d:/02_My_Code/01_R/sanguoyanyi_text"
for (page in 1:120) {
res <- httr::GET(url = paste0("https://ctext.org/sanguo-yanyi/ch", page, "/zh?en=off"), httr::add_headers(.headers = headers))
my_sanguo_text <- content(res, "text") %>%
read_html() %>%
html_nodes("td[class=ctext]") %>%
html_text() %>%
gsub("\n", "", .) %>%
paste0(., collapse = "")
readr::write_file(my_sanguo_text, file.path(save_path, paste0(page, ".txt")))
Sys.sleep(1)
}
其中比較需要注意的是,原本我們捉取資料時,會有許多斷行符號(\n),這個會造成我們後續上傳 Elastic Cloud時的困擾;所以我希望讓事情簡單化,讓單一回的三國演義,只有一個斷行符號。捉下來後,在 Visual Studio Code 中開啟時,左邊的行數提示就只會出現 1 ,如下圖:
存檔時也直接命名為 1.txt、2.txt、3.txt... 120.txt,沒多做太多的處理。
希望明天可以順利將120回上傳成功啊 ....