99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀R語言爬蟲之——RCurl
R語言爬蟲之——RCurl
2017-01-13
收藏

R語言爬蟲之——RCurl

RCurl的概述
The RCurl package is an R-interface to the libcurl library that provides HTTP
facilities. This allows us to download files from Web servers, post forms, use
HTTPS (the secure HTTP), use persistent connections, upload files, use binary
content, handle redirects, password authentication, etc.
RCurl這個程序包提供了由R到libcurl庫的接口,從而實現HTTP的一些功能。例如,從
服務器下載文件、保持連接、上傳文件、采用二進制格式讀取、句柄重定向、密碼認證等等。
什么是curl&libcurl
– curl:利用URL語法在命令行方式下工作的開源文件傳輸工具
– curl背后的庫就是libcurl
功能
– 獲得頁面
– 有關認證
– 上傳下載
– 信息搜索
– ……
HTTP協(xié)議
協(xié)議是指計算機通信網絡中兩臺計算機之間進行通信所必須共同遵守的規(guī)定或規(guī)則,超文本傳輸協(xié)議(HTTP)是一種通信協(xié)議,它允許將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器

目前我們使用的是HTTP/1.1 版本
這里寫圖片描述
1. URL詳解
基本格式:schema://host[:port#]/path/…/[?query-string][#anchor]
scheme 指定低層使用的協(xié)議(例如:http, https, ftp)
host HTTP服務器的IP地址或者域名
port# HTTP服務器的默認端口是80,這種情況下端口號可以省略。
path 訪問資源的路徑
query-string 發(fā)送給http服務器的數據
anchor- 錨
2. 請求request
請求行、請求報頭、消息正文
這里寫圖片描述
Method 表示請求方法,比如“GET”,“POST”,““HEAD”,”PUT“等
Path-to-resource 表示請求的資源
Http/version-number 表示HTTP協(xié)議的版本號
請求報頭
? Host 服務器地址
? Accept 瀏覽器端可以接受的媒體類型,text/html
? Accept-encoding 瀏覽器接收的編碼方法,通常所指的是壓縮方法
? Accept-language 瀏覽器聲明自己接收的語言
? User-agent 告訴服務器客戶端的操作系統(tǒng)、瀏覽器版本
? Cookie 最重要的請求報頭的成分,為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)
? Referer 跳轉頁
? Connection 客戶端與服務器的連接狀態(tài)
3. 響應response
狀態(tài)行、消息報頭、響應正文
這里寫圖片描述
HTTP/version-number表示HTTP協(xié)議的版本號
status-code 和message表示狀態(tài)碼以及狀態(tài)信息
status-code(狀態(tài)碼)
? 狀態(tài)碼用來告訴HTTP客戶端,HTTP服務器是否產生了預期的Response.
? HTTP/1.1中定義了5類狀態(tài)碼, 狀態(tài)碼由三位數字組成,第一個數字定義了響應的類

– 1XX 提示信息 - 表示請求已被成功接收,繼續(xù)處理
– 2XX 成功 - 表示請求已被成功接收,理解,接受
– 3XX 重定向 - 要完成請求必須進行更進一步的處理
– 4XX 客戶端錯誤 - 請求有語法錯誤或請求無法實現
– 5XX 服務器端錯誤 - 服務器未能實現合法的請求
消息報頭
? Server 服務器的軟件信息,如nginx
? Date 響應日期
? Last-Modified 上次修改時間
? Content-type 服務器告訴瀏覽器自己響應的對象類型,text/html
? Connection 服務器和客戶端是否保持鏈接
? X-Powered-By 表示網站是什么技術開發(fā)的,如PHP
? Content-Length 請求返回的字節(jié)長度
? Set-Cookie 響應最重要的一個header,用于把cookie發(fā)給相應的瀏覽器,每一個寫入cookie都會生成一個set-cookie
RCurl三大函數
getURL()
getForm()
postForm()
getURL()
# 判斷url是否存在
url.exists(url="www.baidu.com") # 判斷url是否存在
# [1] TRUE
d <- debugGatherer() #收集調試信息
# verbose = TRUE 這時候,d$value()值是會疊加的
tmp <- getURL(url="www.baidu.com", debugfunction = d$update, verbose = TRUE)  

