溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

R語(yǔ)言網(wǎng)絡(luò)數(shù)據(jù)抓取難題的示例分析

發(fā)布時(shí)間:2021-11-22 09:29:27 來(lái)源:億速云 閱讀:205 作者:柒染 欄目:大數(shù)據(jù)

這篇文章給大家介紹R語(yǔ)言網(wǎng)絡(luò)數(shù)據(jù)抓取難題的示例分析,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

單純從數(shù)據(jù)抓取的邏輯來(lái)講(不談那些工程上的可用框架),個(gè)人覺得R語(yǔ)言中現(xiàn)有的請(qǐng)求庫(kù)中,RCurl和httr完全可以對(duì)標(biāo)Python中的urllib和reuqests(當(dāng)然py中在錯(cuò)誤處理和解析框架上顯得更為專業(yè)!)。

我們經(jīng)常使用的網(wǎng)絡(luò)數(shù)據(jù)抓取需求,無(wú)非兩種:

  • 要么偽造瀏覽器請(qǐng)求
    要么驅(qū)動(dòng)瀏覽器請(qǐng)求

對(duì)于偽造瀏覽器請(qǐng)求而言,雖然請(qǐng)求定義里有諸多類型,但是實(shí)際上爬蟲用到的無(wú)非就是GET請(qǐng)求和POST請(qǐng)求。

而驅(qū)動(dòng)瀏覽器就幾乎沒有什么門檻了,所見即所得,R語(yǔ)言中的RSelenium/Rwebdriver和Python中的Selenium都可以完成(配置比較麻煩一些)。

實(shí)習(xí)僧招聘網(wǎng)爬蟲數(shù)據(jù)可視化

GET請(qǐng)求的參數(shù)允許寫在URL里,但是通常參數(shù)較多的情況下,直接拼url顯得非常不優(yōu)雅,而RCurl,httr都提供了可選的GET請(qǐng)求提交方式。在RCurl里,getURL通常用來(lái)完成不含參數(shù)的GET請(qǐng)求(或者參數(shù)直接拼在了URL里),而getForm()函數(shù)通常用來(lái)完成含有參數(shù)的GET請(qǐng)求。(參數(shù)寫在param參數(shù)體中)。

左右用R右手Pyhon系列——趣直播課程抓取實(shí)戰(zhàn)

R語(yǔ)言爬蟲實(shí)戰(zhàn)——知乎live課程數(shù)據(jù)爬取實(shí)戰(zhàn)

httr中的GET函數(shù)同樣完成GET請(qǐng)求,query參數(shù)作為指定的請(qǐng)求參數(shù)提交方式(同樣可以選擇寫在URL里)。

針對(duì)POST請(qǐng)求而言,作為API的普遍請(qǐng)求方式(也有一部分API是通過(guò)GET請(qǐng)求發(fā)送的),POST請(qǐng)求灰常復(fù)雜,它的查詢參數(shù)必須含在請(qǐng)求體(body)中,而且參數(shù)發(fā)送前需要做指定的編碼方式(就是request header中的content-type)。

長(zhǎng)見的編碼方式有4種:

  • application/x-www-form-urlencoded

  • application/json

  • multipart/form-data

  • text/xml

如果你想深入理解這四種方式,可以參考以下兩篇文章,或者去看專業(yè)的http協(xié)議與瀏覽器相關(guān)內(nèi)容。

http://www.cnblogs.com/111testing/p/6079565.html
https://bbs.125.la/thread-13743350-1-1.html

以上四種參數(shù),我只實(shí)踐過(guò)前兩種,第三種需要上傳文件,暫未遇到,第四種很少見。在RCurl包的POST函數(shù)中,只針對(duì)第一種、第三種做了顯式的參數(shù)聲明
style=httppost、post,但是第二種、第四種style參數(shù)中沒有列舉到。而httr在參數(shù)處理上顯得非常友好,直接指定了以上常見的四種方式:

R語(yǔ)言網(wǎng)絡(luò)數(shù)據(jù)抓取難題的示例分析

