# R Code ###### tags: `資料科學自學園` `R Language` ```{r} library(magrittr) library(tmcn) #如果沒有套件,請下載 #install.packages("tmcn") library(xml2) library(rvest) #爬取公眾號------------------------------------------------------------------------- jfj = "http://chuansong.me/account/jfjbjzb" #爬取公眾號貼文的連結--------------------------------------------------------------- j = 1 MAIN = NULL #指派一個list「MAIN」,設定空值,之後在爬取網址時,將爬取到的網址存入該list中。 repeat{ main = paste(jfj,"?start=",12*(j-1),sep = "") #設定網站連結,格式為「[網址]?start=[12*(頁數-1)]」 main.2 = read_html(main) #讀取網站的原始碼,執行此步驟前需要先執行「library(rvest)」 MAIN[j] = list(html_nodes(main.2,".question_link") %>% html_attr("href")) #抓網址:抓取原始碼中,有"question_link"註記的區域,並抓取其中的網址連結(href) ddln = html_nodes(main.2,".timestamp") %>% html_text #設定抓取停止時間點:抓取原始碼中,有".timestamp"註記的區域,並存取成文字值「ddln」 if (1 %in% (ddln %in% "2018-01-02")) break #設定抓取停損點:若ddln中有包含 "2018-01-02"的話,中斷這個迴圈 j = j + 1 Sys.sleep(runif(2,2,2)) #設定休息時間,每執行2次迴圈,休息2秒 } url = unlist(MAIN) #把清單MAIN解除list,並將資料存成物件「url」 url = lapply(1:length(url),function(i){paste("http://chuansong.me",url[i],sep = "")}) #lapply遞迴,將url中的網址全部加上「http://chuansong.me」 url = unlist(url) #把清單url解除list,並重新存成物件「url」 #抓取公眾號貼文的內文--------------------------------------------------------------- ``` 設定空值的物件,以利後面將爬取到的資料分別存到這些物件中:title.tmp代表標題物件、date.tmp代表日期物件、ctnt.tmp代表內文物件 ```{r} title.tmp <- NULL date.tmp <- NULL ctnt.tmp <- NULL ``` tmp是在爬取網頁原始碼時,將網頁原始碼爬取下來的物件,有先存成tmp,可以減少重複爬取該網站的次數;避免被鎖IP ```{r} tmp = NULL ``` 以下四個函數是爬取網站內文的函式。「return(tryCatch)」是處理錯誤程序的函數,讓爬取的迴圈不會因為遇到error就中斷。 ```{r} #設定函數------------------ FUN.art <- function(i){return(tryCatch(read_html(url[i], options = "HUGE"),error = function(e) NULL))} FUN.title = function(i){return(tryCatch(html_nodes(tmp, "#activity-name") %>% html_text(),error = function(e) NULL))} FUN.date = function(i){return(tryCatch(html_nodes(tmp, "#post-date") %>% html_text(),error = function(e) NULL))} FUN.ctnt = function(i){return(tryCatch(html_nodes(tmp, "#img-content") %>% html_text(),error = function(e) NULL))} k = 1 repeat{ if (k > length(url)) break tmp = FUN.art(k) tmp.title = FUN.title(k) #若tmp.title是空值,也就是沒有爬取到,則回傳NA值 if (length(tmp.title) == 0) title.tmp[k] = NA if (length(tmp.title) > 0) title.tmp[k] = tmp.title tmp.date = FUN.date(k) #若tmp.date是空值,也就是沒有爬取到,則回傳NA值 if (length(tmp.date) == 0) date.tmp[k] = NA if (length(tmp.date) > 0) date.tmp[k] = tmp.date tmp.ctnt = FUN.ctnt(k) #若tmp.ctnt是空值,也就是沒有爬取到,則回傳NA值 if (length(tmp.ctnt) == 0) ctnt.tmp[k] = NA if (length(tmp.ctnt) > 0) ctnt.tmp[k] = tmp.ctnt k <- k + 1 Sys.sleep(runif(2,2,2)) #設定休息時間 if (k %% 200 == 0 ) save.image("存檔路徑") } data.tmp = cbind(unlist(title.tmp), unlist(date.tmp), unlist(url), unlist(ctnt.tmp)) data = data.frame(data.tmp) names(data) = c("title","date","url","ctnt") write.csv(data,file = "data.csv", fileEncoding = "UTF-8") ```