您好,登錄后才能下訂單哦!
這篇文章主要講解了“R語言如何獲取數據”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“R語言如何獲取數據”吧!
今天只分享數據獲取的代碼,為了顯得項目規范性(其實就是裝X),我第一次使用了Rstudio中的Create Projects菜單創建了本地項目倉庫(以前寫R代碼太飄逸了,寫的龍飛鳳舞,完全不顧及別人能不能看懂,以后不可以這樣了,因為工作中已經吃過很大虧了)。
因為是含有二級列表頁,所以第一步的想法自然是先爬取年份鏈接,然后遍歷鏈接抓取每一年份中的文檔。
可能因為自己文科生思維的問題,不太習慣直接寫雙層for循環(因為看到會不適),所以遇到這種需要二次遍歷的,我一般都會拆成兩個小步驟去進行:
1、遍歷年份對應的對應年政府工作報告主頁鏈接:
## !/user/bin/env RStudio 1.1.423
## -*- coding: utf-8 -*-
## Pages_links Acquisition
## 加載必要的安裝包: library("rvest") library("stringr") library("Rwordseg") library("wordcloud2") library("dplyr")
#主網址
url <- "http://www.gov.cn/guowuyuan/baogao.htm"
#提取二級鏈接
txt<-read_html(url) %>%
html_nodes("#history_report") %>%
html_nodes("p") %>%
html_text()
#提取年份&鏈接信息:
Base <- read_html(url) %>% html_nodes("div.history_report") %>% html_nodes("a")
Year <- Base %>% html_text(trim = TRUE) %>% as.numeric()
Links <- Base %>% html_nodes("a") %>% html_attr("href") %>% str_trim("both")
#合并成數據框:
Reports_links <- data.frame(
Year = Year,
Links = Links,
stringsAsFactors = FALSE
)
#存放到本地目錄中
if (!dir.exists("data")){
dir.create("data")
write.csv(
Reports_links, "./data/Reports_links.csv",
row.names=FALSE
)
}
以上代碼為了便于理解,我都拆成單句展示了,github中代碼都會是封裝好的模塊化函數。
2、從每一個年份對應的鏈接中獲取整個政府工作報告的文檔文本:
#加載包
library("rvest")
library("dplyr")
library("magrittr")
library("doParallel")
library("foreach")
#讀取年份及對應鏈接
Links_data <- read.csv("./data/Reports_links.csv",stringsAsFactors = FALSE) %>% arrange(Year)
#創建文檔提取函數:
Get_Corpus_Report <- function(i){
url = grep(i,Links_data$Year) %>% Links_data$Links[.]
read_html(url) %>%
html_nodes("td.p1,tr > td,div.pages_content") %>%
html_text("both") %>%
cat(file = sprintf("./data/Corpus/%d.txt",i))
}
以上需用到較為基礎的CSS表達式配色rvest來提取文檔,如果你還不太了解這塊的內容,趕快通過菜單中的網絡數據獲取筆記來惡補。
沒有構造循環,這里用了foreach包提供的多進程并行爬取方案來處理多循環問題(雖然這里的量級還體現不出來并行的優勢,但是整體代碼要比寫循環簡介、高效)
system.time({
if (!dir.exists("./data/Corpus")){
dir.create("./data/Corpus")
}
cl<- makeCluster(4)
registerDoParallel(cl)
tryCatch({
foreach(
i= Links_data$Year,
.combine = c,
.packages = c("rvest","magrittr")
) %dopar% Get_Corpus_Report(i)
}, error = function(e) {
print(e)
},
finally = stopCluster(cl)
)
})
感謝各位的閱讀,以上就是“R語言如何獲取數據”的內容了,經過本文的學習后,相信大家對R語言如何獲取數據這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。