做者:段小草链接:https://www.zhihu.com/question/486484268/answer/2911872392来源:知乎著做权归做者所有。贸易转载请联络做者获得受权,非贸易转载请说明出处。

人之所以区别于动物,是会利用东西。现成的东西有太多了,法式员更倾向于不反复造轮子。

间接利用 YOU-get

题主只说了利用 Python,没说详细若何利用。寡所周知, you-get 所有代码都是由 Python 完成的。

如何用 Python 爬虫实现哔哩哔哩视频下载?  第1张

除了 B站,you-get 还撑持几乎所有市道支流的视频网站。

如何用 Python 爬虫实现哔哩哔哩视频下载?  第2张

利用办法也十分简单。

安拆:

pip install you-get

利用

$ you-get 视频链接

做为号令行东西,you-get 也供给了丰硕的可供选择,好比选择分辩率、查看视频信息等,详见 Github 仓库:

https://github.com/soimort/you-getgithub.com/soimort/you-get

阐发 you-get 源码

若是题主不但单是为了东西,而是想本身写代码,或者是为了完成某门功课之类的。比力快速的做法是去查看 you-get 源码中关于 B站的部门。不外可能会贫乏下载的部门,因为 you-get 的下载器是统一的,bilibili.py 更偏向于视频播放地址的解析。

详见:

https://github.com/soimort/you-get/blob/1c841f7e8ce60130572a8f03fb038eda99deff6a/src/you_get/extractors/bilibili.pygithub.com/soimort/you-get/blob/1c841f7e8ce60130572a8f03fb038eda99deff6a/src/you_get/extractors/bilibili.py

本身察看视频加载播放

若是题主不想吃做好的饭,非要挑战本身,测验考试从头造轮子的话。那就需要本身去找实在的播放链接了。

一般来讲,获取网站的视频播放有几种体例:

①最简单的情况下,间接查看network,会看到一个别积庞大的恳求,右键,在新链接翻开,间接下载就是了。

②一些网站会把视频切割成 .ts 的分段文件,然后用一个 .m3u8 的文件,能够下载所有的 .ts 文件后停止拼接从头输出。(能够搜刮 m3u8 ts 拼接那些关键字,那里不展开了)

③在源码里阐发,看会不会找到实在播放地址的线索,等等。

我之前设想过一个工做流:主动监测某个账号的视频更新-下载视频-语音转文字-摘要成条记。因为如今长视频的内容太多了,此中确实有一些优良视频,但看视频远比图文费时间,此中的次要内容还不克不及间接复造/粘贴整理。不外后出处于懒不断没有施行…

发布于 2023-02-26 16:37・IP 属地河南

​附和 19​​2 条评论​分享​保藏​喜好​收起​

更多答复如何用 Python 爬虫实现哔哩哔哩视频下载?  第3张

拾柒

合格证书

​ 存眷

媒介

嗨喽,各人好呀~那里是爱看美女的茜茜呐

又到了学Python时刻~

如何用 Python 爬虫实现哔哩哔哩视频下载?  第4张

如今都雅的妹子实的太多啦~

若何一次性把那些都雅的视频全保留下来捏?

如何用 Python 爬虫实现哔哩哔哩视频下载?  第5张

开发情况:版 本: python 3.8编纂器: pycharm 2022.3.2 专业版requests >>> pip install requestsffmPEg 音视频合成软件( 源码、教程、文档、软件点击此处跳转跳转文末手刺参加君羊,找办理员蜜斯姐领取呀~ )

如何用 Python 爬虫实现哔哩哔哩视频下载?  第6张

实现一个案例的流程:

一. 思绪阐发

案例的阐发 视频 media .mp4 .mp3 .m4a m3u8视频流

.m4s: 视频/音频 格局

数据来源阐发: 找到视频内容

network抓包

二. 代码实现(代码实现根本流程)

发送恳求 利用代码的体例拜候网站获取数据 取出网页源代码解析数据 提取视频链接保留数据

如何用 Python 爬虫实现哔哩哔哩视频下载?  第7张

代码展现

PS:完好源码若有需要的小伙伴能够加下方的群去找办理员免费领取

