你想知道R语言中的RCurl包中一共有几个get开头的函数嘛,今天我特意数了一下,大约有十四五个那么多(保守估计)!
所以如果对这个包了解不太深入的话,遇到复杂的数据爬取需求,自然是摸不着头脑,心碎一地_
实际上很多我们都不常用,常用的不超过五个,而且这些函数命名都很有规律,一般是类似功能的名称中都有统一的关键词标识,只要理解这些关键词,很好区分,下面我对9个可能用到的get函数简要做一个分类。
第一类是get请求函数(参数直接写在URL里面)
1 | 复制代码getURL #get请求的一般形式 |
以下两个也是get请求函数(参数可以写在单独的查询参数中)
1 | 复制代码getForm #单独提交查询参数的get请求函数 |
容错与配置句柄函数
1 | 复制代码getCurlErrorClassNames #排错函数,可以根据请求错误信息得到错误类型,方便后期排错 |
接下来我们逐个尝试一遍上述函数的用法。
getURL
getURL函数是一个基础get请求函数,其核心参数主要有URL、.opt、curl、.encoding。
- URL就是请求的对应网址链接。
- curl参数是一个句柄函数,它的参数指定对象是一个内嵌函数,通常是curl = getCurlHandle(),getCurlHandle()函数内同样是配置信息,不过curl句柄函数内的所有配置信息是可以提供给全局使用的,多次携带,维持整个回话状态,相对于一组初始化参数,而.opt参数内的各项配置信息是当前get请求使用的,它会覆盖和修改curl句柄函数内的初始化信息(当没有提供.opt参数时,get请求仍然使用curl中的初始化参数。)
- .opt是一个配置参数,它就收一组带有命名的list参数,这些通常包括httpheader、proxy、timeout、verbose、cookiefile(cookiejar)等配置信息。
- .encoding是字符集编码,这个通常可以通过请求的相应头ContType获取。
使用getURL发送一个完整的请求一般形式是这样的:
1 | 复制代码library("RCurl") |
请求成功!
以上是getURL的一般形式,当然实际使用时,可以酌情调整参数,通常情况下,无需维持回话的话,curl不需要自己构造,函数会默认帮我们构造以个curl句柄。但是.opts参数使我们在当前请求中实际应用的配置参数信息,需要特别注意。
1 | 复制代码cat(debugInfo$value()[1]) #服务器地址及端口号 |
)
)
debugGatherer函数收集的请求与相应信息对于后期的错误判断与bug修复很有价值!
getBinaryURL
二进制资源一般是指网络服务器上的二进制文件、图像文件、音视频等多媒体文件。这些资源通常可以直接通过download函数进行请求下载,但是getBinaryURL函数可以添加更多配置信息,在 请求资源是更加安全。
1 | 复制代码url<-"https://pic3.zhimg.com/720845d4f960c680039dbf7cc83ec21a_r.jpg" |
下载到本地之后,打开正常!
你可以使用%>%管道函数把两句封装在一起,使用起来非常方便,比自带的download函数代码参数还少。除了图片之外,csv文件、xlsx文件、pdf文件、音视频文件都可以下载。
1 | 复制代码response<-getURLContent("https://pic3.zhimg.com/720845d4f960c680039dbf7cc83ec21a_r.jpg") |
使用getURLContent请求网页时,返回的是字符串(未解析的HTML文档),请求图片时,反回的是bytes值。不那么讲究的场合,getURLContent可以替代getURL或者getBinaryURL,但是通常为了便于记忆,一般请求网页使用getURL,请求二进制文件使用getBinaryURL,实际上三个函数仅仅是返回值的差异,通过参数设置的转换,基本可以相互替代。
getURIAsynchronous函数运行执行多并发任务,具有异步请求的功能,但是这一块我还没有研究透彻,至今尚未涉足,感兴趣的小伙伴儿可以自己试一试,将请求URL作为一个多值向量,闯进去就可以了,勇于探索才能学到好玩的东西。
getForm
getForm发送单独携带查询参数的get请求,这在之前的趣直播数据抓取中已经演示过了。
1 | 复制代码library("magrittr") |
getFormParams
getFormParams函数可以还原URL中的查询参数。
1 | 复制代码url<-"https://www.baidu.com/s?wd=writeBin&rsv_spt=1&rsv_iqid=0xe52332670003a3de&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&rsv_t=222fgx%2FjxyaSTATqTxa8ljEv1u8i5TvyENqvcB1Ku1QcP3ZUR2pqIQ2sntZFOTlA4NJx&oq=writeBin%2520%25E4%25B8%258B%25E8%25BD%25BD%25E5%259B%25BE%25E7%2589%2587&inputT=1300&rsv_sug3=13&rsv_pq=e9db342c0003c543&rsv_sug1=6&rsv_sug7=100&rsv_sug2=0&rsv_sug4=1940&rsv_sug=1" |
还原结果是一个带有命名的字符串向量。
getCurlErrorClassNames 函数是一个排错函数,具体怎么用我也不知道,目前还没有用过,感兴趣的自己探索!
getCurlHandle\getCurlInfo
getCurlHandle 函数是全局的curl句柄函数,包含所有请求、相应以及本地终端与web服务器之间的通讯记录。它用于构建初始化配置函数。它通常与getCurlInfo 搭配使用。
1 | 复制代码debugInfo <- debugGatherer() |
比如可以通过getCurlInfo 函数获取handle中的所有信息。
1 | 复制代码getCurlInfo(handle) %>% names() |
好了,到这里,RCurl的几个重要get函数几乎都已经讲完了,接下来会抽时间整理一下RCurl的中postForm函数的四种常见参数提交方式,以及curl句柄函数配置参数的权限类型,RCurl这个包经过这些时间的梳理,已经扒的差不多了,以后若是时间允许,可以探索一下RCurl中的并发与异步请求实现方式。
其实除了RCurl之外,rvest包也有很多好玩的东西,最近的探索发现,rvest本身并不神奇,它作为一个底层请求器httr以及解析器selectr包、xml2包的封装,整合了这些包的优点,在解析方面大有可为,但是请求功能上很薄弱,它的css解析器实现其实是在内部调用selectr包中的css_to_xpath函数,将css语法转化为xpath之后才开始解析的,这样如果你能花些时间学一下xml2\httr\selectr的话,几乎可以完全绕过rvest包,自己灵活构建请求与解析函数了,这三个包文档都很少(httr稍多一些!)。
还计划想写一篇关于R爬虫与Python对比的文章,R语言与Python在很多领域一直相爱相杀,Python的DataFrame貌似参考了R里面的data.frame,并且移至了R语言中的ggplot2,而R语言中,哈德利写的xml2包是由BeautifulSoup激发的的灵感,rvest包的初衷参照requests的框架,以后没事儿多八卦一些R语言与Python背后的故事,感觉蛮好玩的!
在线课程请点击文末原文链接:
Hellobi Live | 9月12日 R语言可视化在商务场景中的应用
往期案例数据请移步本人GitHub:
github.com/ljtyduyu/Da…
本文转载自: 掘金