前篇数据可视化,数据获取都是靠的别人给的api,但是,中国人就喜欢自力更生。经过我尝试几次,原来R爬取动态网站也很简单。呼噜噜,接下来就让我们来试一试如何做:
第一步,安装软件:
这里主要用到的肯定是R和Rstudio,唯一需要的是安装一个软件叫phantomjs和写一个js文件。
phantomjs可以从这个网站上下载:https://phantomjs.org/download.html
win系统就是下载这个zip压缩文件。然后解压,我就是将这个文件解压到D盘下:
一定要知道这个在什么位置,不要放到桌面之类的,尤其是对一些不会写代码的人,路径一定要简单,虽然你将文件放在桌面,看起来你可以看得到,但是桌面的路径远远比你直接放在d盘要复杂的多。一步一步打开,然后就会看到phantomjs.exe这个软件,鼠标选择单击左键选中,然后右键查看属性。就可以看到位置在哪里,复杂phantomjs.exe所在的位置。比如我的位置就是:D:\phantomjs-2.1.1-windows\bin
接下来进入Rstudio,查看一下我在的工作目录:
很明显,就是在文档下面的stdr文件夹内。
接着我们在Rstudio新建一个文件,这样做:
上面的gif就是说,在Rstudio里面新建一个文本文件,然后保存为my_js_dxy.js(这里js后缀代表为js文件)
在my_js_dxy.js文件里面复制下面的代码:
// scraper_dxy.js
// Create a webpage object
var page = require('webpage').create();
// Include the File System module for writing to files
var fs = require('fs');
// Specify source and path to output file
var url = 'https://3g.dxy.cn/newh5/view/pneumonia?scene=2&clicktime=1579579384&enterid=1579579384&from=timeline&isappinstalled=0'
var path = 'dxy_web.html'
page.open(url, function (status) {
var content = page.content;
fs.write(path,content,'w')
phantom.exit();
});
最后保存好之后,可以在文件夹看到这个文件:
当上面phantomjs软件下载好,my_js_dxy.js文件都写好之后,接下来将完全在Rstudio里面进行处理。
system("D:/phantomjs-2.1.1-windows/bin/phantomjs my_js_dxy.js")
[1] 0
dir()
[1] "ave_people.csv" "bili_food011202.R"
[3] "C400002AW3TG3OgEer.m4a" "data-raw"
[5] "descriptions.csv" "dxy_web.html"
[7] "filea9852ab4865.gif" "gmail_creds"
[9] "gzh_0127.R" "gzh_0127001.R"
。。。。。。
第一行代码含义:在R里面,可以使用system()函数运行系统软件,这里指定了D:/phantomjs-2.1.1-windows/bin/文件夹下的phantomjs文件运行stdr文件夹里的my_js_dxy.js文件。(这里一定要注意,我在R里面写的路径斜杠是反过来的,而win系统里面的斜杠是相反的)。等待一会,就会出现一个打印出0。可能是代表没有错误。然后通过dir()函数就可以查看,有个文件产生了,这个文件叫dxy_web.html。为什么叫这个名字,你仔细查看一下my_js_dxy.js这个文件的11行代码,就知道了,是我设置的,你也可以改成别的名字。仔细查看Rstudio的file这个窗口,按照修改的时间降序,就可以看到第一个文件:
其实这个部分,就是已经将动态的丁香园网站数据保存好了。一切数据都在这个dxy_web.html文件里面。接下来就是很常规的方法,使用rvest、等一系列基础的包,就可以将数据保存。
具体代码如下:
library(rvest)
library(tidyverse)
url <- "dxy_web.html"
withjs <- read_html(url) %>% html_nodes("script#getAreaStat") %>%
html_text()
library(jsonlite)
my_data <- sub("\}catch\(e\)\{\}", '', sub("try \{ window.getAreaStat = ", '', withjs))
my_data_finall <- fromJSON(my_data)
第一行到第三行是加载包,第四行是刚才处理的文件的名字,这些一定要一样,除非都搞懂了具体是什么意思(其实js和R都差不多,也没什么差距,编程语言都大同小异,只要好好看看一看,还是好理解的)。第五行和第六行就是将国内各个省的数据保存下来(这个withjs经过第七行数据的处理,就变成json格式的数据,尽管是字符串形式,然后使用fromJSON()函数将文件字符串处理一下,就传给my_data_finall。第七行就是将withjs字符串掐头去尾。
数据经过运行,然后就可以查看my_data_finall数据框了。
依次点击1, 2, 3,就可以看到你想要的数据。这就是国内数据就获取了。
那么想要国外数据怎么获取?也很简单,代码如下:
withjs <- read_html(url) %>% html_nodes("script#getListByCountryTypeService2") %>%
html_text()
library(jsonlite)
my_data_foreign <- sub("\}catch\(e\)\{\}", '', sub("try \{ window.getListByCountryTypeService2 = ", '', withjs))
my_data_finall_foreign <- fromJSON(my_data_foreign)
这个时候查看my_data_finall_foreign数据框就可以看到了。
依次点击1,2,就看到国外的了。是不是很简单。