Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R语言爬虫实战——网易云课堂数据分析课程板块数据爬取

R语言爬虫实战——网易云课堂数据分析课程板块数据爬取

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

R语言的爬虫生态虽然与Python相比要弱小很多,but,如果你真的想要用R干一些有趣的事情,那么R语言目前所具有的的网络爬取工具也能给你带来很多方便。

今天借着中秋节的兴致,用网易云课堂

全部课程>编程开发>人工智能大数据>数据分析

模块的课程作为实战对象,来给大家演练一下如何使用R语言httr包实现异步加载和POST 表单提交以及cookies登入。

直接使用json或者其他格式的表单返回值,避免苦逼的的书写大量正则表达式以及让人眼花缭乱的 CSS表达式、Xath路径表达式。这应该是每一个爬虫练习者都应该谨记的事情。

没错,异步加载的网页大多通过返回json字符串的形式来获取数据,它的难点在于请求的提交以及表单体构建、json字符串处理和最烦人的null空值剔除与替换。

本文使用到的技术是哈德利.威科姆大神的又一新作——网络数据爬取利器:httr。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library("httr") 
library("dplyr") 
library("jsonlite")
library("curl")
library("magrittr")
library("rlist")
library("pipeR")
library("plyr")

网易云课堂的网页使用POST请求提交的异步加载,在不久前我曾用Python演示过一次,今天换成R重塑一遍流程,你也可以参照这个代码自己照葫芦画瓢。

网易云课堂Excel课程爬虫思路

首先我们需要做的事情是确认它的网页构架:

打开F12键,定位到XHR,寻找以.josn结尾的请求文件。当你在它的右侧打开对应Preview菜单,可以看到它的json数据源并且,有大量很整齐的课程信息的时候,差不多就找对了。

第二步:获取请求信息:

定位到Headers,主要关注四大模块:

General里面的Request URL、Request Method、Status Code

Response Headers里面的Content-Type Request Headers 里面的 Accept、Content-Type、Cookie、Referer、User-Agent 以及最后Request Paylond里面的所有参数表

General里面的urlpost方法即是即决定访问的资源对象和使用的技术手段。 Response Headers里面的Content-Type决定着你获得的数据以什么样的编码格式返回。 Request Headers 里面的 Accept、Content-Type、Cookie、Referer、User-Agent等是你客户端的浏览器信息,其中Cookie是你浏览器登录后缓存在本地的登录状态信息,使用Cookie登入可以避免爬虫程序被频繁拒绝。(虽然网易云课堂的课程信息没有强制要求登录才能查看)。 Request Paylond信息最为关键,是POST提交请求必备的定位信息,因为浏览器的课程页有很多页信息,但是实际上他们访问同一个地址(就是General里面的url),而真正起到切换页面的就是这个Request Paylond里面的表单信息。

以下是我从Chrome后台获取的所有信息:

请求方式:POST

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
url<-"http://study.163.com/p/search/studycourse.json"

请求头:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Accept:application/json
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Content-Length:148
Content-Type:application/json
Cookie:请键入你自己的Cookies(我的账号里还有很多付费课程呢,不能随便卖~_~)
edu-script-token:538144961c6343e88841c686a6ffb7b2
Host:study.163.com
Origin:http://study.163.com
Referer:http://study.163.com/category/dataanalysis
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36

请求头参数:(JSON)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pageIndex    1
pageSize    50
relativeOffset    0
frontCategoryId    400000000709002
searchTimeType    -1
orderType    0
priceType    -1
activityId    0

