寫在最前:互聯網並非法外之地,爬蟲僅供技術交流(王道論壇已經在顯眼的地方聲明課程嚴禁任何形式的錄制、傳播和分享,所以下載自己觀看就是了,不要用於盈利用途)
目標
- 在PC端播放和下載王道論壇H5應用的視頻
本篇文章的主要目的是為了分享PC端播放以及下載王道計算機考研課程的方法,用於大家通過PC端進行學習。主要是遇到一些公眾號通過這些扒來的視頻課件資源騙關注,我實在看不下去才寫了這篇博客,希望大家不要被賺信息差價。再次提醒,請不要用於盈利用途,想獲取課程可以通過購買正版圖書兌換。
以“秒懂百科”為例介紹一下HLS(M3U8)格式
關於HLS(HTTP Live Streaming)網上的介紹還是很多的,這里貼一下百度百科。
因為之前看其他的一些博客的時候,很多人會把M3U8解釋成一種視頻格式。其實M3U8只是個普通的文本文件而已,這種格式准確來說是HLS。一份標准的HLS視頻應該是包含兩個部分的,一部分是索引(也就是M3U8文件),一部分是存儲視頻數據的文件(TS文件)。
接下來以秒懂百科為例介紹一下HLS的實際表現形式。
HLS可能有兩級索引或者一級索引。一般來講,視頻是有分辨率的區別的,所以在兩級索引中,第一級索引常用於區分不同的分辨率,第二級索引常用於索引同一分辨率的視頻切片。當用戶選擇分辨率之后,系統根據第一級索引選擇該分辨率對應的第二級索引,然后根據第二級索引的視頻順序播放視頻。
一、“秒懂百科”的視頻文件
這是“秒懂百科”的部分文件,只有1KB左右大小的是索引文件(這不是區分依據,主要還是看文件實質內容),超過100KB的是視頻切片文件。
1、一級索引內容
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=1716000,RESOLUTION=720x1280
2d3ea97f16ad1d6fb558a51066b39469_720x1280_1716000.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=836000,RESOLUTION=480x852
2d3ea97f16ad1d6fb558a51066b39469_480x852_836000.m3u8
#EXT-X-ENDLIST
2、二級索引內容
-
2d3ea97f16ad1d6fb558a51066b39469_720x1280_1716000.m3u8
#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:13 #EXTINF:12.500000, 2d3ea97f16ad1d6fb558a51066b39469.m3u8.0.0.ts #EXTINF:8.333333, 2d3ea97f16ad1d6fb558a51066b39469.m3u8.0.1.ts #EXTINF:12.500000, 2d3ea97f16ad1d6fb558a51066b39469.m3u8.0.2.ts #EXTINF:8.333333, 2d3ea97f16ad1d6fb558a51066b39469.m3u8.0.3.ts #EXTINF:8.333333, 2d3ea97f16ad1d6fb558a51066b39469.m3u8.0.4.ts #EXTINF:1.733333, 2d3ea97f16ad1d6fb558a51066b39469.m3u8.0.5.ts #EXT-X-ENDLIST
-
2d3ea97f16ad1d6fb558a51066b39469_480x852_836000.m3u8
#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:13 #EXTINF:12.500000, 2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.0.ts #EXTINF:8.333333, 2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.1.ts #EXTINF:12.500000, 2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.2.ts #EXTINF:8.333333, 2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.3.ts #EXTINF:8.333333, 2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.4.ts #EXTINF:1.733333, 2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.5.ts #EXT-X-ENDLIST
3、視頻切片內容
-
2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.0.ts
TS文件也是一種常見的視頻數據文件,可以用video標簽進行播放。蘋果的QuickTime Player和其他主流播放器也都可以對他進行播放。
二、“秒懂百科”的視頻下載及合並
1、視頻鏈接的查找
播放視頻,可以在控制台的network觀察到相關文件,通過過濾就可以選取m3u8或者m3u文件。
“秒懂百科”——端午節的鏈接是這樣的:https://baikevideo.cdn.bcebos.com/media/mda-OgBFtPA8lgXMtZ6Q/2d3ea97f16ad1d6fb558a51066b39469.m3u8
2、視頻下載及合並
-
python
import requests, re from tqdm import tqdm baseUrl = "https://baikevideo.cdn.bcebos.com/media/mda-OgBFtPA8lgXMtZ6Q/" res = requests.get(baseUrl+"2d3ea97f16ad1d6fb558a51066b39469.m3u8") # 解析一級索引 resStr = res.text matchRes = re.findall(r"#EXT-X-STREAM-INF:BANDWIDTH=([^,]*),RESOLUTION=([^x]*)x([^\n]*)\n([^\n]*)\n", resStr, re.DOTALL) indexRes = [] for m in matchRes: indexRes.append({ 'BANDWIDTH': int(m[0]), 'HEIGHT': int(m[1]), 'WIDTH': int(m[2]), 'FileName': m[3], }) for index in indexRes: res = requests.get(baseUrl+index['FileName']) # print(res.text) # 解析二級索引 resStr = res.text matchRes = re.findall(r"#EXTINF:([^,]*),\n([^\n]*)\n", resStr, re.DOTALL) videoRes = [] print("正在下載並合成"+index['FileName']) pbar = tqdm(total=len(matchRes), initial=0, unit_scale=True) for m in matchRes: videoRes.append({ 'TIME': float(m[0]), 'FileName': m[1], }) res = requests.get(baseUrl+m[1]) with open(index['FileName']+".ts", "ab") as f: f.write(res.content) pbar.update(1)
這里並不能通過簡單的讀寫文件進行文件類型轉化。因為之前也看到有人的博客寫可以通過讀寫文件將TS合成MP4文件,這其實是不對的,實際上播放器在播放的時候還是把合成的文件當成TS文件,那些依靠后綴名來識別文件的播放則無法對合成的文件進行正確解碼播放。
TS文件的壓縮編碼方法我沒有仔細了解過,但MP4文件的壓縮效率肯定是比TS高的。
-
ffmpeg
ffmpeg -i https://baikevideo.cdn.bcebos.com/media/mda-OgBFtPA8lgXMtZ6Q/2d3ea97f16ad1d6fb558a51066b39469_720x1280_1716000.m3u8 2d3ea97f16ad1d6fb558a51066b39469.mp4
使用ffmpeg可以更簡潔一些,通過m3u8文件就可以下載。不過轉MP4需要花點時間,如果不想轉可以把后綴名改成ts。
前面介紹這兩種方法實質也是在比較下載視頻壓縮與否的優劣。
如果要考慮磁盤空間,則可以把下載的視頻轉碼成MP4文件,但是編碼需要花費較多的時間;
如果要考慮下載效率,則可以把下載的視頻直接合成,就是占用空間大一點。
以《數據結構》為例進行視頻下載
然后回到這篇博客的主題,在PC端播放和下載王道的視頻。
一、在PC端播放王道的視頻
因為王道PC端播放視頻會出現播放不了的情況,所以特意開一小節記錄這個問題。
1、通過微信的瀏覽器進行播放
2、通過Safari瀏覽器進行播放
有時不想在電腦上登陸微信,就可以通過這樣播放視頻。
-
輸入鏈接
-
掃描二維碼登陸
-
這個時候播放視頻會很卡,甚至無法播放,需要切成響應式設計模式,可以正常播放。
二、在PC端下載王道的視頻
王道的視頻只有一級索引,所以直接拿一級索引的鏈接就好。
另外還在URL參數帶上了時間戳的16進制表示和用戶標識等信息:t=60c7132f&exper=0&us=XXXX&sign=XXXXXXXX
因為帶上了這些信息,字符串中出現了&
。我們需要在撰寫shell腳本的時候加上單引號。
ffmpeg -i 'https://encrypt-k-vod.xet.tech/9764a7a5vodtransgzp1252524126/54892dc95285890816205535660/drm/voddrm.token.MzI0ZTRkMGE3ZTNjZDRlMFN0aVpLN2hQTjVocU1HYW5tRno1aHRqQSs2cFNtSnpJanBxdUJuLzQyV2IydjQ2SA.v.f421220.m3u8?t=60c717e5&exper=0&us=XXX&sign=XXXXXX' out.mp4
如果需要批量下載的話,可以分析一下課程主頁的list什么的。
最后評價一下王道的課吧。王道課程質量一般,應付考研這樣子而已。真的想要好好學習計算機相關知識,看看黑皮書什么的比這種課強多了。當然啦,當成考研復習大綱來看是沒什么問題的。