names(d$value())
# [1] "text"       "headerIn"   "headerOut"  "dataIn"     "dataOut"    "sslDataIn"  "sslDataOut"

cat(d$value()[1]) #服務器地址及端口號
cat(d$value()[2]) #服務器返回的頭信息
cat(d$value()[3]) #提交給服務器的頭信息
d$reset() # 清除d$value()
d$value() # 清除之后全部為空
# text   headerIn  headerOut  dataIn    dataOut  sslDataIn sslDataOut
# ""         ""         ""         ""         ""         ""         ""
# 查看服務器返回的頭信息
## 列表形式
h <- basicHeaderGatherer()
txt <- getURL(url="http://www.baidu.com", headerfunction = h$update)
names(h$value())
# [1] "Date"           "Content-Type"   "Content-Length" "Last-Modified"  "Connection"    
# [6] "Vary"           "Set-Cookie"     "Set-Cookie"     "Set-Cookie"     "P3P"           
# [11] "Server"         "Pragma"         "Cache-control"  "BDPAGETYPE"     "BDQID"         
# [16] "BDUSERID"       "Accept-Ranges"  "status"         "statusMessage"
h$value()
# 查看服務器返回的頭信息
## 字符串形式
h <- basicTextGatherer()
txt <- getURL("http://www.baidu.com", headerfunction = h$update)
names(h$value())
# NULL # 說明是字符串形式,沒有列
h$value() # 所有的內容只是一個字符串
# [1] "HTTP/1.1 200 OK\r\nDate: Mon, 23 Feb 2015 15:18:28 GMT\r\nContent-Type: text/html\r\nContent-Length: 14613\r\nLast-Modified: Wed, 03 Sep 2014 02:48:32 GMT\r\nConnection: Keep-Alive\r\nVary: Accept-Encoding\r\nSet-Cookie: BAIDUID=FFF680C9F9631969198A77AAFF56096E:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\r\nSet-Cookie: BAIDUPSID=FFF680C9F9631969198A77AAFF56096E; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\r\nSet-Cookie: BDSVRTM=0; path=/\r\nP3P: CP=\" OTI DSP COR IVA OUR IND COM \"\r\nServer: BWS/1.1\r\nPragma: no-cache\r\nCache-control: no-cache\r\nBDPAGETYPE: 1\r\nBDQID: 0xc1ae773200820725\r\nBDUSERID: 0\r\nAccept-Ranges: bytes\r\n\r\n"

cat(h$value()) # 用cat顯示的,會比較好看
HTTP/1.1 200 OK
Date: Mon, 23 Feb 2015 15:18:28 GMT
Content-Type: text/html
Content-Length: 14613
Last-Modified: Wed, 03 Sep 2014 02:48:32 GMT
Connection: Keep-Alive
Vary: Accept-Encoding
Set-Cookie: BAIDUID=FFF680C9F9631969198A77AAFF56096E:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUPSID=FFF680C9F9631969198A77AAFF56096E; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
  P3P: CP=" OTI DSP COR IVA OUR IND COM "
Server: BWS/1.1
Pragma: no-cache
Cache-control: no-cache
BDPAGETYPE: 1
BDQID: 0xc1ae773200820725
BDUSERID: 0
Accept-Ranges: bytes
# 查看url請求的訪問信息
curl <- getCurlHandle()

txt <- getURL(url="http://www.baidu.com", curl = curl)
names(getCurlInfo(curl))
[1] "effective.url"           "response.code"           "total.time"             
[4] "namelookup.time"         "connect.time"            "pretransfer.time"       
[7] "size.upload"             "size.download"           "speed.download"         
[10] "speed.upload"            "header.size"             "request.size"           
[13] "ssl.verifyresult"        "filetime"                "content.length.download"
[16] "content.length.upload"   "starttransfer.time"      "content.type"           
[19] "redirect.time"           "redirect.count"          "private"                
[22] "http.connectcode"        "httpauth.avail"          "proxyauth.avail"        
[25] "os.errno"                "num.connects"            "ssl.engines"            
[28] "cookielist"              "lastsocket"              "ftp.entry.path"         
[31] "redirect.url"            "primary.ip"              "appconnect.time"        
[34] "certinfo"                "condition.unmet"
getCurlInfo(curl)$response.code
# [1] 200
getCurlInfo(curl=curl)
$effective.url
[1] "http://www.baidu.com"

