中国大学MOOC网爬取课件案例学习

几年前的做法了,现在可能页面元素变了,思路可以学习!

分析

先从这个网址开始分析

https://www.icourse163.org/learn/BIT-1001870001?tid=1003245012#/learn/content?type=detail&id=1004574454&cid=1005754086

进入网页后F12, 进入 Network,并选择 XHR. 然后刷新一下网页。我们要找的是从后台传到前端的信息,我发现了这个请求,里面包含一大串数据
在这里插入图片描述
由于这个内容很混乱,我把这数据放到 sublime Text 3 里面整理一下格式,以便观察。

得到如图的格式
在这里插入图片描述
我来分析一下数据的结构形式:

  • 首先看第一部分
    在这里插入图片描述
    看到每个 s 前面的 var,我推测是后端传到前端的js代码。其中定义了数组对象两个数据形式。

  • 接下来再顺着s0 s2 s7 …的顺序往下找
    在这里插入图片描述
    s0这个数组包含了5个对象(s2,s3,s4,s6是对象)
    再来看看s2,s3,s4,s6对象包含了什么?
    在这里插入图片描述
    s2.name内容被进行了编码,先找个在线解码的看看内容。
    传送门:https://www.sojson.com/ascii.html
    为了方便,我直接将所有都转了编码
    在这里插入图片描述
    从这里可以类推 s2是第O周,s3是第一周,s4是第二周,s5时第三周,s6是第四周。即s0数组存储的是5周的内容。
    在这里插入图片描述

  • 我们再来从s2一路分析下去
    在这里插入图片描述
    看到lessons,可能接下来就是一周里面的单元课程视频和课件,找s8

在这里插入图片描述
s8 又存储了两个对象,接着探索 s10 和 s11
在这里插入图片描述
在这里插入图片描述
s10,s11对应的就是
在这里插入图片描述
其中:

又:
在这里插入图片描述
再来看s13和s14:
在这里插入图片描述
在这里插入图片描述

  • contentType=1是表示视频,=3表示是课件文档,整个参数将会用来区分视频和文档。
  • contentId 这个参数将是下载pdf的关键唯一关键参数,每一个文档都又一个唯一的contentId(后面下载pdf将会用到)。

在这里插入图片描述
最后,分析结构简图:

在这里插入图片描述
其他都是这种类似的方式推出来,所以图只画了一小部分,仅供参考。

接下来要对文档的下载请求分析:
打开其中一个课件网页:

https://www.icourse163.org/learn/BIT-1001870001?tid=1003245012#/learn/content?type=detail&id=1004574437&cid=1005754004

在这里插入图片描述
这个响应中包含了pdf的下载地址
在这里插入图片描述
pdf的名字是被编码了,所以解码一下看的清楚一点。
在这里插入图片描述

分析完毕,来构造请求

构造第一个请求

主要是拿到 currentId 这个标记pdf的唯一参数,为下次获得请求pdf下载地址的参数
requestUrl:
https://www.icourse163.org/dwr/call/plaincall/CourseBean.getLastLearnedMocTermDto.dwr

https://www.icourse163.org/dwr/call/plaincall/CourseBean.getLessonUnitLearnVo.dwr
(同理,上面两个请求都可以用来下载pdf, 区别在于post传入参数不同,返回的不同)
在这里插入图片描述

  • c0-param0=number: 这个参数可以再网页源代码找到,currentTermId或是id的值都可以的到正确响应的.dwr
  • 注意,这里post参数是以文本传入!(详细见python代码)

在这里插入图片描述
在这里插入图片描述
postman测试(currentTermId或id 都可以,任选一个都可以得到同样的返回内容)
在这里插入图片描述
在这里插入图片描述

构造第二个请求

requestUrl:
https://www.icourse163.org/dwr/call/plaincall/CourseBean.getLastLearnedMocTermDto.dwr

https://www.icourse163.org/dwr/call/plaincall/CourseBean.getLessonUnitLearnVo.dwr
(上面两个请求都可以用来下载pdf, 区别在于post传入参数不同,返回的不同)
post方式
在这里插入图片描述

  • dwr是java后端往前端传数据额一中类似于ajax的机制,但是post构造传参与ajax有点不同

传参:
在这里插入图片描述

  • c0-param0=nember: 这个参数的值就是 s13.contentId的值(往上翻,看到分析s13处)
  • c0-param3=number:0 (用这个就可以了)
  • batchId 这个是时间戳(毫秒),不用改。
  • 其他的参数不用动

注意:
在这里插入图片描述
content-type:text/pain 表示post的传入的参数应该是以文本形式。
我们用postmen来测试:
在这里插入图片描述
Header部分都可以不用,只要request payload的参数传进去了就行。

python代码

简单版:

https://github.com/taoxianpeng/python3_Spider/blob/master/MOOC_spider/main.py

带gui版:

https://github.com/taoxianpeng/python3_Spider/blob/master/MOOC_spider/ui.py
https://github.com/taoxianpeng/python3_Spider/blob/master/MOOC_spider/mooc_spider.py

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值