RCurl中這麼多get函數,是不是一直傻傻分不清!!!
你想知道R語言中的RCurl包中一共有幾個get開頭的函數嘛,今天我特意數了一下,大約有十四五個那麼多(保守估計)!
所以如果對這個包了解不太深入的話,遇到複雜的數據爬取需求,自然是摸不著頭腦,心碎一地~_~
實際上很多我們都不常用,常用的不超過五個,而且這些函數命名都很有規律,一般是類似功能的名稱中都有統一的關鍵詞標識,只要理解這些關鍵詞,很好區分,下面我對9個可能用到的get函數簡要做一個分類。
第一類是get請求函數(參數直接寫在URL裡面)
getURL #get請求的一般形式ngetBinaryURL #get請求二進位資源ngetURLContent #get請求(可以根據返回狀態的ContentType決定返回內容是文本格式還是二進位格式,n #所以說它其實就是前兩個函數的結合體,可以根據返回內容類型做智能判斷)ngetURIAsynchronous #這個函數文檔給的解釋是可以實現請求的非同步發送和多並發,需要計算機的cpu支持多核性能,至今尚未嘗試過!n
以下兩個也是get請求函數(參數可以寫在單獨的查詢參數中)
getForm #單獨提交查詢參數的get請求函數ngetFormParams 可以根據帶參數的URL,分解出原始參數對n
容錯與配置句柄函數
getCurlErrorClassNames #排錯函數,可以根據請求錯誤信息得到錯誤類型,方便後期排錯ngetCurlHandle #curl句柄函數(是請求回話維持與進程管理的最重要部分,所有登錄操作、身份認證都都需要該函數的支持)ngetCurlInfo #根據curl句柄的記錄信息,返回各項目信息詳情n
接下來我們逐個嘗試一遍上述函數的用法。
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發送一個完整的請求一般形式是這樣的:
library("RCurl")nlibrary("XML")ndebugInfo <- debugGatherer() #錯誤信息收集函數nheaders<-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")n###curl句柄函數nhandle <- getCurlHandle(n debugfunction = debugInfo$update,n followlocation = TRUE,n cookiefile = "",n verbose = Tn )nnurl<- "https://edu.hellobi.com/"nresponse<-getURL(n url, ###URL地址n #局部配置參數(作用於本次請求)n .opts=list(header=TRUE,httpheader = headers), n curl=handle, ###curl句柄,初始化配置參數(.opts內的聲明的配置參數會覆蓋curl中的默認參數)n .encoding="utf-8" ###編碼參數n )n
請求成功!
以上是getURL的一般形式,當然實際使用時,可以酌情調整參數,通常情況下,無需維持回話的話,curl不需要自己構造,函數會默認幫我們構造以個curl句柄。但是.opts參數使我們在當前請求中實際應用的配置參數信息,需要特別注意。
cat(debugInfo$value()[1]) #伺服器地址及埠號ncat(debugInfo$value()[2]) #伺服器返回的相應頭信息ncat(debugInfo$value()[3]) #返回的請求頭信息n
debugGatherer函數收集的請求與相應信息對於後期的錯誤判斷與bug修復很有價值!
getBinaryURL
二進位資源一般是指網路伺服器上的二進位文件、圖像文件、音視頻等多媒體文件。這些資源通常可以直接通過download函數進行請求下載,但是getBinaryURL函數可以添加更多配置信息,在 請求資源是更加安全。
url<-"https://pic3.zhimg.com/720845d4f960c680039dbf7cc83ec21a_r.jpg"nresponse<-getBinaryURL(url) nwriteBin(response,"720845d4f960c680039dbf7cc83ec21a_r.jpg")n
下載到本地之後,打開正常!
你可以使用%>%管道函數把兩句封裝在一起,使用起來非常方便,比自帶的download函數代碼參數還少。除了圖片之外,csv文件、xlsx文件、pdf文件、音視頻文件都可以下載。
response<-getURLContent("https://pic3.zhimg.com/720845d4f960c680039dbf7cc83ec21a_r.jpg")nresponse<-getURLContent("https://edu.hellobi.com/")nclass(response)n[1] "raw"n[1] "character" n
使用getURLContent請求網頁時,返回的是字元串(未解析的HTML文檔),請求圖片時,反回的是bytes值。不那麼講究的場合,getURLContent可以替代getURL或者getBinaryURL,但是通常為了便於記憶,一般請求網頁使用getURL,請求二進位文件使用getBinaryURL,實際上三個函數僅僅是返回值的差異,通過參數設置的轉換,基本可以相互替代。
getURIAsynchronous函數運行執行多並發任務,具有非同步請求的功能,但是這一塊我還沒有研究透徹,至今尚未涉足,感興趣的小夥伴兒可以自己試一試,將請求URL作為一個多值向量,闖進去就可以了,勇於探索才能學到好玩的東西。
getForm
getForm發送單獨攜帶查詢參數的get請求,這在之前的趣直播數據抓取中已經演示過了。
library("magrittr")nurl<-"http://m.quzhiboapp.com/api/lives/listOrderByPlanTs"nheader=c(n "Accept"="application/json, text/plain, */*",n "User-Agent"="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36"n)ndebugInfo <- debugGatherer() nhandle<-getCurlHandle(debugfunction=debugInfo$update,followlocation=TRUE,cookiefile="",verbose = TRUE)ncontent<-getForm(url,.opts=list(httpheader=header),.params=list("limit"=30),.encoding="utf-8",curl=handle) %>% jsonlite::fromJSON()n###請注意這裡getForm函數與getURL函數的區別n###(多了一個.params參數,它就是用於存放get請求的參數的,getFrom可以提供專門的查詢參數)nhead(content %>% `[[`(2))n
getFormParams
getFormParams函數可以還原URL中的查詢參數。
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"ngetFormParams(url) n
還原結果是一個帶有命名的字元串向量。
getCurlErrorClassNames 函數是一個排錯函數,具體怎麼用我也不知道,目前還沒有用過,感興趣的自己探索!
getCurlHandlegetCurlInfo
getCurlHandle 函數是全局的curl句柄函數,包含所有請求、相應以及本地終端與web伺服器之間的通訊記錄。它用於構建初始化配置函數。它通常與getCurlInfo 搭配使用。
debugInfo <- debugGatherer() n#錯誤信息收集函數nheaders<-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")nhandle <- getCurlHandle(n debugfunction = debugInfo$update,n followlocation = TRUE,n cookiefile = "",n verbose = Tn )nnurl<- "https://edu.hellobi.com/"nresponse<-getURL(url,.opts=list(header=TRUE,httpheader = headers),curl=handle,.encoding="utf-8")n
比如可以通過getCurlInfo 函數獲取handle中的所有信息。
getCurlInfo(handle) %>% names()ncat(getCurlInfo(handle)$effective.url)nhttps://edu.hellobi.com/ncat(getCurlInfo(handle)$response.code)200cat(getCurlInfo(handle)$content.type)ntext/html; charset=UTF-8ncat(getCurlInfo(handle)$cookielist)n.hellobi.com TRUE / FALSE 1511007061 XSRF-TOKEN eyJpdiI6IkRLcndIcW0raVF3aDNkbjJRRVJwTHc9PSIsInZhbHVlIjoiRkFDMWdCdEJ4dGFOYTJBaWV2c3pHZm1IOHZoOW81eisxaFJENzJSRnVGXC9TQnZKTDRjZFQ3NlpicnVoODF3N0U3VTZuNXJHREtYbDR5SDc5YkREMGVnPT0iLCJtYWMiOiIzNWI2OTYyYWNlZmQwMDc1N2Q1Y2I5NTY4NzUxZWIzYWYwZDM0N2MzZmExMzQ1OGJlNDVjNmZiMzEwMWY4MjEwIn0%3D #HttpOnly_.hellobi.com TRUE / FALSE 1511007061 laravel_session eyJpdiI6Ik8zN3NUMjFjN2FRa1dldXZ4REhVTnc9PSIsInZhbHVlIjoiQ29kakpTRjFGdno5c2Y0elpSZWNhVFVpckJWTnRwaENaeHgxSThmOXRDNDU0T0k1djlUV011ZlBEQXV5N2drc3NBOHBzY0FWZEJSRG1ocjNweGpXNnc9PSIsIm1hYyI6IjZjOWRlMmNjMjg3MGM3MTEzZDA0N2M2OTdkNGUwYWM3MzY0N2MwNmJmYmMxZDAzYTllODEzZjQ0YWUzNjA4NjQifQ%3D%3Dn
好了,到這裡,RCurl的幾個重要get函數幾乎都已經講完了,接下來會抽時間整理一下RCurl的中postForm函數的四種常見參數提交方式,以及curl句柄函數配置參數的許可權類型,RCurl這個包經過這些時間的梳理,已經扒的差不多了,以後若是時間允許,可以探索一下RCurl中的並發與非同步請求實現方式。
其實除了RCurl之外,rvest包也有很多好玩的東西,最近的探索發現,rvest本身並不神奇,它作為一個底層請求器httr以及解析器selectr包、xml2包的封裝,整合了這些包的優點,在解析方面大有可為,但是請求功能上很薄弱,它的css解析器實現其實是在內部調用selectr包中的css_to_xpath函數,將css語法轉化為xpath之後才開始解析的,這樣如果你能花些時間學一下xml2httrselectr的話,幾乎可以完全繞過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:https://github.com/ljtyduyu/DataWarehouse/tree/master/File推薦閱讀:
※R語言抓取《歡樂頌2》熱聞
※Learn R | Association Rules of Data Mining(二)
※如何用R語言計算形態坐標矩陣的質心距離?
※【詐屍譯文】R 3.4.0的性能提升
※[譯] 解密 Airbnb 的數據科學部門如何構建知識倉庫