如何用 Python 爬虫实现哔哩哔哩视频下载?  第8张

导入模块

import requestsimport re # 正则表达式模块import jsonimport pPRintimport subprocessimport os

假装(恳求头)

headers = { # 用户信息 "cookie": "buvid3=355AA300-6A61-04E5-A05C-E891D886F69632716infoc; b_nut=1675085932; i-wanna-go-back=-1; _uuid=387EA3810-FBF5-E92C-827E-2510B578C5B9A33232infoc; buvid4=15C69C98-F6A7-EC6A-872F-E69C1840DD6D33724-023013021-1pW1w45e5fZS9RtebDiGZw%3D%3D; nostalgia_conf=-1; CURRENT_FNVAL=4048; rpdid=|(kmJY|k))lY0J'uY~l|)lmY|; SESSDATA=17eb9f1a%2C1690782878%2C6a25c%2A22; bili_jct=4af9076b42f76603dfe4cf018ad2000f; DedeUserID=422789639; DedeUserID__ckMd5=fc4901c78719b545; CURRENT_QUALITY=80; b_ut=5; b_lsid=51ED8F105_1861C3EEC10; theme_style=light; is-2022-channel=1; sid=66dafqju; fingerprint=97ca5a8b555e63aca787c9cd27273c7e; buvid_fp_plain=undefined; buvid_fp=8cc52ae38b592ff26DC2b393eebd890b; PVID=2; innersign=1; bp_video_offset_422789639=758803412994228200", # 防盗链 "referer": "https://www.****.com/", # 阅读器根本信息 "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"}

发送恳求

url = 'https://www.***.com/video/BV1qv4y1k7UE/?vd_source=8f216a44bce0dbe14e3447c34c2ab3e2'response = requests.get(url, headers=headers)

获取数据

html_data = response.text

解析数据

json_str = re.findall('__playinfo__=(.*?)</script>', html_data)[0]# <h1 .*?>(.*?)</h1>title = re.findall('<h1 .*?>(.*?)</h1>', html_data)[0]# Python根底 字典json_data = json.loads(json_str)# pprint.pprint(json_data)audio_url = json_data['data']['dash']['audio'][0]['baseUrl']print(audio_url)video_url = json_data['data']['dash']['video'][0]['baseUrl']print(video_url)

保留数据

audio_data = requests.get(audio_url, headers=headers).contentwith open(f'{title}.mp3', mode='wb') as f: f.write(audio_data)video_data = requests.get(video_url, headers=headers).contentwith open(f'{title}.mp4', mode='wb') as f: f.write(video_data)ffmpeg = f'ffmpeg -i {title}.mp4 -i {title}.mp3 -acodec copy -vcodec copy {title+"-out.mp4"}'subprocess.run(ffmpeg)os.remove(f'{title}.mp4')os.remove(f'{title}.mp3')

如何用 Python 爬虫实现哔哩哔哩视频下载?  第9张

如何用 Python 爬虫实现哔哩哔哩视频下载?  第10张

如何用 Python 爬虫实现哔哩哔哩视频下载?  第11张

如何用 Python 爬虫实现哔哩哔哩视频下载?  第12张

如何用 Python 爬虫实现哔哩哔哩视频下载?  第13张

如何用 Python 爬虫实现哔哩哔哩视频下载?  第14张

尾语

感激你旁观我的文章呐~本次航班到那里就完毕啦

希望本篇文章有对你带来帮忙 ,有进修到一点常识~

躲起来的星星 也在勤奋发光,你也要勤奋加油(让我们一路勤奋叭)。

如何用 Python 爬虫实现哔哩哔哩视频下载?  第15张

发布于 2023-02-10 22:56

​附和​​添加评论​分享​保藏​喜好​收起​

如何用 Python 爬虫实现哔哩哔哩视频下载?  第16张

苛岚异梦

​ 存眷

5 人附和了该答复

一:因为哔哩哔哩的视频文件和音频文件是别离的,所有那里别离下载后在利用ffmepg停止合成

ffmpeg官网下载 https://ffmpeg.org/ (下载后需要设置装备摆设情况变量)需要重启! 链接:https://pan.baidu.com/s/1aDSlIQ1kPOOUsVOAmcFfHw 提取码:gvw4

gitee地址 https://gitee.com/ddpoi/bili

博客地址https://www.ddblog.xyz/articles/53

欢送大佬前来指点# import timeimport requestsimport reimport osimport subprocess# import sys,io# sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')headers = { 'referer': 'https://www.bilibili.com/video/BV1J3411h7pm?spm_id_from=333.5.0.0', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 Edg/97.0.1072.69'}# 获取视频bviddef get_bvid(mid,path): ''' 那里ps=30,是一页的视频数量,pn代表页数,能够本身加一个轮回 ''' url = 'https://api.bilibili.com/x/space/arc/search?mid={}&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp'.format(mid) response = requests.get(url=url,headers=headers).json() mm = response['data']['list']['vlist'] for i in mm: title = (i['title']) bvid = (i['bvid']) # print(title) # print(bvid) get_cid(bvid,title,path)# 获取ciddef get_cid(bvid,title,path): url = 'https://api.bilibili.com/x/player/pagelist?bvid={}&jsonp=jsonp'.format(bvid) response = requests.get(url=url,headers=headers).json() nn = response['data'] for i in nn: cid = (i['cid']) # print(cid) get_video(bvid,cid,title,path)# 获取视频,音频的urldef get_video(bvid,cid,title,path): url = 'https://api.bilibili.com/x/player/playurl?cid={}&bvid={}&qn=120&type=&otype=json&fourk=1&fnver=0&fnval=4048&session=521a3c69be48043423dab7dfacc0dfde'.format(cid,bvid) response = requests.get(url=url,headers=headers).json() video_url = response['data']['dash']['video'][0]['baseUrl'] audio_url = response['data']['dash']['audio'][0]['baseUrl'] # print(audio_url) # print(video_url) save(title,video_url,audio_url,path)# 保留视频,音频文件,(下载时文件名取第一个字符,避免含有特殊符号而报错)def save(title,video_url,audio_url,path): try: video = requests.get(url=video_url,headers=headers) with open(path+title[:1]+'.mp4','ab') as f: f.write(video.content) print('{}下载完成....'.format(title + '.mp4')) audio = requests.get(url=audio_url, headers=headers) with open(path+title[:1]+'.mp3','ab') as f: f.write(audio.content) print('{}下载完成....'.format(title + '.mp3')) except: pass video_add(title,path)'''因为有些up主视频题目包罗特殊字符,例如 ? | / 等。所以需要将那些字符过滤进来'''# 将下载的视频,音频停止合成def video_add(title,path): intab = "?/|\.><:*" for s in intab: if s in title: # 将特殊字符转化为空格 print(s) title = title.replace(s, '') # 若是法式异常,选择忽略 try: # print(title) print('起头合成') os.chdir(path) cmd = f'ffmpeg -i {title[:1]}.mp4 -i {title[:1]}.mp3 -c:v copy -c:a aac -strict experimental {title[:1]}_1.mp4' # print(cmd) subprocess.call(cmd, shell=True) '''选择能否删除原mp3、mp4文件''' os.remove(title[:1]+'.mp4') os.remove(title[:1]+'.mp3') os.rename(title[:1] + '_1.mp4', title + '.mp4') print('合成完毕') except: pass# 判断输入的是mid仍是视频链接def main(mid,path): if mid == "": print('错误,请从头输入') # mid输入不克不及为空 return False if re.match(r'[a-zA-Z]', mid): # 用正则来判断输入的mid类型 bvid = (mid.split('?')[0]).split('/')[4] # 取出视频链接中的bvid print(bvid) title = input('请输入视频名称:') # 手动指定视频名称 get_cid(bvid,title,path) else: get_bvid(mid,path)if __name__ == '__main__': mid = input('请输入up主的mid或视频链接:') print('途径必然要加/,默认为当前目次') file_path = input('请输入保留文件途径:') # 输入文件途径 if file_path == "" : path = './' else: path = file_path main(mid,path)