千家信息网

R语言如何获取数据

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,这篇文章主要讲解了"R语言如何获取数据",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"R语言如何获取数据"吧!今天只分享数据获取的代码,为了显得项目规范
千家信息网最后更新 2024年11月26日R语言如何获取数据

这篇文章主要讲解了"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语言如何获取数据这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0