B站视频下载
看B站的時候,有時候看到很喜歡的總想下載下來,雖然APP里提供了下載,但奈何下載的格式不知道是什么格式,無法在其他播放器里看,于是就想下載到電腦本地播放。當然,就目前而言,WiFi和流量其實足以替代大部分硬件存儲。所以這個需求不是很高,只是個人愛好。
那么什么視頻是可以下載,什么視頻不能下載呢?可以這么說:只要你能在網(wǎng)頁觀看的視頻,都是可以下載的,因為你的瀏覽器接受到了視頻文件才能播放,而我們只需要獲取到這些文件就行。當然這依個人技術(shù)和網(wǎng)站,有些網(wǎng)站就是不讓你下載,層層加密,一般人破解不了,但這只是個別,大部分還是正常的,因為要層層加密網(wǎng)站開發(fā)可是要多出錢的。加密的話一般是將視頻的接口加密,也有在視頻文件上做手腳的。
現(xiàn)在我們就B站舉個例子。首先,打開某個視頻鏈接,按F12,然后將所有的數(shù)據(jù)清除,點擊播放視頻,這樣network里面就有很多數(shù)據(jù)
接著,我們一條一條數(shù)據(jù)看,直到你看到下面這樣的
那么,右邊的這些是什么意思呢,這是二進制數(shù)據(jù),所有以文本格式打開會顯示亂碼,這些大概率是視頻文件,圖片的話瀏覽器是會正常顯示的。我們接著看headers里的信息。
我們來解讀一下headers里面的信息
- Request URL: 發(fā)起請求的URL,視頻的下載地址
- Request Method: 請求的類型,視頻下載正常為GET
- Status Code: 狀態(tài)碼,206的話說明鏈接下的文件是支持range參數(shù)的,也就是說我請求頭里加一個range參數(shù),說明你想要文件的哪一段,這為文件的斷點續(xù)傳和多進程下載提供了便利
- Remote Address: 服務(wù)器地址,沒什么軟用
接著看響應(yīng)頭(response headers):
- Content-Length: 返回文件長度
- Content-Range: bytes4389834-4589025/24268406 (文件位置和總長度,單位字節(jié))
- content-type: video/mp4 ,文件類型
這三個是我們看中的,其他沒什么用
請求頭(requests headers)
Provisional headers are shown ,這句話是谷歌瀏覽器的毛病,只會顯示一部分請求頭,如果爬蟲不會返回數(shù)據(jù),則需要使用抓包軟件查看完整請求頭了
Origin: 值不重要,加入爬蟲頭信息就行
Range:bytes=4389834-4589025 ,你要請求的數(shù)據(jù)
Referer:訪問的上一個頁面,一般會動態(tài)構(gòu)建,比如av地址
User-Agent: 這個不多說
我們先分析URL是怎么來的,看一下沒什么規(guī)律,應(yīng)該不是動態(tài)構(gòu)建的(如果是則需要查看想要js代碼),那么要么是通過接口返回的,要么是在從原網(wǎng)頁中和網(wǎng)頁結(jié)構(gòu)一起返回的,比如https://www.bilibili.com/video/av49336067/。我們先刷新一下頁面,將請求URL為https://www.bilibili.com/video/av49336067/鏈接的response的內(nèi)容負責到記事本,Ctrl+f搜索剛才視頻的鏈接,如果沒有則搜索鏈接里面的一些關(guān)鍵詞,應(yīng)該有可能數(shù)據(jù)在js里面,然后動態(tài)構(gòu)建的。
接著今天教材結(jié)束,因為視頻鏈接確實在網(wǎng)頁返回的數(shù)據(jù)中,不過當一個網(wǎng)頁含有多個視頻的時候,就有一點小小的區(qū)別,這時候網(wǎng)頁數(shù)據(jù)里沒有視頻鏈接,需要帶上aid和cid請求另一個接口得到視頻的下載地址,這里就不多說了,具體看代碼或者自己去嘗試。B站沒有任何加密很簡單。
代碼:https://github.com/kanadeblisst/BDVideo
最后,我正在學習一些機器學習的算法,對于一些我需要記錄的內(nèi)容我都會分享到博客和微信公眾號,歡迎關(guān)注。平時的話一般分享一些爬蟲或者Python的內(nèi)容。
總結(jié)
- 上一篇: jquery ajax load
- 下一篇: Docker开启远程安全访问