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

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


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


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

3901436-99be522c0a5cd5ae.png

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

 
 

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


使用RCurl包请求!

 
 

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


使用rvest试一试:

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

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

使用selenium驱动浏览器

 
 



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

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

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


使用rdom包:

3901436-8bc4cb9a6acf58e0

3901436-69e168386e91c7d6.png


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


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


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

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

3901436-913933ef6b33e8c6.png

3901436-75bee163622ed166.png


这篇文章对于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语言数据抓取带有更多便利,让大家少走弯路。


本文作者: 天善智能社区杜雨 数据小魔方


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值