左手用R右手Python系列——模擬登陸教務(wù)系統(tǒng)

R語(yǔ)言爬蟲實(shí)戰(zhàn)——網(wǎng)易云課堂數(shù)據(jù)分析課程板塊數(shù)據(jù)爬取

要知道如今web前端中,使用json作為數(shù)據(jù)包返回的api是在是太普遍了,這個(gè)問(wèn)題一直困擾著我,甚至一度認(rèn)為RCurl包的POST方法不支持上傳json參數(shù)(可是RCurl是直接對(duì)接liburl這個(gè)通用的爬蟲C語(yǔ)言庫(kù)的,urllib也是,httr底層是用了RCurl的,httr能做到的RCurl自然不在話下)。

一定是作者把上傳json參數(shù)的方式隱藏了起來(lái),或者是還沒有來(lái)得及封裝成高級(jí)函數(shù),放在了底層,否則解釋不通。直到今天,瀏覽了linkedlin上面的一個(gè)大神寫的小品文,突然靈光乍現(xiàn),趕緊一試,果然成功了!驗(yàn)證了之前的想法,可能RCurl剛出道的時(shí)候,json還沒有成主流吧,所以json傳參沒有明顯的放在style這個(gè)POST方法的參數(shù)里。而httr包則很討巧的把所有POST參數(shù)的編碼方式都聲明了(哈德利大神就是快人一步,造福人類)。

http://www.linkedin.com/pulse/web-data-acquisition-structure-rcurl-request-part-2-roberto-palloni

以下是寫作本篇推送的目地,把利用RCurl包構(gòu)造POST請(qǐng)求,以及提交json字符串參數(shù)的案例及代碼分享給大家。RCurl庫(kù)與httr相比,偏底層,函數(shù)多且繁瑣,httr更靈巧、輕便、簡(jiǎn)潔。這種關(guān)系,像極了Python中的urllib和request。

構(gòu)建報(bào)頭和查詢參數(shù):

library("RCurl")
library("jsonlite")
library("magrittr") headers<-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",  "Content-Type"="application/json;charset=UTF-8",  "Origin"="http://study.163.com",  "edu-script-token"="3de0ac05e45a4c9693f2a3605fbfaede") Cookies<- 'EDUWEBDEVICE=0e88ed7a9b8b4fc4bfc615e251aa8863; _ntes_nnid=833311d30eccaa9f26425affae2cfef1,1509630974190; _ntes_nuid=833311d30eccaa9f26425affae2cfef1; STUDY_CP_ENTRANCE_CLOSE=1; STUDY_MIND_TELBIND_CLOSE=1; promTips=1; NTESSTUDYSI=3de0ac05e45a4c9693f2a3605fbfaede; STUDY_INFO=oP4xHuM9V1uY_TRID1ZzHOm5mkJY|6|12769628|1510452481337; STUDY_SESS="ryW1kbDYUPDpeexx7xnRK3cGH1nUulhhGJ9D1qIzrgCuSgHl96KRz9xVAwMO6jui9A7L4BJ6hUaaPXVtLf+pWBMHJEw6UtuJtXPjl2yhevq6wVYQtAaJ+N+2maA3kITUrUnNZE+nE0TmYBoQFSEgOKEjUu22o4FQQjD/GeyPrqJsX8TS4muhOF/kd9duGihHABYarJu/gx1XyYYhTqa89g=="; STUDY_PERSIST="8e2epkzTa+8Xy6agY2FPkUzktd9F+8CZ1rZxShzQSSRJ6RbRK2pSzoTqPic7hOB7dYsCtyfpIAD9Ue4S1oRerMBML+fd8iksmANh7THsUTBAXY6WM4kHXJFcNuERKuWuDeHOMilu1y+7T3/a7Jav0QPXrTaWx6YerFKJia2+3rEucY6CQ9waCFR9bhYObYkE6X9kJ71ahCvMYtkr9eXcE6s1rFdKOIgMEtQwxl1Jb8oli9XIBhsosLWHLIUZIfzGwHfmjuVpkfHAfiCIxUJfLiv82sP6EP+Q6n6O/pIeGx0="; STUDY_MIND_TELBIND=1; NETEASE_WDA_UID=12769628#|#1451204764916; NTES_STUDY_YUNXIN_ACCID=s-12769628; NTES_STUDY_YUNXIN_TOKEN=da46d92b7a9504736f2534ed1d366296; STUDY_NOT_SHOW_PROMOTION_WIN=true; utm="eyJjIjoiIiwiY3QiOiIiLCJpIjoiIiwibSI6IiIsInMiOiIiLCJ0IjoiIn0=|aHR0cDovL3N0dWR5LjE2My5jb20vY291cnNlcy1zZWFyY2g/a2V5d29yZD0lRTUlODglOTglRTUlODclQUY="; __utma=129633230.621520113.1509630968.1510452483.1510452504.13; __utmb=129633230.12.9.1510455608393; __utmc=129633230; __utmz=129633230.1509630968.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)'headers['Cookie']<-Cookies Payloads=list(
       "pageIndex"=1,
       "pageSize"=50,
       "relativeOffset"=0,
       "frontCategoryId"="400000000158033",       "searchTimeType"=-1,
       "orderType"=0,
       "priceType"=-1,
       "activityId"=0        )

