一个爬取东方财富网中国经济数据的粗暴的R函数

一个爬取东方财富网中国经济数据的粗暴的R函数

R脚本👉chinese_econ_dirty_data.R
本来这个函数是想往EASTMONEY包里面继续添加的,但是怎么弄都没能够把这些中国经济数据的数据条目合成一个非常完美的函数,因此就单独列示这个函数吧。并且我给它起了个名字——chinese_econ_dirty_data。嗯,确实只能爬到一个脏的数据。

中国经济数据

中国经济数据里面包含了很多常用的宏观数据:
中国经济数据
为了爬其中的数据,我设计了下面的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
chinese_econ_dirty_data <- function(url = "http://data.eastmoney.com/cjsj/consumerpriceindex.aspx?p=", filename = "mydata.csv") {
require(rvest)
page <- function(url = url){
page <- url %>% read_html() %>% html_nodes("input#pagecount") %>% html_attr("value")
page <- as.integer(page)
return(page)
}
url_init <- url
table = data.frame()
for(i in 1:page(url = url_init)){
url <- paste(url_init, i)
table <- rbind(table, as.data.frame(url %>% read_html() %>% html_table(fill = T, header = F)))
}
str_temp <- paste0("pageit('", page(url = url_init), "');")
table <- table[-which(table$X2 == str_temp),]
table <- table[,which(apply(is.na(table), 2, sum) == 0)]
return(table)
}

注意html_nodes(“input#pagecount”)表示选择id=pagecount的input节点。之前在EASTMONEY中的html_nodes(“a.next”)表示选择class=next的a节点。

函数使用测试

1
2
# 下载PPI的脏数据
da <- chinese_econ_dirty_data("http://data.eastmoney.com/cjsj/productpricesindex.aspx?p=")

注意到这个链接需要把页面翻到第2页或之后才能看到,例如第二页为:

1
http://data.eastmoney.com/cjsj/productpricesindex.aspx?p=2

然后去掉后面的具体页码即可。
下载结果:
爬取结果

后期数据处理

因为这个函数下载得到的数据比较脏,所以还需要后面的继续处理,我就以这个为例:

1
2
3
4
da <- da[-which(da$X2 == "当月"),]
colnames(da) = c("月份", "当月", "当月同比增长", "累计")
# 输出为csv文件
write.table(da, file = "PPI.csv", row.names = F)

最后得到的csv文件内容为:

1
2
3
4
5
6
7
8
9
10
11
"月份" "当月" "当月同比增长" "累计"
"2018年05月份" "104.1" "4.10%" "103.70"
"2018年04月份" "103.4" "3.40%" "103.60"
"2018年03月份" "103.1" "3.10%" "103.70"
"2018年02月份" "103.7" "3.70%" "104.00"
"2018年01月份" "104.3" "4.30%" "104.30"
"2017年12月份" "104.9" "4.90%" "106.30"
"2017年11月份" "105.8" "5.80%" "106.40"
"2017年10月份" "106.9" "6.90%" "106.50"
"2017年09月份" "106.9" "6.90%" "106.50"
······

下一步

虽然这个函数还没有达到我自己想要的效果,但是未来闲的时候可以在这个函数的基础上为每个数据条目单独写一个函数。然后在那个函数里面调用这个函数,还是可以比较容易实现的。

这个函数支持的数据条目

下面的条目均为中国的经济数据条目:

数据条目 链接
CPI http://data.eastmoney.com/cjsj/consumerpriceindex.aspx?p=
PPI http://data.eastmoney.com/cjsj/productpricesindex.aspx?p=
GDP http://data.eastmoney.com/cjsj/grossdomesticproduct.aspx?p=
PMI http://data.eastmoney.com/cjsj/purchasingmanagerindex.aspx?p=
城镇固定资产投资 http://data.eastmoney.com/cjsj/townassetsinvest.aspx?p=
房价指数(08-10) http://data.eastmoney.com/cjsj/housepriceindex.aspx?p=
新房价指数 http://data.eastmoney.com/cjsj/newhousepriceindex.aspx?p=
企业景气及企业家信心指数 http://data.eastmoney.com/cjsj/enterpriseboomindex.aspx?p=
工业增加值增长 http://data.eastmoney.com/cjsj/industryincrementspeed.aspx?p=
企业商品价格指数 http://data.eastmoney.com/cjsj/corporategoodspriceindex.aspx?p=
消费者信心指数 http://data.eastmoney.com/cjsj/consumerconfidenceindex.aspx?p=
社会消费品零售总额 http://data.eastmoney.com/cjsj/consumergoodsretailindex.aspx?p=
货币供应量 http://data.eastmoney.com/cjsj/moneysupply.aspx?p=
海关进出口增减情况一览表 http://data.eastmoney.com/cjsj/importandexport.aspx?p=
外汇和黄金储备 http://data.eastmoney.com/cjsj/goldforexreserve.aspx?p=
交易结算资金(银证转账) http://data.eastmoney.com/cjsj/bankTransfer.aspx?p=
股票账户统计表(新) http://data.eastmoney.com/cjsj/weeklystockaccountsnew.aspx?p=
股票账户统计表 http://data.eastmoney.com/cjsj/weeklystockaccounts.aspx?p=
FDI http://data.eastmoney.com/cjsj/foreigndirectinvestment.aspx?p=
财政收入 http://data.eastmoney.com/cjsj/staterevenue.aspx?p=
全国税收收入 http://data.eastmoney.com/cjsj/nationaltaxreceipts.aspx?p=
新增信贷数据 http://data.eastmoney.com/cjsj/newfinancialcredit.aspx?p=
本外币存款 http://data.eastmoney.com/cjsj/foreigncurrencydeposit.aspx?p=
外汇贷款数据 http://data.eastmoney.com/cjsj/foreignexchangeloan.aspx?p=
存款准备金率 http://data.eastmoney.com/cjsj/reserverequirementratio.aspx?p=
利率调整 http://data.eastmoney.com/cjsj/interestrate.aspx?p=

题外话

第一眼看到这个网页的时候我就看到了这个网页上的JavaScript图表,然后我就意识到,一定可以找到一个json或者其他格式的数据。然后我打开检查就发现了这个:

这个显然就是图表的数据源,不过并没有表格中的数据齐全,不过我也试着对这个数据进行了处理,但是感觉比直接爬还麻烦:

1
2
3
4
5
6
7
8
9
10
11
12
13
system("curl 'http://data.eastmoney.com/DataCenter_V3/Chart/cjsj/China.ashx?isxml=false&mkt=19&r=0.3436836897564495' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://data.eastmoney.com/cjsj/consumerpriceindex.aspx?p=2' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --compressed -o temp.json")
# 不过这里需要对temp.json进行转码,我没有在R中找到转码的方法,于是我用Stata转码的。
da <- jsonlite::fromJSON("temp.json")
# 或者下面的也行
da <- RJSONIO::fromJSON("temp.json", nullValue = NA, simplify = F)
as.vector(da$X)
da$X <- unlist(strsplit(da$X, split=","))
da$Y <- unlist(strsplit(da$Y, split=","))
df <- data.frame(x = array('a', c(125, 4)))
df$x.1 <- da$X
df$x.2 <- da$Y[1:125]
df$x.3 <- da$Y[126:250]
df$x.4 <- da$Y[251:375]

里面在得到temp.json后还需要对temp.json进行转码,我没有在R中找到转码的方法,于是我用Stata转码的。

# R

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×