ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

朋友深夜求助后,我用一小时把这个开源脚本变成了自己的“视频搬运工“

朋友深夜求助后,我用一小时把这个开源脚本变成了自己的“视频搬运工“ 朋友深夜求助后我用一小时把这个开源脚本变成了自己的视频搬运工【免费下载链接】bilibili-downloaderB站视频下载支持下载大会员清晰度4K持续更新中项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader上周六晚上十一点手机震了一下。是大学同学发来的语音语气有点急老哥我在平台买的付费课程下周就下架了二十多节课你说咋整我懂他的意思。有些在线内容买的时候是永久观看下架的时候却连招呼都不打。挂断电话我翻了下收藏夹发现自己攒的课程、纪录片、大会员专属的 4K 素材其实也都处在随时可能消失的状态里。于是我决定认真找一款能稳定把在线视频拉回本地的工具最后锁定了这个开源项目——bilibili-downloader一个支持 4K、批量、分P 下载的 Python 视频下载脚本。从装环境到把第一集跑通我花了一个小时这篇就把整个过程原原本本讲给你听。第一步先裸奔跑一次看看这工具到底有多莽大多数教程会劝你先配一堆东西再动手我不。我习惯先空手跑一把看看工具的真实脾气。git clone https://gitcode.com/gh_mirrors/bil/bilibili-downloader cd bilibili-downloader pip install -r requirements.txt依赖就四个库httpx 负责发请求、beautifulsoup4 解析页面、moviepy 合并音视频、tqdm 画进度条。Python 3.8 以上就能跑装完不会卡壳。然后我直接在config.py里放了一个普通视频链接敲下python main.py。终端先打印一行任务概况——待下载数量、并发模式、输出目录——然后就开始跑了。我盯着屏幕有点意外视频和音频竟然是两条进度条同时往下走的。查了下源码strategy/bilibili_executor.py原来普通视频走的是 DASH 格式画面和声音是分开的两个文件工具用异步并发同时抓最后再合并成一个 MP4。合并时机器上要是有 ffmpeg 就走 ffmpeg快基本秒合没有就退回 moviepy两条路都给你备好了。这一把跑下来第一印象是它把下载这件事当成一个正经流程在设计而不是写死几条请求就完事。480P 的坑是我翻源码翻出来的空手跑没问题但朋友要的是他那个会员才能看的清晰度。我换上自己的账号 Cookie 再试结果出来的文件名后面跟着清晰 480P——这就很不对劲了。我打开strategy/bilibili_executor.py想找找原因结果在_normalize_url这个函数里看到一段注释直接把答案写脸上了# 问题BV15FK6zTEuj?p2 会被重定向导致丢失会员状态返回480P # 解决规范化为 BV15FK6zTEuj/?p2避免重定向获取1080PB 站的链接有个小脾气BV号?p2这种不带斜杠的写法请求时会被重定向一重定向登录状态就丢了画质直接给你干到 480P。工具会自动把链接规范成带斜杠的格式。这个坑要是没人提醒新手真的会卡一晚上我当时就被这行注释救了。至于让工具认识你的会员身份就三步跟复制粘贴一样简单浏览器登录 B 站随便开个视频页按 F12 进开发者工具切到网络刷新页面点第一个请求在请求头里找到 Cookie整段复制进config.py的COOKIE变量唯一要记的是 Cookie 里的SESSDATA大约 30 天过期到期重新复制一遍就行别的都不用动。朋友那二十多节课我用一个列表全喂进去了Cookie 配好接下来就是往config.py的URL列表里塞链接。这个列表就是你的下载清单支持好几种写法URL [ # 普通视频直接贴 BV 号 https://www.bilibili.com/video/BV1xx123456/, # 分P视频只想要第2集就加 ?p2 https://www.bilibili.com/video/BV1xx654321/?p2, # 充电专属视频一样能下 https://www.bilibili.com/video/BV1xx789012/, ]我把他那二十几节课的分 P 链接全部按顺序排进去回车剩下的交给时间。这里顺便提一句工具默认最多同时下载 2 个视频每个视频内部音视频又是并发所以整体节奏稳而不乱不会因为一次性请求太多被平台限流。下载完自动合并、自动清理临时目录最后给你一张摘要表成功几个、失败几个、花了多久一目了然。挂机一晚后我发现它偷偷干了不少活第二天早上起来看结果二十多集一个没落下。但我真正想夸的是这次无人值守期间它自己扛下来的几件事第一断点续传。夜里网络抖了一下有个文件下到一半断了。重新跑的时候它先检查本地已有文件的大小然后从断点接着下而不是从头再来。源码里用的是 HTTP 的Range头从上次的字节数接着请求收到 416 状态码就直接判定这个文件已经下完了。对动辄几个 G 的大文件来说这功能是真的救命。第二自动重试。我翻了翻_download方法默认最多重试 5 次、每次间隔 5 秒网络抖动基本都被它自己消化了全程没让我操过心。第三失败兜底。万一真有下不动的它会把失败的 URL 原样写进failed_urls.txt你复制回去再跑一遍就行不用对着屏幕手抄地址。这几个细节加在一起才是我敢放心挂机睡觉的理由。万一以后想加新功能代码也不吓人下载完我顺手把整个项目结构看了一遍发现它用的是策略模式这一点值得单独说models/视频、分类的数据模型strategy/下载策略普通视频走DefaultStrategy番剧电影走BangumiStrategyconfig.py所有配置集中在一个文件改配置不用碰代码main.py入口用BFacade把抓取信息→下载→合并整个流程串起来想支持一种新的视频类型不用改老代码加一个策略类塞进_strategies字典就行。这是加代码而不是改代码的设计对想二次开发的人非常友好。最后说点实在的朋友的问题解决了他自己的感想是原来存下来的东西才是真正属于你的。折腾完这一小时我最大的感受是bilibili-downloader 把把在线内容变成本地资产这件事的门槛降到了会复制粘贴就行。它解决的不仅是下架焦虑更是让内容真正归你支配的自由——想存多久存多久想剪哪段剪哪段想在没网的飞机上慢慢看都行。你收藏夹里那些舍不得丢的课程和番剧与其等它们哪天悄悄消失不如花个把小时把它们稳稳搬进自己的硬盘里。【免费下载链接】bilibili-downloaderB站视频下载支持下载大会员清晰度4K持续更新中项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表