纯挚从数据抓取的逻辑来讲(不谈那些工程上的可用框架),个人以为R措辞中现有的要求库中,RCurl和httr完备可以对标Python中的urllib和reuqests(当然py中在缺点处理和解析框架上显得更为专业!
)。
我们常常利用的网络数据抓取需求,无非两种:
要么假造浏览器要求

要么驱动浏览器要求
对付假造浏览器要求而言,虽然要求定义里有诸多类型,但是实际上爬虫用到的无非便是GET要乞降POST要求。
而驱动浏览器就险些没有什么门槛了,所见即所得,R措辞中的RSelenium/Rwebdriver和Python中的Selenium都可以完成(配置比较麻烦一些)。
演习僧招聘网爬虫数据可视化
GET要求的参数许可写在URL里,但是常日参数较多的情形下,直接拼url显得非常不优雅,而RCurl,httr都供应了可选的GET要求提交办法。在RCurl里,getURL常日用来完成不含参数的GET要求(或者参数直接拼在了URL里),而getForm()函数常日用来完成含有参数的GET要求。(参数写在param参数体中)。
旁边用R右手Pyhon系列——趣直播课程抓取实战
R措辞爬虫实战——知乎live课程数据爬取实战
httr中的GET函数同样完成GET要求,query参数作为指定的要求参数提交办法(同样可以选择写在URL里)。
针对POST要求而言,作为API的普遍要求办法(也有一部分API是通过GET要求发送的),POST要求灰常繁芜,它的查询参数必须含在要求体(body)中,而且参数发送前须要做指定的编码办法(便是request header中的content-type)。
长见的编码办法有4种:
application/x-www-form-urlencoded
application/json
multipart/form-data
text/xml
如果你想深入理解这四种办法,可以参考以下两篇文章,或者去看专业的http协议与浏览器干系内容。
http://www.cnblogs.com/111testing/p/6079565.html
https://bbs.125.la/thread-13743350-1-1.html
以上四种参数,我只实践过前两种,第三种须要上传文件,暂未碰着,第四种很少见。在RCurl包的POST函数中,只针对第一种、第三种做了显式的参数声明
style=httppost、post,但是第二种、第四种style参数中没有列举到。而httr在参数处理上显得非常友好,直接指定了以上常见的四种办法:
左手用R右手Python系列——仿照上岸教务系统
R措辞爬虫实战——网易云教室数据剖析课程板块数据爬取
要知道如今web前端中,利用json作为数据包返回的api是在是太普遍了,这个问题一贯困扰着我,乃至一度认为RCurl包的POST方法不支持上传json参数(可是RCurl是直接对接liburl这个通用的爬虫C措辞库的,urllib也是,httr底层是用了RCurl的,httr能做到的RCurl自然不在话下)。
一定是作者把上传json参数的办法隐蔽了起来,或者是还没有来得及封装成高等函数,放在了底层,否则阐明不通。直到本日,浏览了linkedlin上面的一个大神写的小品文,溘然灵光乍现,赶紧一试,果真成功了!
验证了之前的想法,可能RCurl刚出道的时候,json还没有成主流吧,以是json传参没有明显的放在style这个POST方法的参数里。而httr包则很讨巧的把所有POST参数的编码办法都声明了(哈德利大神便是快人一步,造福人类)。
http://www.linkedin.com/pulse/web-data-acquisition-structure-rcurl-request-part-2-roberto-palloni
以下是写作本篇推送的目地,把利用RCurl包布局POST要求,以及提交json字符串参数的案例及代码分享给大家。RCurl库与httr比较,偏底层,函数多且繁琐,httr更机动、轻便、简洁。这种关系,像极了Python中的urllib和request。
构建报头和查询参数:
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; p romTips=1; NTESSTUDYSI=3de0ac05e45a4c9693f2a3605fbfaede; STUDY_INFO=oP4xHuM9V1uY_TRID1ZzHOm5mkJY|6|12769628|1510452481337; STUDY_SESS=\"大众ryW1kbDYUPDpeexx7xnRK3cGH1nUulhhGJ9D1qIzrg CuSgHl96KRz9xVAwMO6jui9A7L4BJ6hUaaPXVtLf+pWBMHJEw6UtuJtXP jl2yhevq6wVYQtAaJ+N+2maA3kITUrUnNZE+nE0TmYBoQFSEgOKEjUu 22o4FQQjD/GeyPrqJsX8TS4muhOF/kd9duGihHABYarJu/gx1XyYYhTqa89g==\公众; STUDY_PERSIST=\"大众8e2epkzTa+8Xy6agY2FPkUzktd9F+8CZ1rZxShzQSS RJ6RbRK2pSzoTqPic7hOB7dYsCtyfpIAD9Ue4S1oRerMBML+fd8iksmANh 7THsUTBAXY6WM4kHXJFcNuERKuWuDeHOMilu1y+7T3/a7Jav0QPXrTaWx6 YerFKJia2+3rEucY6CQ9waCFR9bhYObYkE6X9kJ71ahCvMYtkr9eXcE6s1 rFdKOIgMEtQwxl1Jb8oli9XIBhsosLWHLIUZIfzGwHfmjuVpkfHAfiCIxUJ fLiv82sP6EP+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=\公众eyJjIjoiIiwiY3QiOiIiLCJpIjoiIiwibSI6IiIsInMiOiI iLCJ0IjoiIn0=|aHR0cDovL3N0dWR5LjE2My5jb20vY291cnNlcy 1zZWFyY2g/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']<-CookiesPayloads=list( \"大众pageIndex\公众=1, \公众pageSize\"大众=50, \公众relativeOffset\"大众=0, \公众frontCategoryId\"大众=\公众400000000158033\公众, \"大众searchTimeType\公众=-1, \"大众orderType\"大众=0, \"大众priceType\"大众=-1, \"大众activityId\"大众=0 )
构建自动抓取函数:
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']]=50i-50 tryCatch({ content <- postForm(url,.opts=list(postfields=toJSON(Payload,auto_unbox=TRUE),httpheader=header),. encoding=\公众utf-8\"大众,curl=handle) ###通过将post需求提交的参数编码为json字串,封装在postForm函数的配置参数.opts中,完成json查询参数的通报!
,###竟然不写在style里,搞得人晕头转向的!
把稳利用toJSON序列化的时候,auto_unbox要设置为TRUE,否则默认为TRUE,单值都会被包括成列表!
response <- content %>% fromJSON() %>% `[[`(3) %>% `[[`(2) fullinfo <- response %>% rbind(fullinfo,.) cat(sprintf(\"大众第【%d】页已抓取完毕!
\公众,i),sep = \"大众\n\"大众) },error = function(e){ cat(sprintf(\"大众第【%d】页抓取失落败!\"大众,i),sep = \"大众\n\"大众) }) Sys.sleep(runif(1)) } cat(\"大众all page is OK!!!\"大众) return (fullinfo)}
#运行函数url<-'http://study.163.com/p/search/studycourse.json'myresult<- GetCourses(url)
#预览数据DT::datatable(myresult)
至此,R措辞中的两大数据抓取神器(要求库),RCurl+httr,针对主流的GET要求、POST要求(常用的)都已经完成探索和案例输出。往后的案例会不断补充一些高等的反反爬技巧!
备注:以上header中的cookie是防止要求被浏览器屏蔽,edu-script-token参数是进程的token,你可以理解为类似秘钥的东西,以是如果想要实践本篇内容,以上两个参数须要你从自己的Chrome中提取,直接运行本篇代码估计不大可能出数据!
本文作者:天善智能社区 杜雨 数据小魔方
欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据剖析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!