首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R语言网络数据抓取的又一个难题,终于攻破了!

R语言网络数据抓取的又一个难题,终于攻破了!

作者头像
数据小磨坊
发布于 2018-04-11 09:53:50
发布于 2018-04-11 09:53:50
3.4K00
代码可运行
举报
文章被收录于专栏:数据小魔方数据小魔方
运行总次数:0
代码可运行

单纯从数据抓取的逻辑来讲(不谈那些工程上的可用框架),个人觉得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。

构建报头和查询参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
        )

构建自动抓取函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
        ###通过将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)
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#运行函数
url<-'http://study.163.com/p/search/studycourse.json'
myresult<- GetCourses(url)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#预览数据
DT::datatable(myresult)

至此,R语言中的两大数据抓取神器(请求库),RCurl+httr,针对主流的GET请求、POST请求(常用的)都已经完成探索和案例输出。以后的案例会不断补充一些高级的反反爬技巧!

备注:以上header中的cookie是防止请求被浏览器屏蔽,edu-script-token参数是进程的token,你可以理解为类似秘钥的东西,所以如果想要实践本篇内容,以上两个参数需要你从自己的Chrome中提取,直接运行本篇代码估计不大可能出数据!

往期案例数据请移步本人GitHub: https://github.com/ljtyduyu/DataWarehouse/tree/master/File

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据小魔方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
三万字收藏 | 三维场景点云理解与重建技术
作者:龚靖渝, 楼雨京, 柳奉奇, 张志伟, 陈豪明, 张志忠, 谭鑫, 谢源, 马利庄
一点人工一点智能
2023/08/24
1.8K0
三万字收藏 | 三维场景点云理解与重建技术
CVPR 2019 | PointConv:在点云上高效实现卷积操作
在机器人、自动驾驶和虚拟/增强现实应用中,直接获取 3D 数据的传感器日趋普遍。由于深度信息可以消除 2D 图像中的大量分割不确定性(segmentation ambiguity),并提供重要的几何信息,因此具备直接处理 3D 数据的能力在这些应用中非常宝贵。但 3D 数据通常以点云的形式出现。点云通常由一组无排列顺序的 3D 点表示,每个点上具有或不具有附加特征(例如 RGB 信息)。由于点云的无序特性,并且其排列方式不同于 2D 图像中的常规网格状像素点,传统的 CNN 很难处理这种无序输入。
机器之心
2019/05/07
1.2K0
CVPR 2019 | PointConv:在点云上高效实现卷积操作
3D点云 | 基于深度学习处理点云数据入门经典:PointNet、PointNet++
不同于图像数据在计算机中的表示通常编码了像素点之间的空间关系,点云数据由无序的数据点构成一个集合来表示。因此,在使用图像识别任务的深度学习模型处理点云数据之前,需要对点云数据进行一些处理。目前采用的方式主要有两种:
AI算法修炼营
2020/06/09
10.2K0
点云处理不得劲?球卷积了解一下
点云,是一种重要的三维数据形式,对于自动驾驶、VR/AR测量领域都有着十分重要的作用。
代码医生工作室
2019/10/28
9330
点云处理不得劲?球卷积了解一下
CVPR 2019 Oral | Relation-Shape CNN:以几何关系卷积推理点云3D形状
论文作者:Yongcheng Liu、Bin Fan、Shiming Xiang、Chunhong Pan
机器之心
2019/05/13
1.1K0
CVPR 2019 Oral | Relation-Shape CNN:以几何关系卷积推理点云3D形状
基于三维卷积神经网络的点云标记
本文研究三维点云的标记问题。介绍了一种基于三维卷积神经网络的点云标记方法。我们的方法最大限度地减少了标记问题的先验知识,并且不像大多数以前的方法那样需要分割步骤或手工制作的特征。特别是,我们提出了在培训和测试过程中处理大数据的解决方案。在包含7类对象的城市点云数据集上进行的实验显示了我们应用程序的鲁棒性。
点云PCL博主
2019/12/31
2.5K1
基于三维卷积神经网络的点云标记
CVPR2021 | PAConv:一种位置自适应卷积,点云分类、分割任务表现SOTA
由香港大学CVMI Lab和牛津大学合作提出了一种点云上具有动态内核组装的位置自适应卷积——PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds,论文已被CVPR2021接收。
计算机视觉
2021/04/26
1.2K0
CVPR2021 | PAConv:一种位置自适应卷积,点云分类、分割任务表现SOTA
大场景三维点云的语义分割综述
输入原始点云(x,y,z,intensity),得到每个三维点的语义类别。如图所示,不同颜色代表不同类别。
点云PCL博主
2020/01/17
4.9K0
大场景三维点云的语义分割综述
PointNet:三维点云分割与分类的深度学习
本文是关于PointNet点云深度学习的翻译与理解,PointNet是一种直接处理点云的新型神经网络,它很好地体现了输入点云的序列不变性。
点云PCL博主
2019/07/30
2.5K0
PointNet:三维点云分割与分类的深度学习
PAConv:基于点云动态核的自适应卷积
标题:PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds
点云PCL博主
2022/02/10
1.1K0
PAConv:基于点云动态核的自适应卷积
点云深度学习的3D场景理解(下)
本文主要是关于 pointNet,pointNet++,frustum point 的一些整理和总结,内容包括如何将点云进行深度学习,如何设计新型的网络架构,如何将架构应用的3D场景理解。文章由于篇幅过长,将分成上下两部分。上文请看点云深度学习的3D场景理解(上)
点云PCL博主
2019/07/30
2.1K0
点云深度学习的3D场景理解(下)
SFFAI分享 | Geometric Relation Learning in 3D Point Cloud Analysis
近年来,卷积神经网络(CNN)在图像这类规则数据的处理中获得了举世瞩目的成功,然而如何拓展CNN以分析点云这种不规则数据,仍然是一个开放的研究问题。对于点云而言,每一个点并非孤立存在,相邻的点形成一个有意义的形状,因此对点间关系进行深度学习建模非常重要。在SFFAI25分享会中:
马上科普尚尚
2020/05/11
5480
SFFAI分享 | Geometric Relation Learning in 3D Point Cloud Analysis
图像处理之特征提取
知乎上看到一个话题—— 目前火热的 Deep Learning 会灭绝传统的 SIFT / SURF 特征提取方法吗? ---- 由于之前研究过SIFT和HOG这两种传统的特征提取方法,故本篇文章先对SIFT和HOG作一综述,并比较二者优缺点。之后,将SIFT和HOG同神经网络特征提取做一对比,浅谈对上述问题的看法。如果能写得快一些,再简单介绍其他几种传统的特征提取的方法——SURF、ORB、LBP、HAAR等等。 ---- 目录 [1] SIFT(尺度不变特征变换) [2] HOG(方向梯度直方图)
echobingo
2018/04/25
5.9K0
图像处理之特征提取
我们急需三维激光数据的语义分割吗?
我们急需三维激光数据的语义分割吗? 今天给大家分享一篇论文,论文名称: Are We Hungry for 3D LiDAR Data for Semantic Segmentation? 作者:
用户1150922
2020/09/10
1.9K0
我们急需三维激光数据的语义分割吗?
CVPR 2020 | RandLA-Net:大场景三维点云语义分割新框架(已开源)
本文要介绍的是 CVPR 2020上被录用的文章《RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds》
AI科技评论
2020/03/05
4.7K0
CVPR 2020 | RandLA-Net:大场景三维点云语义分割新框架(已开源)
弱监督三维点云语义分割研究综述
作者:Jingyi Wang, Yu Liu, Hanlin Tan, Maojun Zhang
一点人工一点智能
2023/11/15
7300
弱监督三维点云语义分割研究综述
清华计图首创三角网格面片上的卷积神经网络、图像上的网络架构可以做三维模型的深度学习了!
近日,清华大学计图(Jittor)团队提出了一种针对三角网格的卷积神经网络,在两个网格分类数据集上首次取得100%正确率,在其他多个几何学习任务中,性能显著超过现有方法。
AI科技评论
2021/07/03
1.4K0
清华计图首创三角网格面片上的卷积神经网络、图像上的网络架构可以做三维模型的深度学习了!
三维局部描述子综述
摘要:对三维计算机视觉领域中近三十年的局部描述子进行总结,回顾了传统三维手工局部描述符的构造方法,介绍了基于深度学习的方法。
一点人工一点智能
2023/02/17
1.3K0
三维局部描述子综述
什么样的点可以称为三维点云的关键点?
这个工作来自于中国香港科技大学和中国香港城市大学。我们知道,随着三维传感器以及相关扫描技术的进步,三维点云已经成为三维视觉领域内一项十分重要的数据形式。并且随着深度学习技术的发展,许多经典的点云深度学习处理方法被提出来。但是,现有的大多数方法都关注于点云的特征描述子学习。并且,在稠密的点云数据帧中,如果对所有点云都进行处理,将会带来巨大的计算和内存压力。针对这种问题,提取部分具有代表性的关键点则成为一种自然而且有效的策略。但是,什么样的点可以称为三维点云中的关键点呢?这个问题仍然是一个开放的、没有明确答案的问题。
3D视觉工坊
2023/04/29
6070
什么样的点可以称为三维点云的关键点?
结合局部与全局特征的点云语义分割卷积网络
点云语义分割在许多与点云相关的应用程序中具有重要作用,特别是对于机载激光点云,精确的注释可大大扩展其在各种应用中的用途。然而,受限于传感器噪声、复杂的对象结构、不完整的点和不均匀的点密度,准确而有效的语义分割仍是一项艰巨的任务。因此,提出了一种结合局部与全局特征的机载激光点云语义分割网络。
一点人工一点智能
2023/04/26
8950
结合局部与全局特征的点云语义分割卷积网络
推荐阅读
相关推荐
三万字收藏 | 三维场景点云理解与重建技术
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档