下載深度解析:asyncio與信號(hào)量如何高效控制批量下載不翻車)
bilibili-downloader異步并發(fā)下載深度解析asyncio與信號(hào)量如何高效控制批量下載不翻車【免費(fèi)下載鏈接】bilibili-downloaderB站視頻下載支持下載大會(huì)員清晰度4K持續(xù)更新中項(xiàng)目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloaderbilibili-downloader 是一款 B站視頻下載器支持大會(huì)員 4K 高清晰度、批量下載與分P視頻。它的核心賣點(diǎn)之一就是基于 asyncio 的異步并發(fā)下載——通過信號(hào)量Semaphore精準(zhǔn)控制并發(fā)數(shù)量讓同時(shí)下載多個(gè)視頻時(shí)既快又不翻車。這篇文章帶你輕松讀懂它背后的并發(fā)設(shè)計(jì)。為什么批量下載容易翻車批量下載視頻時(shí)新手最常遇到兩類問題全速并發(fā) → 被限流一口氣發(fā)起幾十個(gè)請(qǐng)求帶寬被瓜分每個(gè)都變慢甚至觸發(fā)超時(shí)、連接被拒串行下載 → 太慢一個(gè)下載完再下一個(gè)10 個(gè) 1080P 視頻要等幾個(gè)小時(shí)。bilibili-downloader 的解法是有限并發(fā)讓固定數(shù)量的下載任務(wù)同時(shí)跑某個(gè)任務(wù)完成后再補(bǔ)一個(gè)新的進(jìn)來兼顧速度與穩(wěn)定。三層并發(fā)架構(gòu)總覽整個(gè)下載流程分布在幾個(gè)核心模塊中職責(zé)清晰模塊職責(zé)main.py調(diào)度入口創(chuàng)建并發(fā)任務(wù)、控制并發(fā)數(shù)、輸出下載摘要strategy/bilibili_executor.py抓取視頻信息、執(zhí)行下載、合并音視頻strategy/default.py普通視頻BV號(hào)解析策略strategy/bangumi.py番劇/電影解析策略models/video.py視頻數(shù)據(jù)模型與清晰度映射config.pyCookie、待下載 URL 列表、輸出目錄配置并發(fā)控制分為三層層層設(shè)防批量級(jí)Semaphore 限制同時(shí)下載的視頻數(shù)默認(rèn) 2 └── 視頻級(jí)每個(gè)視頻的音頻視頻流并行下載asyncio.gather └── 文件級(jí)斷點(diǎn)續(xù)傳 失敗自動(dòng)重試最多 5 次信號(hào)量Semaphore并發(fā)控制的核心打開 main.py核心邏輯只有短短幾行semaphore asyncio.Semaphore(max_concurrent) # 默認(rèn) 2 async def download_with_limit(url): async with semaphore: await self.download_single(url) tasks [download_with_limit(url) for url in urls] await asyncio.gather(*tasks)用一句通俗的話解釋信號(hào)量就像停車場(chǎng)入口的閘機(jī)。asyncio.Semaphore(2)表示最多只有 2 個(gè)車位所有下載任務(wù)先排隊(duì)拿到車位才能開始誰下載完誰歸還空出的車位立刻給下一個(gè)任務(wù)。這樣做的好處速度可控帶寬集中在少數(shù)任務(wù)上每個(gè)視頻都能跑滿網(wǎng)速永不超時(shí)不會(huì)因請(qǐng)求過密觸發(fā) B 站限流或連接超時(shí)動(dòng)態(tài)補(bǔ)位任務(wù)完成即補(bǔ)新任務(wù)全程無空窗期。max_concurrent在 main.py 中默認(rèn)為 2網(wǎng)絡(luò)好可以調(diào)高到 3~4網(wǎng)絡(luò)差建議保持 2。鎖Lock讓共享資源井井有條多任務(wù)同時(shí)跑共享數(shù)據(jù)就容易出現(xiàn)競(jìng)爭(zhēng)條件。項(xiàng)目用三把 asyncio 鎖精準(zhǔn)保護(hù)_lockmain.py保護(hù)成功/失敗視頻列表的寫入保證摘要統(tǒng)計(jì)不串行錯(cuò)亂_counter_lockstrategy/bilibili_executor.py保護(hù)視頻編號(hào)計(jì)數(shù)器確保每個(gè)任務(wù)拿到的編號(hào)唯一不重復(fù)_print_lockstrategy/bilibili_executor.py保護(hù)終端輸出多個(gè)任務(wù)的打印不會(huì)互相穿插成亂碼。 小提示asyncio 的鎖是異步鎖等待期間事件循環(huán)可以繼續(xù)調(diào)度其他任務(wù)不會(huì)像傳統(tǒng)線程鎖那樣把整個(gè)程序卡死。音視頻并行單視頻內(nèi)的第二層并發(fā)B 站高清晰度視頻采用 DASH 格式音頻和視頻是兩條獨(dú)立的流。在 strategy/bilibili_executor.py 中項(xiàng)目用一個(gè)asyncio.gather讓兩路同時(shí)下載 視頻流可能高達(dá) 4K 音頻流通常更小、更快兩者并行完成后才判定該視頻下載成功隨后由 strategy/bilibili_executor.py 中的VideoMerge調(diào)用 ffmpeg 無損合并-c copy不重新編碼速度極快。若系統(tǒng)沒有 ffmpeg會(huì)自動(dòng)回退到 moviepy 方案。斷點(diǎn)續(xù)傳 自動(dòng)重試單文件級(jí)的保險(xiǎn)絲即使并發(fā)控制得再好網(wǎng)絡(luò)抖動(dòng)仍可能發(fā)生。strategy/bilibili_executor.py 中的_download方法為每個(gè)文件再加了雙保險(xiǎn)自動(dòng)重試捕獲網(wǎng)絡(luò)錯(cuò)誤后最多重試 5 次每次間隔 5 秒斷點(diǎn)續(xù)傳每次請(qǐng)求都帶上Range: bytes已下載字節(jié)-請(qǐng)求頭中斷后從斷點(diǎn)繼續(xù)已下載的幾 GB 不會(huì)白費(fèi)進(jìn)度可見基于 tqdm 的實(shí)時(shí)進(jìn)度條多任務(wù)進(jìn)度互不干擾??焖偕鲜秩酵瓿膳?4K 下載第 1 步安裝依賴pip3 install -r requirements.txt依賴清單見 requirements.txt核心是 httpx異步 HTTP 客戶端、beautifulsoup4頁面解析、tqdm進(jìn)度條。第 2 步配置 Cookie約 30 天更新一次登錄 B 站后按F12打開開發(fā)者工具 → 網(wǎng)絡(luò)Network→ 刷新頁面 → 點(diǎn)擊第一個(gè)請(qǐng)求在 Request Headers 的 cookie 中找到SESSDATA完整復(fù)制 cookie 值粘貼到 config.py 的COOKIE變量中第 3 步添加視頻 URL 并運(yùn)行在 config.py 的URL列表中粘貼要下載的視頻地址支持分P參數(shù)?p2然后執(zhí)行python main.py運(yùn)行結(jié)束后會(huì)輸出下載摘要成功/失敗數(shù)量、總用時(shí)。若有失敗的視頻項(xiàng)目會(huì)自動(dòng)把它們的 URL 導(dǎo)出到failed_urls.txt直接復(fù)制回URL列表重試即可無需手動(dòng)記錄。下載失敗先檢查這三處現(xiàn)象常見原因解決辦法清晰度只有 480PCookie 過期或 URL 被重定向更換 Cookie檢查 URL 中/BV號(hào)后是否有斜杠項(xiàng)目會(huì)自動(dòng)規(guī)范化見 strategy/bilibili_executor.py反復(fù)超時(shí)并發(fā)數(shù)過高或網(wǎng)絡(luò)不穩(wěn)調(diào)低max_concurrent斷點(diǎn)續(xù)傳會(huì)自動(dòng)續(xù)上提示地區(qū)限制番劇版權(quán)限制換無地區(qū)限制的片源或檢查網(wǎng)絡(luò)出口清晰度的完整映射8K → 360P定義在 models/video.py其中 126 對(duì)應(yīng)杜比視界 4K、120 對(duì)應(yīng)超清 4K??偨Y(jié)并發(fā)不翻車的三個(gè)設(shè)計(jì)要點(diǎn)信號(hào)量限流asyncio.Semaphore把并發(fā)數(shù)鎖在固定值速度與穩(wěn)定兼得多層鎖保護(hù)列表、計(jì)數(shù)器、輸出各加一把異步鎖共享數(shù)據(jù)零競(jìng)爭(zhēng)失敗自愈斷點(diǎn)續(xù)傳 5 次重試 失敗 URL 自動(dòng)導(dǎo)出任何單次抖動(dòng)都不會(huì)毀掉整批任務(wù)。這套批量級(jí)信號(hào)量 視頻級(jí) gather 文件級(jí)重試的三層并發(fā)模型不只適用于 B 站下載也是所有批量 IO 任務(wù)文件同步、數(shù)據(jù)抓取都值得參考的通用模式。【免費(fèi)下載鏈接】bilibili-downloaderB站視頻下載支持下載大會(huì)員清晰度4K持續(xù)更新中項(xiàng)目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考