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