php curl抓取网页数据 这个包绝对值得你用心体验一次!
优采云 发布时间: 2022-06-28 04:08php curl抓取网页数据 这个包绝对值得你用心体验一次!
杜雨,EasyCharts团队成员,R语言中文社区专栏作者,兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化。个人公众号:数据小魔方(微信ID:datamofang),“数据小魔方”创始人。
这一段时间在研究R里面的数据抓取相关包,时不时的能发掘出一些惊喜。
比如今天,我找到了一个自带请求器的解析包,而且还是嵌入的pantomjs无头浏览器,这样就不用你再傻乎乎的再去装个selenium驱动,也不用借助任何请求器(RCurl或者httr)包就可以自动解析带有js脚本的HTML文档。
耳听为虚,眼见为实,还记得之前讲解表格数据抓取的那一节,遇到的天气数据表格,里面的数据拿不到,有些棘手。害得我动用了RSelenium调用了plantomjs才得以解决,但是!
今天讲解的这个包将所有的任务量缩减到一句代码!
library("rvest")
URL% xml2::url_escape(reserved ="][!$&'()*+,;=:/?@#")
大家可以试一试使用普通的请求方法是否可以成功获取里面的表格(要是成功了算我输!!!)
使用RCurl包请求!
header% readHTMLTable(header=TRUE)
$`NULL`
NULL
这是多大仇多大怨啊~_~
使用rvest试一试:
mytable % 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<br />#system("java -jar D:/selenium-server-standalone-3.3.1.jar",intern=FALSE)<br /><br />start_session(root="http://localhost:4444/wd/hub/",browser ="phantomjs")
post.url(URL)
mytable% stri_conv(from="utf-8") %>% read_html() %>% html_table()
quit_session()
这次总算拿到了!数一数写了多少字的代码!
有木有更加快捷的方法呢,当然有啦!
接下来瞪大眼睛看这一款神器!
使用rdom包:
stopifnot(Sys.which("phantomjs") != "")<br />#以上代码检测系统路径中是否含有phantomjs浏览器<br />#如果没有下载过phantomjs浏览器或者下载过但是没有加入系统路径,<br />#记得从新操作一下,否则一下函数无法运行!devtools::install_github("cpsievert/rdom")<br />#安装rdom包(如果总是提示timeout的话,记得加载一下curl包)<br /><br /><br style="font-size: 14px;" />library("rdom")<br />tbl % readHTMLTable(header=TRUE) %>% `[[`(1)
有木有看清楚什么情况,没有,已经完事儿,真的是只有一行代码!
似不似,有点儿惊讶,rdom后台调用了plantomjs浏览器渲染了整个html目标文档(包含里面的所有script标签里面的js动态脚本),所以readHTMLTable函数才有机会提取里面的表格(而这个过程,普通请求器比如RCurl或者httr都没有权限办到!),是不是很腻害呀!
下面这一句只是稍微修复一下编码!
names(tbl) % stri_conv(from="utf-8")
DT::datatable(tbl)
这篇文章对于R语言网络数据抓取而言意义重大,这是我第一次在R里面看到竟然有一个自带请求器的解析器,而且还是调用的plantomjs无头浏览器,专治各种wed端js动态脚本的隐藏数据。
rdom是一个很小众的包,但是它的设计理念有点儿逆天,整个包只有一个函数——rdom,和包名相同,它的工作只有一个,就是按照真实浏览器渲染HTML文档的模式去渲染整个HTML文档。在后台调用plantomjs来处理渲染的过程,之后你可以自由的使用其他R中的高效快捷函数进行元素提取。
项目主页在这里!
记得在使用前需要下载plantomjs无头浏览器(将浏览器目录添加到环境变量),很小的,不占内存。
关于异步加载的逻辑以及为何带有异步加载的网页里,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: