# 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")
```