作者:段小草 链接:https:www。zhihu。comquestion486484268answer2911872392 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 人之所以区别于动物,是会使用工具。现成的工具有太多了,程序员更倾向于不重复造轮子。直接使用youget 题主只说了使用Python,没说具体如何使用。众所周知,youget所有代码都是由Python完成的。 除了B站,youget还支持几乎所有市面主流的视频网站。 使用方法也非常简单。 安装:pipinstallyouget 使用youget视频链接 作为命令行工具,youget也提供了丰富的可供选择,比如选择分辨率、查看视频信息等,详见Github仓库: https:github。comsoimortyougetgithub。comsoimortyouget分析youget源码 如果题主不单单是为了工具,而是想自己写代码,或者是为了完成某门作业之类的。比较快捷的做法是去查看youget源码中关于B站的部分。不过可能会缺少下载的部分,因为youget的下载器是同一的,bilibili。py更偏向于视频播放地址的解析。 详见: https:github。comsoimortyougetblob1c841f7e8ce60130572a8f03fb038eda99deff6asrcyougetextractorsbilibili。pygithub。comsoimortyougetblob1c841f7e8ce60130572a8f03fb038eda99deff6asrcyougetextractorsbilibili。py自己观察视频加载播放 如果题主不想吃做好的饭,非要挑战自己,尝试重新造轮子的话。那就需要自己去找真实的播放链接了。 一般来讲,获取网站的视频播放有几种方式: 最简单的情况下,直接查看network,会看到一个体积巨大的请求,右键,在新链接打开,直接下载就是了。 一些网站会把视频切割成。ts的分段文件,然后用一个。m3u8的文件,可以下载所有的。ts文件后进行拼接重新输出。(可以搜索m3u8ts拼接这些关键字,这里不展开了) 在源码里分析,看会不会找到真实播放地址的线索,等等。 我之前设想过一个工作流:自动监测某个账号的视频更新下载视频语音转文字摘要成笔记。因为现在长视频的内容太多了,其中确实有一些优秀视频,但看视频远比图文费时间,其中的主要内容还不能直接复制粘贴整理。不过后来由于懒一直没有执行 发布于2023022616:37IP属地河南 赞同192条评论分享收藏喜欢收起更多回答 拾柒 合格证书 关注前言 嗨喽,大家好呀这里是爱看美女的茜茜呐 又到了学Python时刻 现在好看的妹子真的太多啦 如何一次性把这些好看的视频全保存下来捏? 开发环境:版本:python3。8编辑器:pycharm2022。3。2专业版requestspipinstallrequestsffmpeg音视频合成软件(源码、教程、文档、软件点击此处跳转跳转文末名片加入君羊,找管理员小姐姐领取呀) 实现一个案例的流程: 一。思路分析 案例的分析视频media。mp4。mp3。m4am3u8视频流 。m4s:视频音频格式 数据来源分析:找到视频内容 network抓包 二。代码实现(代码实现基本流程)发送请求使用代码的方式访问网站获取数据取出网页源代码解析数据提取视频链接保存数据 代码展示 PS:完整源码如有需要的小伙伴可以加下方的群去找管理员免费领取 导入模块importrequestsimportre正则表达式模块importjsonimportpprintimportsubprocessimportos 伪装(请求头)headers{用户信息cookie:buvid3355AA3006A6104E5A05CE891D886F69632716infoc;bnut1675085932;iwannagoback1;uuid387EA3810FBF5E92C827E2510B578C5B9A33232infoc;buvid415C69C98F6A7EC6A872FE69C1840DD6D337240230130211pW1w45e5fZS9RtebDiGZw3D3D;nostalgiaconf1;CURRENTFNVAL4048;rpdid(kmJYk))lY0JuYl)lmY;SESSDATA17eb9f1a2C16907828782C6a25c2A22;bilijct4af9076b42f76603dfe4cf018ad2000f;DedeUserID422789639;DedeUserIDckMd5fc4901c78719b545;CURRENTQUALITY80;but5;blsid51ED8F1051861C3EEC10;themestylelight;is2022channel1;sid66dafqju;fingerprint97ca5a8b555e63aca787c9cd27273c7e;buvidfpplainundefined;buvidfp8cc52ae38b592ff26dc2b393eebd890b;PVID2;innersign1;bpvideooffset422789639758803412994228200,防盗链referer:https:www。。com,浏览器基本信息useragent:Mozilla5。0(WindowsNT10。0;Win64;x64)AppleWebKit537。36(KHTML,likeGecko)Chrome109。0。0。0Safari537。36} 发送请求urlhttps:www。。comvideoBV1qv4y1k7UE?vdsource8f216a44bce0dbe14e3447c34c2ab3e2responserequests。get(url,headersheaders) 获取数据htmldataresponse。text 解析数据jsonstrre。findall(playinfo(。?)script,htmldata)〔0〕h1。?(。?)h1titlere。findall(h1。?(。?)h1,htmldata)〔0〕Python基础字典jsondatajson。loads(jsonstr)pprint。pprint(jsondata)audiourljsondata〔data〕〔dash〕〔audio〕〔0〕〔baseUrl〕print(audiourl)videourljsondata〔data〕〔dash〕〔video〕〔0〕〔baseUrl〕print(videourl) 保存数据audiodatarequests。get(audiourl,headersheaders)。contentwithopen(f{title}。mp3,modewb)asf:f。write(audiodata)videodatarequests。get(videourl,headersheaders)。contentwithopen(f{title}。mp4,modewb)asf:f。write(videodata)ffmpegfffmpegi{title}。mp4i{title}。mp3acodeccopyvcodeccopy{titleout。mp4}subprocess。run(ffmpeg)os。remove(f{title}。mp4)os。remove(f{title}。mp3) 尾语 感谢你观看我的文章呐本次航班到这里就结束啦 希望本篇文章有对你带来帮助,有学习到一点知识 躲起来的星星也在努力发光,你也要努力加油(让我们一起努力叭)。 发布于2023021022:56 赞同添加评论分享收藏喜欢收起 苛岚异梦 关注 5人赞同了该回答一:由于哔哩哔哩的视频文件和音频文件是分离的,所有这里分别下载后在使用ffmepg进行合成 ffmpeg官网下载https:ffmpeg。org(下载后需要配置环境变量)需要重启!链接:https:pan。baidu。coms1aDSlIQ1kPOOUsVOAmcFfHw提取码:gvw4 gitee地址https:gitee。comddpoibili 博客地址https:www。ddblog。xyzarticles53欢迎大佬前来指点importtimeimportrequestsimportreimportosimportsubprocessimportsys,iosys。stdoutio。TextIOWrapper(sys。stdout。buffer,encodinggb18030)headers{referer:https:www。bilibili。comvideoBV1J3411h7pm?spmidfrom333。5。0。0,useragent:Mozilla5。0(WindowsNT10。0;Win64;x64)AppleWebKit537。36(KHTML,likeGecko)Chrome97。0。4692。99Safari537。36Edg97。0。1072。69}获取视频bviddefgetbvid(mid,path):这里ps30,是一页的视频数量,pn代表页数,可以自己加一个循环urlhttps:api。bilibili。comxspacearcsearch?mid{}ps30tid0pn1keywordorderpubdatejsonpjsonp。format(mid)responserequests。get(urlurl,headersheaders)。json()mmresponse〔data〕〔list〕〔vlist〕foriinmm:title(i〔title〕)bvid(i〔bvid〕)print(title)print(bvid)getcid(bvid,title,path)获取ciddefgetcid(bvid,title,path):urlhttps:api。bilibili。comxplayerpagelist?bvid{}jsonpjsonp。format(bvid)responserequests。get(urlurl,headersheaders)。json()nnresponse〔data〕foriinnn:cid(i〔cid〕)print(cid)getvideo(bvid,cid,title,path)获取视频,音频的urldefgetvideo(bvid,cid,title,path):urlhttps:api。bilibili。comxplayerplayurl?cid{}bvid{}qn120typeotypejsonfourk1fnver0fnval4048session521a3c69be48043423dab7dfacc0dfde。format(cid,bvid)responserequests。get(urlurl,headersheaders)。json()videourlresponse〔data〕〔dash〕〔video〕〔0〕〔baseUrl〕audiourlresponse〔data〕〔dash〕〔audio〕〔0〕〔baseUrl〕print(audiourl)print(videourl)save(title,videourl,audiourl,path)保存视频,音频文件,(下载时文件名取第一个字符,防止含有特殊符号而报错)defsave(title,videourl,audiourl,path):try:videorequests。get(urlvideourl,headersheaders)withopen(pathtitle〔:1〕。mp4,ab)asf:f。write(video。content)print({}下载完成。。。。。format(title。mp4))audiorequests。get(urlaudiourl,headersheaders)withopen(pathtitle〔:1〕。mp3,ab)asf:f。write(audio。content)print({}下载完成。。。。。format(title。mp3))except:passvideoadd(title,path)由于有些up主视频标题包含特殊字符,例如?等。所以需要将这些字符过滤出去将下载的视频,音频进行合成defvideoadd(title,path):intab?。:forsinintab:ifsintitle:将特殊字符转化为空格print(s)titletitle。replace(s,)如果程序异常,选择忽略try:print(title)print(开始合成)os。chdir(path)cmdfffmpegi{title〔:1〕}。mp4i{title〔:1〕}。mp3c:vcopyc:aaacstrictexperimental{title〔:1〕}1。mp4print(cmd)subprocess。call(cmd,shellTrue)选择是否删除原mp3、mp4文件os。remove(title〔:1〕。mp4)os。remove(title〔:1〕。mp3)os。rename(title〔:1〕1。mp4,title。mp4)print(合成结束)except:pass判断输入的是mid还是视频链接defmain(mid,path):ifmid:print(错误,请重新输入)mid输入不能为空returnFalseifre。match(r〔azAZ〕,mid):用正则来判断输入的mid类型bvid(mid。split(?)〔0〕)。split()〔4〕取出视频链接中的bvidprint(bvid)titleinput(请输入视频名称:)手动指定视频名称getcid(bvid,title,path)else:getbvid(mid,path)ifnamemain:midinput(请输入up主的mid或视频链接:)print(路径一定要加,默认为当前目录)filepathinput(请输入保存文件路径:)输入文件路径iffilepath:path。else:pathfilepathmain(mid,path)