600行寫了個Python視頻下載器? 聊聊現(xiàn)在的B站視頻下載方法


先看看現(xiàn)在的B站視頻下載方法
大家刷B站的時候遇到想要下載下來的視頻。我們都知道電腦網(wǎng)頁上是不提供下載緩存功能的。
目前本人已知有以下幾種辦法下載緩存B站的視頻:
?手機APP緩存:這是官方的緩存功能,但是它所緩存下來文件是音視頻分開的兩個文件,且后綴是m4s,其實這個文件并不是什么加密后的文件,只是一般的MP4換了個擴展名,m4s文件用視頻播放器就可以直接打開,想要轉(zhuǎn)成我們正常本地觀看的視頻,需經(jīng)過音視頻合并操作。
?Win10?UWP客戶端緩存:這個也是官方的客戶端,雖然界面看起來相比手機APP比較簡陋,但它在某些功能上卻強于手機APP,比如視頻緩存。它可以緩存視頻為flv格式和mp4格式。mp4其實是和手機APP一樣會將音視頻分開下載,但它又可以在下載完成后自動將音視頻合并。
兩個官方客戶端在緩存視頻方面都有一個共同的缺點,他們緩存后的文件是按照稿件的aid(也就是av號),以及稿件下面每個分頁視頻的cid來存儲。這樣的方式方便程序進行識別,但對于下載的我們用戶進行歸檔非常不便。因為我們緩存的往往不會單個視頻,而是一系列。比如我需要從B站上緩存一部有100多個分P的視頻課程,每個P都有自己的子標題,用APP全部緩存后得到的是一個用aid命名的文件夾,里面又有1-100編號的子文件夾,每個文件夾內(nèi)又存著對應分頁視頻的音視頻和彈幕文件。雖然這樣用APP直接觀看沒什么問題,但這些文件依然在APP的管理下,APP隨時都有可能刪掉它們,所以我們就要自行復制出來歸檔,但一百個分頁,我不可能一個一個把它們的子標題手動重新加上。這需要下載時自動對它們重命名。

下面是兩個第三方的方法:
嗶哩嗶哩助手瀏覽器插件(https://github.com/bilibili-helper/bilibili-helper-o):這個直接在網(wǎng)頁上提供了下載按鈕,并擁有自動簽到,直播開播提醒等多種功能。但它不具備一次性下載一個稿件下所有分頁的功能,且目前版本無法緩存4K畫質(zhì)(這個下個版本會支持)

you-get?這個是個Python編寫的視頻下載器(https://github.com/soimort/you-get)。它不僅可以下載B站視頻,也支持其他網(wǎng)站,并可以導入cookie來下載會員內(nèi)容。但是它作為一個開源項目,支持的視頻網(wǎng)站基本是不同的coder貢獻代碼,導致其兼容程度層次不齊,有些網(wǎng)站已無法解析到視頻,卻已長時間得不到更新。雖然它對B站的支持性還算比較完善,在看過其針對B站的源碼后發(fā)現(xiàn)除去視頻它還能解析音樂資源,并且它下載得到的視頻文件也比較適合歸檔,但是他還是會有一定的bug:比如無法獲取會員畫質(zhì)的flv視頻,以及部分視頻無法獲得1080p60、720p60、1080p+畫質(zhì)。并且它的運行效率有點低。而且它是用命令操作的,雖然比較簡單且有充分的提示信息,但對小白并不友好。

正好之前研究了下B站下載視頻的接口:

雖然能達成下載的目的,但這直接調(diào)接口的方法,除去裝個B,好像沒啥用,我自己也不會日常用它來緩存視頻。這分明是給程序調(diào)用準備的啊。
于是就有了長達三周的Python下載器開發(fā)工程(三周才600行,主要時間用在測試上了),8月2日終于達成了初步目標

我的PythonB站視頻下載器
1.獲取
先放上下載地址:https://github.com/Daniel2022/bilibili-downloader-py/releases (下最新的)
優(yōu)先下載zip包,保證可運行,不需要另外安裝Python解釋器等其他支持

解壓到一個文件夾,會得到三個exe程序

不下載會員內(nèi)容,也還是建議導入一下cookie,這需要用火狐瀏覽器登錄下你的賬號
方法為視頻:BV1WT4y1j7XN?的2P?把cookies.sqlite文件復制到上面的文件夾里



雙擊downloader即可開啟,進入主界面

2.添加稿件(劇集)
所有輸入指令有提示(字母不區(qū)分大小寫)
現(xiàn)在還沒有添加稿件或者番劇集
鍵入“a”回車,進入添加界面

在添加界面可批量添加av號BV號以及劇集的ep_id season_id media_id
av號BV號好理解,劇集的標識又是什么?以超炮第一季舉例

我們進入觀看界面:

地址欄中為https://www.bilibili.com/bangumi/play/ss425/?ss425即season_id
任選一集觀看:

地址欄中為https://www.bilibili.com/bangumi/play/ep84340?ep84340為該集的ep_id
進入番劇介紹頁:

地址欄中為:https://www.bilibili.com/bangumi/media/md425?md425為該季media_id(這里的數(shù)值與season_id一致,而有新番會不一樣)
以上的三種編號在本程序中會均指向超炮第一季!
演示下:

3.全列表批量下載
添加好了輸入“x”返回主界面

剛才添加的已經(jīng)顯示出來了,這時候輸入指令“z”,并選擇畫質(zhì),會進入全列表下載:

最終程序目錄下會產(chǎn)生downloads目錄:(內(nèi)容類似)


當前版本批量下載僅可下載flv格式
4.單獨稿件劇集下載
從主界面輸入數(shù)字選擇:
由av或BV號添加的普通稿件會提示如下:

劇集會提示如下:

這時候輸入指令“a”會把當前稿件或劇集的所有P的flv下載下來,過程與之前全列表下載類似,視頻文件存檔形式與之前一樣,不做演示
單獨輸入數(shù)字選擇P或集,會先提示選擇畫質(zhì)(此時顯示的都是該視頻可用的畫質(zhì)),接下來會提示選擇封裝flv或者MP4(這個MP4和APP緩存一樣先分開下載音視頻再合并)
選flv會直接開始下載,選擇mp4程序會檢測該畫質(zhì)下是否存在h265編碼的視頻源(h265是B站正在測試的流媒體編碼,僅在移動APP或UWP客戶端上會使用,特點節(jié)省流量),如果存在會詢問是否下載h265編碼,否則會直接下載通用的h264編碼

最后關閉程序之前添加的內(nèi)容會被存儲下來,下次運行無需在此添加。
主要功能就介紹到這兒,其實還有些功能想做,比如稿件信息刷新功能。

本項目使用開源軟件aria2作下載內(nèi)核,ffmpeg合并音視頻
源碼倉庫:https://github.com/Daniel2022/bilibili-downloader-py
源碼中cookie處理部分引用了you-get以及@UnGrown?的https://github.com/mo-han/mo-han-toolbox中的相關函數(shù)。

這只是介紹我這小程序的基本功能使用。
后續(xù)會更新其的概念產(chǎn)生,設計的框架等更深的內(nèi)容,敬請期待。
Copyright @ZHY2020