---
# System prepended metadata

title: R Code
tags: [R Language, 資料科學自學園]

---

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