前五页和最后一页的Request Paylond信息(可以看到其中前四个参数最为关键,剩余的可以不要)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"pageIndex":1,"pageSize":50,"relativeOffset":0,"frontCategoryId":"400000000709002","searchTimeType":-1,"orderType":0,"priceType":-1,"activityId":0}
{"pageIndex":2,"pageSize":50,"relativeOffset":50,"frontCategoryId":"400000000709002","searchTimeType":-1,"orderType":0,"priceType":-1,"activityId":0}
{"pageIndex":3,"pageSize":50,"relativeOffset":100,"frontCategoryId":"400000000709002","searchTimeType":-1,"orderType":0,"priceType":-1,"activityId":0}
{"pageIndex":4,"pageSize":50,"relativeOffset":150,"frontCategoryId":"400000000709002","searchTimeType":-1,"orderType":0,"priceType":-1,"activityId":0}
{"pageIndex":5,"pageSize":50,"relativeOffset":200,"frontCategoryId":"400000000709002","searchTimeType":-1,"orderType":0,"priceType":-1,"activityId":0}
……
{"pageIndex":12,"pageSize":50,"relativeOffset":550,"frontCategoryId":"400000000709002","searchTimeType":-1,"orderType":0,"priceType":-1,"activityId":0}

第四步:构造请求提交信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Cookie='请键入个人的网易云课堂Cookies'

构造浏览器报头信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#构造浏览器报头信息:
headers <- c('Accept'='application/json',
             'Content-Type'='application/json',          
             'User-Agent'='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36',          
             'edu-script-token'= '3e44b18e2cea46b6890d1cf92c1ad606',
             'Referer'='http://study.163.com/category/dataanalysis', 
             'Connection'='keep-alive',
             'Cookie'=Cookie
          )

构造请求头参数信息:(这里只接受list)
payload<-list(
              'pageIndex'=1,
               'pageSize'=50, 
               'relativeOffset'=0,
               'frontCategoryId'='400000000709002'
         )

构造url:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
url<-"http://study.163.com/p/search/studycourse.json"

第五步:单步执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
r <- POST(url,add_headers(.headers =headers),body =payload, encode="json",verbose())

从返回信息上我们可以看到提交成功,毕竟已经成功返回有效内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myresult1 <-r %>% content() %>%`[[`(3) %>% `[[`(2) %>% toJSON() %>% fromJSON(simplifyDataFrame=TRUE)

可以看到我们想要的内容存放在r %>% content()返回值的第三个list(result)内的第二个list中,长度为50,宽度为27,刚好就是我们在后台看到的课程信息。如果你不记得`[[`(3)的用法,记得看前几篇的推送,它与extract函数相同,用于提取指定list对象。

如何使用管道操作符优雅的书写R语言代码

这是所有课程信息字段名称,我们无需要这么多,仅挑选其中必要到的即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 [1] "productId"       "courseId"        "productName"     "productType"     "startTime"       "endTime"        
 [7] "description"     "provider"        "score"           "scoreLevel"      "learnerCount"    "imgUrl"
[13] "bigImgUrl"       "lectorName"      "originalPrice"   "discountPrice"   "discountRate"    "forumTagLector"
[19] "tagLectorTime"   "schoolShortName" "tagIap"          "gmtModified"     "displayType"     "courseCardProps"
[25] "published"       "activityIds"     "isPromStatus" 
usefulname<-c("productId","courseId","productName","lectorName","provider","score","scoreLevel","learnerCount","originalPrice","discountPrice","discountRate","description")
myresult1<-myresult1 %>% select(usefulname)

第六步:书写完整的循环获取全部课程数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myfullresult<-list()
for (i in 1:12){
     payload[["pageIndex"]]=i
     payload[["relativeOffset"]]=payload[["relativeOffset"]] %>% `+`(50*(i-1))
     web <- POST(url,add_headers(.headers =headers),body =payload,encode="json",verbose())
     myresult<-web %>% content() %>% `[[`(3) %>% `[[`(2) 
     myfullresult<-c(myfullresult,myresult)
}

以上获取的是个巨大的列表,我们需要将其转换为数据框,并提取出我们需要的列。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mydata<-do.call(rbind,myfullresult) %>% as.data.frame() %>% select(usefulname)

还有一个问题,因为mydata整体是数据框,但是单个变量仍然是lsit(原因是原始信息中出现大量的NULL值),我们需要将所有NULL替换为NA,方可对mydata的个列进行向量化。

替换NULL值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (j in 1:length(mydata)){
        for (i in 1:nrow(mydata)){
               if(is.null(mydata[i,j][[1]])){
                mydata[i,j][[1]]=NA
                }
       }
}

