其他

这个包绝对值得你用心体验一次!

2017-11-22 杜雨 R语言中文社区

杜雨,EasyCharts团队成员,R语言中文社区专栏作者,兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化。个人公众号:数据小魔方(微信ID:datamofang) ,“数据小魔方”创始人。


这一段时间在研究R里面的数据抓取相关包,时不时的能发掘出一些惊喜。

比如今天,我找到了一个自带请求器的解析包,而且还是嵌入的pantomjs无头浏览器,这样就不用你再傻乎乎的再去装个selenium驱动,也不用借助任何请求器(RCurl或者httr)包就可以自动解析带有js脚本的HTML文档。

耳听为虚,眼见为实,还记得之前讲解表格数据抓取的那一节,遇到的天气数据表格,里面的数据拿不到,有些棘手。害得我动用了RSelenium调用了plantomjs才得以解决,但是!

今天讲解的这个包将所有的任务量缩减到一句代码!

library("rvest") URL<-"https://www.aqistudy.cn/historydata/monthdata.php?city=北京" %>% xml2::url_escape(reserved ="][!$&'()*+,;=:/?@#")

大家可以试一试使用普通的请求方法是否可以成功获取里面的表格(要是成功了算我输!!!)

使用RCurl包请求!

header<-c("User-Agent"="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36") mytable <- getURL(URL,httpheader=header,.encoding="UTF-8") %>% htmlParse(encoding ="UTF-8") %>% readHTMLTable(header=TRUE) $`NULL` NULL

这是多大仇多大怨啊~_~

使用rvest试一试:

mytable <- URL %>%  read_html(encoding ="UTF-8") %>% html_table(header=TRUE) %>% `[[`(1) [1] 月份     AQI      范围     质量等级 PM2.5    PM10     SO2      CO       NO2      O3

恩,对,这次进步了,拿到了表头,可是这有什么卵用!!!

使用selenium驱动浏览器

#java -jar D:/selenium-server-standalone-3.3.1.jar
#system("java -jar D:/selenium-server-standalone-3.3.1.jar",intern=FALSE)

start_session(root="http://localhost:4444/wd/hub/",browser ="phantomjs")   post.url(URL) mytable<-page_source() %>% stri_conv(from="utf-8") %>% read_html() %>% html_table() quit_session()


这次总算拿到了!数一数写了多少字的代码!

有木有更加快捷的方法呢,当然有啦!

接下来瞪大眼睛看这一款神器!

使用rdom包:

stopifnot(Sys.which("phantomjs") != "")
#以上代码检测系统路径中是否含有phantomjs浏览器
#如果没有下载过phantomjs浏览器或者下载过但是没有加入系统路径,
#记得从新操作一下,否则一下函数无法运行!devtools::install_github("cpsievert/rdom")
#安装rdom包(如果总是提示timeout的话,记得加载一下curl包)


library("rdom")
tbl <- rdom(URL) %>% readHTMLTable(header=TRUE)  %>% `[[`(1)

有木有看清楚什么情况,没有,已经完事儿,真的是只有一行代码!

似不似,有点儿惊讶,rdom后台调用了plantomjs浏览器渲染了整个html目标文档(包含里面的所有script标签里面的js动态脚本),所以readHTMLTable函数才有机会提取里面的表格(而这个过程,普通请求器比如RCurl或者httr都没有权限办到!),是不是很腻害呀!

下面这一句只是稍微修复一下编码!

names(tbl) <- names(tbl) %>% stri_conv(from="utf-8") DT::datatable(tbl)

这篇文章对于R语言网络数据抓取而言意义重大,这是我第一次在R里面看到竟然有一个自带请求器的解析器,而且还是调用的plantomjs无头浏览器,专治各种wed端js动态脚本的隐藏数据。

rdom是一个很小众的包,但是它的设计理念有点儿逆天,整个包只有一个函数——rdom,和包名相同,它的工作只有一个,就是按照真实浏览器渲染HTML文档的模式去渲染整个HTML文档。在后台调用plantomjs来处理渲染的过程,之后你可以自由的使用其他R中的高效快捷函数进行元素提取。

项目主页在这里!

https://github.com/cpsievert/rdom

记得在使用前需要下载plantomjs无头浏览器(将浏览器目录添加到环境变量),很小的,不占内存。

http://phantomjs.org/

关于异步加载的逻辑以及为何带有异步加载的网页里,XML包的readHTMLTable函数和rvest包的html_table函数统统对束手无策,项目主页里作者都有提到。

作者从更为专业的角度进行了解释!!!

Web scraping packages such as XML, xml2 and rvest allow you to download and parse HTML files, but they lack a browsing engine to fully render the DOM.

XML和xml2以及rvest包,允许你直接从url地址下载并解析HTML文档,但是它们确少一个中介浏览器引擎来渲染这些HTML源文档!

XML::htmlParse() (and rvest::read_html()) returns the HTML page source,
which is static, and doesn’t contain theelement we desire (because JavaScript is modifying the state of the DOM):

因而,通过这些包请求到的HTML文档整体而言是静态的,它们不包含HTML文档中那些重要的嵌套在script标签内的数据(而这些script标签内的数据通常是由JavaScript脚本来进行操控和修改的)。

The main function in rdom, rdom(), uses phantomjs to render and return the DOM as an HTML string. Instead of passing the entire DOM as a string from
phantomjs to R, you can give rdom() a CSS Selector to extract certain element(s).

rdom包只有一个函数——rdom,它在后台调用phantomjs浏览器来对请求的HTML文档进行渲染,并将渲染后的完整HTML文档返回。(而这个渲染过程现行R中所有请求器都无法办到)。你可以提供给rdom函数一个css路径,来从HTML文档中抽取一部分内容返回。

对R语言数据抓取感兴趣的各位小伙伴儿,这个包绝对能给你带来惊喜,如果你有兴趣,甚至可以阅读它的源码,看大神什么是如何神不知鬼不觉的在底层封装plantomjs无头浏览器来解析动态js脚本的HTML文档的。

希望最近这些小文,能给今后大家学习R语言数据抓取带有更多便利,让大家少走弯路。

在线课程请点击文末原文链接:
往期案例数据请移步本人GitHub:
https://github.com/ljtyduyu/DataWarehouse/tree/master/File

公众号后台回复关键字即可学习

回复&nbs 49 27165 49 13308 0 0 6494 0 0:00:04 0:00:02 0:00:02 6494p;R               R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存