$response.code
[1] 200

$total.time
[1] 0.041523

$namelookup.time
[1] 0.011336
……
設置自己的header
# 設置自己的header,把系統(tǒng)設置成ihpone的系統(tǒng)Mac OS
myheader <- c(
  "User-Agent"="Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0_1 like Mac OS X; ja-jp) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A306 Safari/6531.22.7",
  "Accept"="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
  "Accept-Language"="en-us",
  "Connection"="keep-alive",
  "Accept-Charset"="GB2312,utf-8;q=0.7,*;q=0.7"
)

d <- debugGatherer()
tmp <- getURL(url = "http://www.baidu.com", httpheader = myheader, debugfunction = d$update, verbose = T)

cat(d$value()[3]) # 提交給服務器的頭信息,發(fā)現設置成功
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0_1 like Mac OS X; ja-jp) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A306 Safari/6531.22.7
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us
Connection: keep-alive
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
設置其他參數
verbose 輸出訪問的交互信息
httpheader 設置訪問信息報頭
.encoding=”UTF-8” “GBK”
debugfunction, headerfunction, curl
.params 提交的參數組
dirlistonly 僅讀目錄,這個在ftp的網頁,非常好用
followlocation 支持重定向
maxredirs 最大重定向次數
# 設置其他參數,共174個參數
listCurlOptions()
  [1] "address.scope"              "append"                    
  [3] "autoreferer"                "buffersize"                
  [5] "cainfo"                     "capath"                    
  [7] "certinfo"                   "closepolicy"  
  ……
  ……
  [165] "url"                        "useragent"                 
[167] "username"                   "userpwd"                   
[169] "use.ssl"                    "verbose"                   
[171] "writedata"                  "writefunction"             
[173] "writeheader"                "writeinfo"
getForm()
# getForm()函數

# 在百度里面搜索“rcurl”的url為(瀏覽器為google chrome):
url <- c("http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&ch=&tn=SE_hldp02870_0v135xhf&bar=&wd=rcurl&rsv_spt=1&rsv_pq=a3ed162a0088df8f&rsv_t=43d18gWNyd6HWpqDiKov7Dm548s4HY4cgcJlXc8ujpzRW9Okec2aOb5screzftZo5DJ60Cp7aILvRK2Q&rsv_enter=1&inputT=2119")
# wd=rcurl 這里就是關鍵字為rcurl

getFormParams(query=url) # 查看url的結構和值
names(getFormParams(query=url))
[1] "ie"        "f"         "rsv_bp"    "rsv_idx"   "ch"        "tn"        "bar"       "wd"        "rsv_spt"  
[10] "rsv_pq"    "rsv_t"     "rsv_enter" "inputT"   

tmp <- getForm(uri="http://www.baidu.com/s", ie="utf-8", f="8", rsv_bp="1", rsv_idx="2", ch="", tn="SE_hldp02870_0v135xhf", bar="", wd="rcurl", rsv_spt="1", rsv_pq="a3ed162a0088df8f", rsv_t="43d18gWNyd6HWpqDiKov7Dm548s4HY4cgcJlXc8ujpzRW9Okec2aOb5screzftZo5DJ60Cp7aILvRK2Q", rsv_enter="1", inputT="2119")

# 這里的getForm函數不穩(wěn)定(原因還不知道),有時候運行2到3次,才能真正找到頁面
# 出來的錯誤的結果,爬取的頁面為:
[1] "<html><body><script type=\"text/javascript\">function d(a,n){var c=a.length,b=a[c-1];if(n&&n!='JSSESSID'){for(var i=c-2;i>=0;i--){b=a[i]+'.'+b;document.cookie=n+'=; domain='+b+'; expires=Mon,01-Jan-1973 00:00:01 GMT';}}}(function (){var a=document.cookie.split('; ');for(var i=0;i<a.length;i++){d(location.hostname.split('.'),a[i].split('=')[0])}})();(function(u){if(window.navigate&&typeof navigate=='function')navigate(u);var ua=navigator.userAgent;if(ua.match(/applewebkit/i)){var h = document.createElement('a');h.rel='noreferrer';h.href=u;document.body.appendChild(h);var evt=document.createEvent('MouseEvents');evt.initEvent('click', true,true);h.dispatchEvent(evt);}else{document.write('<meta http-equiv=\"Refresh\" Content=\"0; Url='+u+'\" >');}})('http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&ch=&tn=SE_hldp01272_4chwhad3&bar=&wd=rcurl&rsv_spt=1&rsv_pq=a3ed162a0088df8f&rsv_t=43d18gWNyd6HWpqDiKov7Dm548s4HY4cgcJlXc8ujpzRW9Okec2aOb5screzftZo5DJ60Cp7aILvRK2Q&rsv_enter=1&inputT=2119');</script></body></html>"
attr(,"Content-Type")