将所有list列转为向量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (i in usefulname){
mydata[[i]]<-mydata[[i]] %>% unlist()
}

去重:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mydata<-unique(mydata)

保存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
write.csv(mydata, file ="D:/R/File/yunketang_datafenxi.csv")

预览:

其实多了解一些方法,在很多时候避免走弯路,CSS表达式和Xpath路径表达式甚至正则表达式的门槛都很高,单是搞明白一种就已经很不容易,融会贯通就更难了。

但是多了解一些捷径和方法,你完全可以规避掉这些,我们的目标是获取数据,没有人关心你用的什么方法,学会灵活运用才是关键。

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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
网易云课堂Excel课程爬虫思路
由于即将毕业,马上进入职场,想来是时候需要巩固一下基本职场技能了,特别是Excel这种杀手级职场应用。 可是如今网络这么发达,到处都充斥着Excel课程、视频、教程,真的很容易让人眼花缭乱,不知所措。 看书来的太慢了,还是直接看视频吧,简单粗暴,学习之前总要熟悉一下Excel教学行业的大致情况吧,今天就拿网易云课堂的Excel板块作为目标,在练习数据爬取的同时,顺便了解一下Excel培训行业的行情,知己知彼才能百战不殆,才能更加集中精力的学习那些精品课程。 url<-"http://study.163.c
数据小磨坊
2018/04/11
2K0
网易云课堂Excel课程爬虫思路
R语言爬虫实战——知乎live课程数据爬取实战
本文是一篇R语言爬虫实战练习篇,同样使用httr包来完成,结合cookies登录、表单提交、json数据包来完成整个数据爬取过程,无需书写复杂的xpath、css路径甚至繁琐的正则表达式(尽管这三个技能对于数据爬取而言意义非凡)。 之前已经演练过如何使用httr来完成网易云课堂的课程爬取,其中用到POST方法和表单提交。 今天爬取对象是知乎live课程信息,用到的GET方法,结合cookies登录和参数提交来完成,这一篇会给大家稍微涉猎一些细节技巧。 library("httr") library("dp
数据小磨坊
2018/04/11
1.5K0
R语言爬虫实战——知乎live课程数据爬取实战
Python数据抓取与可视化实战——网易云课堂人工智能与大数据板块课程实战
本篇内容数据抓取对象为网易云课堂人工智能与大数据板块课程信息,使用的工具是urllib+postman,因为直接构建的POST抓取的josn数据包,所以数据抓取的代码非常简单,没有繁杂的xpath或者css表达式。可视化部分使用matplotlib,感谢刘顺祥大神的matplotlib教程系列,让我没怎么费力气就直接复用了大量代码! https://mp.weixin.qq.com/s/E_r5ZsV9HOyuhnFwqsRXeA 以下是数据抓取部分代码: import json,time from url
数据小磨坊
2018/04/11
1.4K0
Python数据抓取与可视化实战——网易云课堂人工智能与大数据板块课程实战
R语言网络数据抓取的又一个难题,终于攻破了!
单纯从数据抓取的逻辑来讲(不谈那些工程上的可用框架),个人觉得R语言中现有的请求库中,RCurl和httr完全可以对标Python中的urllib和reuqests(当然py中在错误处理和解析框架上显得更为专业!)。 我们经常使用的网络数据抓取需求,无非两种: 要么伪造浏览器请求 要么驱动浏览器请求 对于伪造浏览器请求而言,虽然请求定义里有诸多类型,但是实际上爬虫用到的无非就是GET请求和POST请求。 而驱动浏览器就几乎没有什么门槛了,所见即所得,R语言中的RSelenium/Rwebdriver和Py
数据小磨坊
2018/04/11
3.3K0
R语言网络数据抓取的又一个难题,终于攻破了!
异步加载的基本逻辑与浏览器抓包一般流程
本篇内容不涉及任何R语言或者Python代码实现,仅从异步加载的逻辑实现过程以及浏览器抓包分析的角度来给大家分享一下个人近期学习爬虫的一些心得。 涉及到的工具有Chrome浏览器(开发者工具)、postman(一款非常优秀的Chrome网络请求构造工具,你可以在Chrome浏览器在线商店里搜到,也可以下载桌面版)。 1、异步加载概念及实现过程 2、浏览器抓包分析一般流程 异步加载的英文简称是ajax,即“Asynchronous Javascript And XML”(异步JavaScript和XML)是指
数据小磨坊
2018/04/11
2.4K0
异步加载的基本逻辑与浏览器抓包一般流程
R语言抓包实战——知乎live二级页面获取
之前曾经写过一篇关于知乎live课程信息爬取的短文,那个直接遍历的知乎live主页上展示的部分课程,仅仅是很小的一部分。 今日这一篇将是该小项目的升级版,直接对live主页的课程按照模块进行二级页面的遍历,这样可以抓取更加丰富的课程信息,本次一共获取课程数目将近800+ 对于课程页抓包分析详情,这里不再赘述,想要了解的可以看这一篇旧文,本篇内容仅对二级页面的遍历思路进行整理。 R语言爬虫实战——知乎live课程数据爬取实战 因为课程数相对较多,这里使用cookie直接登录,需要获取cookie值。 lib
数据小磨坊
2018/04/12
1.3K0
R语言抓包实战——知乎live二级页面获取
网易云课堂公开课-Promise【文字版】
今天的网易云课堂的公开课已经结束,因为是第一次,所以有些操作也不太熟练,下面是本次公开课的文字内容。
web前端教室
2018/10/08
9470
网易云课堂公开课-Promise【文字版】
python小白爬取某东bra数据分析
最近用python爬取了某东上的x款bra的用户评论,然后进行了size、color分析,直接上图:
LiosWong
2019/02/28
6500
python小白爬取某东bra数据分析
左手用R右手Python系列——模拟登陆教务系统
最近在练习R语言与Python的网络数据抓取内容,遇到了烦人的验证码问题,走了很多弯路,最终总算解决了。 在分享这篇文章之前,只想感慨一声,虽然Python拥有更为完善的爬虫生态和多如牛毛的爬虫分享课程,但是貌似这些大部分内容,使用R语言中的RCurl+httr都可以做到,但是可惜的利用R语言学习爬虫的爱好者与Pythoner相比,实在是太少了,R语言的高阶爬虫教程凤毛麟角,只能一点一点儿在stackflow上面搜罗整理。 希望我的这一篇案例能给大家带来一点儿可借鉴的思路。 R library("RCurl
数据小磨坊
2018/04/11
1.5K0
左手用R右手Python系列——模拟登陆教务系统
左右用R右手Pyhon系列——趣直播课程抓取实战
本文将以趣直播课程信息数据抓取为例,展示如何使用RCurl进行结合浏览器抓包操作进行简易数据抓取。 library("RCurl") livrary("XML") library("rlist") library("dplyr") library("jsonlite") 按照常规的操作步骤,数据抓取首先应该通过浏览器后台确认该目标网页所使用的框架和请求类型,确认网站是否提供了api访问接口,如果可以通过API直接访问数据包,那么抓取工作将会变得极其简单,倘若没有,则才考虑直接请求整个网页并使用xpath、c
数据小磨坊
2018/04/11
8720
左右用R右手Pyhon系列——趣直播课程抓取实战
R语言多任务处理与并行运算包——foreach
相信大部分R语言初学者,在刚开始入门之处,都曾被告诫在处理多重复任务时,尽量不要使用显式的for循环,而要尽可能的使用R语言内置的apply组函数,这样可以极大地提高代码运行效率。 但是实际上除了内的apply组函数之外,你还有另外一个更好地选择,就是利用一些支持并行运算的扩展包,来发挥本地计算机的多和计算优势。 本篇要讲解的包是foreach包,这是一个支持在R语言中调用多进程功能的第三方包,之前在对比显式循环、矢量化函数以及多进程在数据抓取的效率一文中,曾经演示过具体的代码。 library("fore
数据小磨坊
2018/04/12
3.2K0
R语言多任务处理与并行运算包——foreach
使用Python爬取某网某电影视评论
爬取时光网里的长津湖之水门桥的影视评论,时光网采用的是 XHR技术,先加载骨架在加载详细内容,而加载详细内容的过程,就用到了 XHR 技术。
雾海梦曦
2022/11/12
5450
使用Python爬取某网某电影视评论
云课堂Excel课程数据可视化分析
我一直是网易云课堂的重度用户,从大二开始就一直在上面学习各种技能类课程,作为互联网在线教育的知名品牌,云课堂在某种程度上弥补了我们从校园到职场过渡过程中,很多技能类知识不足的缺口。 今天这一篇是接着上一篇云课堂Excel课程板块爬虫数据进行多角度的可视化分析,上次的爬虫一共爬取了425条课程信息,一共提取了9个字段。 英文字段名称 中文含义 类型 productId 课程ID 定性 productName 课程名称 定性 lectorName
数据小磨坊
2018/04/11
1.4K0
云课堂Excel课程数据可视化分析
R语言数据清洗实战——复杂数据结构与list解析
数据清洗从来都不是一件简单的事情! 使用httr包结合浏览器抓包工具进行网页数据抓取虽然非常方便,但是获取的数据后期处理工作量却非常庞大的。 因为大部分json数据包返回之后都会被转换为R语言中的非结构化数据类型——list。 也就是说,对于list数据结构的处理熟练程度,将会决定着你在数据清洗中所花费的时间与精力。 list数据结构本身即可简单也可复杂,当list中存在递归结构时,其处理难度就大大增加了。(不幸的是大部分json数据包都是递归结构的) 对于list数据结构的处理,你可以通过手动构造循环来处
数据小磨坊
2018/04/11
1.6K0
R语言数据清洗实战——复杂数据结构与list解析
Python爬虫实战:网易云音乐爬取
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。
松鼠爱吃饼干
2020/11/19
4.3K0
Python爬虫实战:网易云音乐爬取
python3爬取网易云音乐歌单里的歌词(含源码)
一些注意事项: 1.看了Coursera上面的python教程,里面给了一个非常简单的示例,只传一个url就获取到响应报文。然而很多网站是不能只通过一个url就响应请求的,你还需要填写报文头部也就是header部分。 2.得到的报文里面中文字符都是bytes,十六进制的格式,需要用utf-8解码 3.巧用控制台找到页面内容真实的网址 其余的注意点我都写在注释里了,完整源码如下: ---- #爬取网易云音乐我的歌单里面所有歌曲的歌词 import json import requests import re
kalifa_lau
2018/04/28
1.8K0
Python网易云音乐爬虫进阶篇
年前写过一篇爬网易云音乐评论的文章,爬不了多久又回被封,所以爬下来那么点根本做不了什么分析,后面就再改了下,加入了多线程,一次性爬一个歌手最热门50首歌曲的评论,算是进阶版了~
Awesome_Tang
2018/09/11
2.8K0
Python网易云音乐爬虫进阶篇
网易云音乐评论爬取。
最后一页为10079,减500页应该是9579,然后你会发现9575页和9579页的数据是一模一样的。
挖数
2019/06/20
4.3K2
网易云音乐评论爬取。
左手用R右手Python系列——面向对象编程基础
面向对象编程是程序设计中一种重要且高效的编程规范,它区别于常见的面向过程编程。在R语言以及Python的程序包开发过程中,大量使用了面向对象的编程范式。 百度百科关于面向对象编程的权威解释是: 面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。其最重要的三大特征是封装、继承、多态。 对象指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。 R语言中的面向对象编程是通
数据小磨坊
2018/04/12
1.3K0
左手用R右手Python系列——面向对象编程基础
爬取网易云音乐每日推荐歌单,然后定时自动发送到朋友邮箱
今天是我的第三个Python项目:每天自动定时、自动发送爬取的网易云音乐的推荐歌单到你的邮箱列表中。
double
2022/01/26
1.7K0
爬取网易云音乐每日推荐歌单,然后定时自动发送到朋友邮箱
推荐阅读
相关推荐
网易云课堂Excel课程爬虫思路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验