共计 5432 个字符,预计需要花费 14 分钟才能阅读完成。
外围概要
笔者是一名无缘 211、985 名校的大专生。虽为大专生但我的人生格言 “别向这个世界认输 因为你还有个牛逼的幻想” 不容许我只是一名普普通通的大专生。
年关已过 复原正规
笔者为了晋升本身技术实力在 腾讯课堂 用了一些银子买了门课程,然而没想到的是马上就要开学了,而 腾讯课堂 的视频也只能在 APP 外部缓存下载观看,很显然这个规定解放了笔者。 作为将来互联网的开发人员面对这种解放当然是不能斗争的,于是就有了本专刊,本文章。
敢想敢做 不悔青春
上面我会以一名小白的角度来形容此次爬虫剖析,当然了 笔者也是一名小白但只是比小白略强那么一些而已。
指标剖析
爬虫剖析
个人信息
GET https://ke.qq.com/cgi-bin/use…
- 点击个人头像中的 个人信息 会触发此接口的调用
- 通过剖析此接口能够晓得 腾讯课堂 是以什么计划来解决 前端与后端交互平安认证的问题
- 当然有的小伙伴会想到应用
Session
来解决此问题,然而却疏忽了Session
这个货色是存储在服务端的,而客户端存储的是SessionId
当浏览器敞开的时候这个SessionId
就会隐没,而存储在服务端的Session
还会存在,这无疑是减少了服务端的压力,尽管在服务端做一些Session
的生效策略,但抛去这个问题不说,像这种大型的互联网我的项目服务端必然会是以集群的形式存在的,这个时候就须要思考到Session
的共享问题或者是Session
的绑定问题等等。 - 应用
Cookie
Token
解决此问题,Cookie
Token
是只存储在客户端的文件,这相比于Session
来说是比拟好的一种抉择,因为这个时候服务端只须要思考怎么解析和生成Cookie
Token
就能够了,而不须要思考像Session
的共享问题等等。当然这也是 大型互联网我的项目中前后端交互平安认证问题解决方案中一种业界支流的解决方案 - 通过剖析这个接口的
RequestHeaders
中能够发现,它采纳的是Cookie
来封装一些 认证信息 。当然了有懂Cookie
的小伙伴就有想法了,然而你要晓得笔者也不是憨憨,所以这里的Cookie
必定是过期的了。
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Content-Length: 2
Content-Type: application/json
Cookie: _ga=GA1.2.1045223782.1639395871; LF_ID=1639395871969-5650567-1016048; GCID=5a7e11c-5fdc6e0-ec86384-1cc8de6; GRID=5a7e11c-5fdc6e0-ec86384-1cc8de6; MEIQIA_TRACK_ID=24ixuWXpI5WXM68hM1n4NdW4IrF; _gcl_au=1.1.2051684781.1644253524; _gid=GA1.2.302668339.1645078454; MEIQIA_VISIT_ID=25EJkkTDspp5EBAfgoPEKy7mcbm; GCESS=BgsCBgAEBAAvDQAKBAAAAAAGBPiLPOANAQEMAQEDBBwlDmIHBC7OZx8JAQEBCDVaLAAAAAAAAgQcJQ5iBQQAAAAACAED; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%222906677%22%2C%22first_id%22%3A%2217f073deb255c7-09d380380dbee5-f791539-1327104-17f073deb261016%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_landing_page%22%3A%22https%3A%2F%2Ftime.geekbang.org%2F%22%2C%22%24latest_utm_source%22%3A%22time_web%22%2C%22%24latest_utm_medium%22%3A%22menu%22%2C%22%24latest_utm_campaign%22%3A%22timewebmenu%22%2C%22%24latest_utm_content%22%3A%22menu%22%2C%22%24latest_utm_term%22%3A%22timewebmenu%22%7D%2C%22%24device_id%22%3A%2217db39bc70f775-0956fde004162-4343363-2073600-17db39bc710104d%22%7D; Hm_lvt_59c4ff31a9ee6263811b23eb921a5083=1645080295,1645094172,1645096912,1645164399; gksskpitn=13b506d9-98e1-440a-8777-1641eb71065d; _gat=1; Hm_lpvt_59c4ff31a9ee6263811b23eb921a5083=1645164463; SERVERID=1fa1f330efedec1559b3abbcb6e30f50|1645164465|1645164401; gk_process_ev={%22count%22:7%2C%22target%22:%22%22%2C%22utime%22:1645164473299}
Host: account.geekbang.org
Origin: https://account.geekbang.org
Referer: https://account.geekbang.org/dashboard/info
sec-ch-ua: "Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36
我的课程
GET https://ke.qq.com/cgi-bin/use…
- 点击个人头像中的 我的课程 会触发此接口的调用
-
Request Body
page
页码count
每页数据
-
Response Body
retcode
响应状态码-
map_list.map_courses
数据信息cid
课程的 IDtname
课程名
{ "result": { "map_list": [{ "map_courses": [{ "recent_live_task": { "name": "張沖", "type": 1, }, "tname": "張沖", "cid": 739995653, }, {...}, {...}], "industry3_name": "别向这个世界认输 因为你还有个牛逼的幻想" }], "end": 0, "page": 1, "ts": 0 }, "retcode": 0 }
- 申请此接口的时候是须要携带
Cookie
、Referer
等申请头参数。 - 剖析此接口,别的不说 但 ResponseBody 中的
map_courses
汇合中的cid
属性必定是能帮忙笔者达到目标。 -
尽管外面有一些数据能够用到,然而这还不够具体,持续往下剖析。
课程详情
GET https://ke.qq.com/cgi-bin/get…
- 点击我的课程中的 具体课程 会触发此接口的调用
-
Request Body
course_id
课程 ID 下面接口所展现的cid
-
Response Body
retcode
响应码-
result
term_id
课程的班级 id
{ "result": { "739995653": { "term_id": 739995653, "name": "别向这个世界认输 因为你还有个牛逼的幻想", }, {...} }, "retcode": 0 }
- 申请此接口的时候是须要携带
Cookie
、Referer
等申请头参数。 - 剖析此接口,别的不说 但 ResponseBody 中的
result
汇合中的term_id
属性必定是能帮忙笔者达到目标。 -
尽管外面有一些数据能够用到,然而这还不够具体,持续往下剖析。.
班级课表
GET https://ke.qq.com/cgi-bin/cou…[739995653]
- 观看 具体课程的视频 会触发此接口的调用
-
Request Body
cid
课程 IDterm_id_list
班级列表
-
Response Body
retcode
响应码terms.name
班级名terms.cid
课程 ID-
terms.chapter_info
term_id
班级 IDcid
课程 IDsub_info
所有课程sub_info.video.vid
班级内的视频 ID
{
"result": {
"terms": [{
"chapter_info": [{
"ch_id": 739995653,
"sub_info": [{
"name": "張沖",
"term_id": 739995653,
"task_info": [{
"csid": 739995653,
"term_id": 739995653,
"video": {
"vid": "739995653",
"name": "别向这个世界认输 因为你还有个牛逼的幻想"
},
"cid": 739995653
}],
"cid": 739995653
}, {...}],
"term_id": 739995653,
"cid": 739995653
}],
"name": "張沖",
"cid": 739995653
}]
},
"retcode": 0
}
- 申请此接口的时候是须要携带
Cookie
、Referer
等申请头参数。 -
剖析此接口,最终咱们失去了视频的地址,因为视频采纳的是
HLS
协定的模式,因为小编的技术还没有倒退到全栈开发,所以对这个货色理解的不是很深,只晓得应用HLS
的形式会减少视频播放的晦涩度,同时还能够依据网络状况来动静切换清晰度。
其余一些列的操作 最终拿到了 M3U8 文件
尽管拿到了 M3U8 文件,然而真的能够下载吗?
- 上面只是
M3U8
文件的一部分,咱们来看一下。 - 这个文件的地址是存储在
hls_videos
外面的,通常HLS
这个协定所携带的数据都是加密的 - 在看
M3U8
文件头中的EXT-X-KEY
属性,它所采纳的加密算法是AES-128
- 尽管它加密了,但
M3U8
文件中也会有对应的解密文件,也就是URI
和VI
这两个属性。 - 当初市面上也有一些
M3U8
下载器 、 解析器 ,开源社区也有一些M3U8
下载器 、 解析器,这里就不过多解释了。 - 舒适提醒 : 腾讯视频 播放视频所用的
M3U8
文件并不是我在下面所拿到的文件,它应用到了腾讯云的HLS
服务,所以解密的步骤有些麻烦。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="...?combat.key",VI=0x00000000000000000000000000000000
#EXTINF:10.000000,
413092fce65236f43dcb599457923728-sd-encrypt-stream-00001.ts
#EXTINF:10.000000,
413092fce65236f43dcb599457923728-sd-encrypt-stream-00002.ts
#EXTINF:10.000000,
413092fce65236f43dcb599457923728-sd-encrypt-stream-00003.ts
#EXTINF:10.000000,
413092fce65236f43dcb599457923728-sd-encrypt-stream-00004.ts
笔者留言
- 下面所展现的一些数据都不是实在的数据
- 以上是小编对极客工夫爬虫剖析的所有分享
- 留神: 爬虫要有度 从入门到放弃 人生不易要及时放弃
- 最初: 别向这个世界认输 因为你还有个牛逼的幻想
**
技术交换群 577729045 (快来和小编一起探讨交换吧)
以上内容如有触犯 今致歉谢 恳望见原 请分割小编进行删除