構(gòu)建自動(dòng)抓取函數(shù):

GetCourses<-function(url,header=headers,Payload=Payloads){
    fullinfo <- data.frame()
    d <- debugGatherer()
    handle <- getCurlHandle(debugfunction=d$update,followlocation=TRUE,cookiefile="",verbose = TRUE)
   for (i in 1:17){        Payload[['pageIndex']]=i        Payload[['relativeOffset']]=50*i-50        tryCatch({        content  <- postForm(url,.opts=list(postfields=toJSON(Payload,auto_unbox=TRUE),httpheader=header),.encoding="utf-8",curl=handle)
       ###通過(guò)將post需求提交的參數(shù)編碼為json字串,封裝在postForm函數(shù)的配置參數(shù).opts中,完成json查詢參數(shù)的傳遞!,
###竟然不寫在style里,搞得人暈頭轉(zhuǎn)向的!注意使用toJSON序列化的時(shí)候,auto_unbox要設(shè)置為TRUE,否則默認(rèn)為TRUE,單值都會(huì)被包括成列表!        response <- content  %>% fromJSON() %>% `[[`(3) %>% `[[`(2)        fullinfo <- response %>% rbind(fullinfo,.)          cat(sprintf("第【%d】頁(yè)已抓取完畢!",i),sep = "\n")        },error = function(e){        cat(sprintf("第【%d】頁(yè)抓取失敗!",i),sep = "\n")        })        Sys.sleep(runif(1))    }    cat("all page is OK!!!")
   return (fullinfo) }
#運(yùn)行函數(shù)
url<-'http://study.163.com/p/search/studycourse.json'
myresult<- GetCourses(url)

R語(yǔ)言網(wǎng)絡(luò)數(shù)據(jù)抓取難題的示例分析

#預(yù)覽數(shù)據(jù)
DT::datatable(myresult)

R語(yǔ)言網(wǎng)絡(luò)數(shù)據(jù)抓取難題的示例分析

至此,R語(yǔ)言中的兩大數(shù)據(jù)抓取神器(請(qǐng)求庫(kù)),RCurl+httr,針對(duì)主流的GET請(qǐng)求、POST請(qǐng)求(常用的)都已經(jīng)完成探索和案例輸出。

備注:以上header中的cookie是防止請(qǐng)求被瀏覽器屏蔽,edu-script-token參數(shù)是進(jìn)程的token,你可以理解為類似秘鑰的東西,所以如果想要實(shí)踐本篇內(nèi)容,以上兩個(gè)參數(shù)需要你從自己的Chrome中提取,直接運(yùn)行本篇代碼估計(jì)不大可能出數(shù)據(jù)!

關(guān)于R語(yǔ)言網(wǎng)絡(luò)數(shù)據(jù)抓取難題的示例分析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI