中国大学MOOC测验爬取(上)

MOOC是什么

慕课(MOOC),即大规模开放在线课程,是“互联网+教育”的产物。

想必现在的许多大学生都用过MOOC,里面的课挺好的,有许多大学的课,也有国家精品课程。比如矿爷的微积分,订阅的人超多。
那今天我们就搞一下MOOC。爬取它的测验以及答案,再把它们写到word上。可以把它们导入到超星等平台课程题库里供自己使用。

登录分析

在这里我使用的是MOOC软件扫码登录,我们先抓一下包,看它的逻辑。在这里插入图片描述
我们看一下上图,它首先发出请求1,然后再一定时间内请求2一次,验证status,在超过一个时间段后,这个二维码将要失效。
在这里插入图片描述
我们看一下请求1,可以发现它是一个get请求。
在这里插入图片描述
我们再看一下请求1的返回参数,它是一个json数据。我们要看得是codeUrlpollkey,我们打开codeUrl链接,发现就是一个二维码图片。

pollkey是什么?
在这里插入图片描述
我们再看请求2,它的请求也是get请求。看一下它的url,我们会发现codeUrl,并且这个codeUrl请求1中返回的数据中的codeUrl是一样的。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

我们对比上面三张图,发现不同。我们会发现codeStatus的值在变化,当codeStatus=0时需要我们扫码登录;当codeStatus=1时,是我们扫码后要确认登录;当codeStatus=2时,是我们登录成功。这个codeStatus=2是我用fiddler抓包得到的。同时在codeStatus=2时返回来token,这个值是非常有用的
在这里插入图片描述
我们可以看到在pollkey登录请求后,接下来有来又来一个token请求。经过我的实验,这个请求是必须的,换个方向向,它没事不会返回没用的值。
我们看一下那个请求的urlhttps://www.icourse163.org/passport/logingate/mocMobChangeCookie.htm?token=NDgzODQyZWEtN2Y4YS00MzhkLWFjODMtMTcxZmU5ZjFlZTEy&returnUrl=aHR0cHM6Ly93d3cuaWNvdXJzZTE2My5vcmcv
可以发现里面有token并且与上文的token一样,同时我们还会发现有个returnUrl,这个值经过我多次登录,发现它其实是不变的。就是aHR0cHM6Ly93d3cuaWNvdXJzZTE2My5vcmcv
在经过这一切后,我们,我们再访问

https://www.icourse163.org/

这个url就可以了,为了避免下次再次登录,我在这个进行了cookie保存,一开始我是用cookiejar格式保存。但是再次读取cookie时,读不完整,获取不到信息,让人很崩溃。为此我中间有一段时间用selenium进行登录,最后也写好了,不过有个问题就是要配置驱动,很烦人。所以我再次回到之前的代码,这次我把cookiejar变成dict,然后以json格式保存,当用到cookie时,读取json,然后再变成cookiejar,在这样处理之后完美解决了cookie的问题。

userId与csrfKey获取

当我们简介个人中心,看自己订阅的课时,会发现有个userId,这个其实很好获取,不过我也是经历千辛万苦才发现的,这个userId其实隐藏在我们的cookie中,当我们以json格式保存后,这个是在NETEASE_WDA_UID里面,userId及时#之前的一串数字。
同理,这个csrfKey也是在cookie里面,它对于cookie里面NTESSTUDYSI这个值。
为什么要找csrfKey呢?
因为我发现我们的headers中有个edu-script-token键,它的值就是csrfKey

获取课程数目及页数

接下来我们要获取课程的数目以及页数,其实当我们知道课程数目后,页数也就知道了,因为每页的课程数目都是固定的8个,那我就开始找怎么获取,一开始我是想通过网页直接获取,可惜每页,然后我就在xhr中找,最终被我找到了。
在这里插入图片描述
我们可以看到,这里就用到csrfKey了,但是单单这些还不够,这里还有一个参数,data。每有它我们是获取不到的。
在这里插入图片描述

这个uid其实就是userId
那个页数就在返回的数据中。
在这里插入图片描述
其实很直白learingCoursesCount,翻译及时学习课程的数量。接下来获取页数就是easy了,做个除法就ok了。

那接下来就是获取课程了。
在这里插入图片描述
我们可以看到,这里也有csrfKey的身影。
在这里插入图片描述
同时也得加上data,这里type,psize,courseType是不变得,p在变,p代表页数`,并且p从1开始.。
在这里插入图片描述
我们看一下我们请求到的数据。里面有8个课程及其信息,我们看其中一个课程。
我就贴出一个课程的。其它的雷同。

channel: 1
courseType: 1
id: 1003690008
imgUrl: “http://edu-image.nosdn.127.net/F4F374D32D4CD6EB2E1AF323F0824C2E.jpg?imageView&thumbnail=510y288&quality=100”
learnedCount: 0
mocTagDtos: []
mode: 0
name: “大学物理实验(II)”
productType: 1
releaseCount: null
schoolPanel: {id: 74001, name: “北京交通大学”, shortName: “NJTU”, imgUrl: null, supportMooc: null, supportSpoc: null,…}
bgPhoto: null
classroomSupport: null
id: 74001
imgUrl: null
name: “北京交通大学”
shortName: “NJTU”
smallLogo: null
supportCommonMooc: null
supportMooc: null
supportPostgradexam: null
supportSpoc: null
shortName: “0702BJTU023B”
termPanel: {id: 1207352201, courseId: 1003690008, courseName: null, startTime: 1572314400000,…}
achievementStatus: 1
applyConvertChannelStatus: null
applyMoocStatus: 0
applyPassedTermId: null
asynPrice: null
bigPhotoUrl: “http://edu-image.nosdn.127.net/F4F374D32D4CD6EB2E1AF323F0824C2E.jpg?imageView&thumbnail=510y288&quality=100”
certApplyEndTime: 1624204800000
certApplyStartTime: 1615564800000
certNo: null
certStatus: null
chargeCertStatus: null
chargeableCert: 1
closeVisableStatus: 0
copied: 1
copyRight: null
copyTime: null
courseId: 1003690008
courseName: null
duration: “”
endTime: 1602343800000
enrollCount: 8651
fromTermId: 1003932002
fromTermMode: 0
hasEnroll: true
id: 1207352201
jsonContent: null
lectorPanels: null
lessonsCount: 13
mode: 0
orderPrice: null
ordinaryEditors: null
originMocTermCopyRight: null
originalCourseChannel: null
originalPrice: 0
price: 0
productType: 1
publishStatus: 2
schoolId: 74001
schoolPanel: null
scoreCardDto: {totalScore: null, totalScoreWithBonus: null, hasNormalCert: null, hasOutstandingCert: null,…}
certPic: null
hasNormalCert: null
hasOutstandingCert: null
normalCertPhase: null
outstandingCertPhase: null
totalScore: null
totalScoreWithBonus: null
selfMocTermCopyright: null
specialChargeableTerm: false
spocToOocStatus: 0
startTime: 1572314400000
syncPrice: null

在这里["termPanel"]["id"]是要用到的,这个是课程的id,我们在请求测验上传测验获取测验与答案都要用到。

好了,先写一半吧。觉得我写的还凑合就关注一下Ajian,顺便关注一下我的微信公众号(spiders),也可以扫一下下面的二维码。
在这里插入图片描述

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值