"text/html"
postForm()
以保密的形式上傳我們所要頁面提交的信息,然后獲取服務器端返回該頁面信息。例如登陸一個頁面,需要賬戶和密碼,那么我們需要提交賬戶和密碼,提交的信息要加密,然后抓取登陸后的頁面信息。數據分析培訓
getBinaryURL()
# getBinaryURL() 下載一個文件
url <- "http://rfunction.com/code/1201/120103.R"
tmp <- getBinaryURL(url)
note <- file("120103.R", open = "wb")
writeBin(tmp, note)
close(note)
# getBinaryURL() 批量下載文件
url <- "http://rfunction.com/code/1202/"
tmp <- RCurl::getURL(url, httpheader = myheader) # 獲取網頁

tmp_files <- strsplit(x=tmp, split="<li><a href=\"")[[1]]
tmp_files1 <- strsplit(tmp_files, split="\"")
tmp_files2 <- lapply(X=tmp_files1, function(file) {file[1]})
files <- unlist(tmp_files2)
files <- files[c(-1, -2)]

baseURL <- "http://rfunction.com/code/1202/"
for(i in 1:length(files)){
  fullURL <- paste(baseURL, files[i], sep = "")
  tmp <- getBinaryURL(fullURL)
  note <- file(paste("1202-", files[i], sep = ""), open = "wb")
  writeBin(tmp, note)
  close(note)

  Sys.sleep(2) # 休眠2秒
}
XML
# XML簡介
# 缺點:在windows下對中文支持不理想(我在ubuntu下也不理想)
library(XML)
url <- "http://data.earthquake.cn/datashare/datashare_more_quickdata_new.jsp" # 中文界面,抓出來是亂碼
url <- "http://219.143.71.11/wdc4seis@bj/earthquakes/csn_quakes_p001.jsp" # 英文界面,抓出來是對的
wp <- getURL(url)
doc <-htmlParse(wp, asText = TRUE) # 這里切記encoding  
tables <- readHTMLTable(doc, header=F, which = 2)
# 選取第二個表
head(tables)
                    V1      V2       V3        V4    V5                               V6
1      Origin time(CST) Lat(°) Long(°) Depth(km)   Mag                           Region
2 2012/01/08 14:20:08.0   42.10    87.50       7.0 M 5.0         NORTHERN XINJIANG, CHINA
3 2012/01/01 13:27:55.5   31.40   138.30     360.0 M 7.0       SOUTHEAST OF HONSHU, JAPAN
4 2011/12/27 23:21:58.5   51.80    95.90      10.0 M 7.0     SOUTHWESTERN SIBERIA, RUSSIA
5 2011/12/14 13:04:56.2   -7.50   146.80     120.0 M 7.2  EASTERN NEW GUINEA REG., P.N.G.
6 2011/12/12 09:42:34.0   39.60   118.20       5.0 M 3.2               NORTHEASTERN CHINA
解析xml文件的XPath設置
? 斜杠(/)作為路徑內部的分割符
? /:表示選擇根節(jié)點
? //:表示選擇任意位置的某個節(jié)點
? @: 表示選擇某個屬性
? *表示匹配任何元素節(jié)點
? @*表示匹配任何屬性值
? node()表示匹配任何類型的節(jié)點

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調用 initGeetest 進行初始化 // 參數1:配置參數 // 參數2:回調,回調的第一個參數驗證碼對象,之后可以使用它調用相應的接口 initGeetest({ // 以下 4 個配置參數為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產品形式,包括:float,popup width: "280px", https: true // 更多配置參數說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }