几年前的做法了,现在可能页面元素变了,思路可以学习!
分析
先从这个网址开始分析
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