中国大学MOOC测验爬取(上) 您所在的位置:网站首页 mooc下载的文件怎么提取出来 中国大学MOOC测验爬取(上)

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

2024-06-14 03:16| 来源: 网络整理| 查看: 265

中国大学MOOC测验爬取 MOOC是什么登录分析userId与csrfKey获取获取课程数目及页数

MOOC是什么

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

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

登录分析

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

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

我们对比上面三张图,发现不同。我们会发现codeStatus的值在变化,当codeStatus=0时需要我们扫码登录;当codeStatus=1时,是我们扫码后要确认登录;当codeStatus=2时,是我们登录成功。这个codeStatus=2是我用fiddler抓包得到的。同时在codeStatus=2时返回来token,这个值是非常有用的 在这里插入图片描述 我们可以看到在pollkey登录请求后,接下来有来又来一个token请求。经过我的实验,这个请求是必须的,换个方向向,它没事不会返回没用的值。 我们看一下那个请求的url:https://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),也可以扫一下下面的二维码。 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有