下载B站单个视频
准备工作:
1.下载ffmpeg,pycharm自带的ffmpeg好像不能用,下载地址:https://github.com/BtbN/FFmpeg-Builds/releases
2.安装ffmpeg,解压即可
3.添加环境变量,将ffmpeg.exe所在路径添加到环境变量
win10安装HEVC补丁
参考:https://www.zhihu.com/tardis/zm/art/427863173?source_id=1005
1.获取audio和video地址
def get_url():
url = 'https://www.bilibili.com/video/BV1zm4y1t7P7/'
resp = requests.get(url)
resp.close()
# print(resp.text)
title_obj = re.compile(r'<title data-vue-meta="true">(.*?)_哔哩哔哩_bilibili</title>')
title = title_obj.search(resp.text).group(1)
obj = re.compile(r'<script>window.__playinfo__=(.*?)</script>')
data = obj.search(resp.text).group(1)
data_json = json.loads(data)
# pprint(data_json)
audio_url = data_json['data']['dash']['audio'][0]['backupUrl'][0]
video_url = data_json['data']['dash']['video'][0]['backupUrl'][0]
return audio_url, video_url, title
2.下载audio和video
def download(audio_url, video_url):
resp1 = requests.get(url=audio_url, headers=headers)
resp1.close()
with open('video/1', 'wb') as f1:
f1.write(resp1.content)
print('audio下载完成')
resp2 = requests.get(url=video_url, headers=headers)
resp2.close()
with open('video/2', 'wb') as f2:
f2.write(resp2.content)
print('video下载完成')
3.合并audio和video
def merge(title):
com = f'E:\\ffmpeg-master-latest-win64-gpl\\bin\\ffmpeg.exe -i "video/1" -i "video/2" -acodec copy -vcodec copy "video/{title}.mp4"'
# print(com)
os.system(com)
os.remove('video/1')
os.remove('video/2')
完整代码
import re
import requests
import json
from pprint import pprint
import os
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43',
'Referer': 'https://www.bilibili.com/video/BV1zm4y1t7P7/?vd_source=6ebafa29b438a17b55f878b8d296faea'
}
def merge(title):
com = f'E:\\ffmpeg-master-latest-win64-gpl\\bin\\ffmpeg.exe -i "video/1" -i "video/2" -acodec copy -vcodec copy "video/{title}.mp4"'
# print(com)
os.system(com)
os.remove('video/1')
os.remove('video/2')
def download(audio_url, video_url):
resp1 = requests.get(url=audio_url, headers=headers)
resp1.close()
with open('video/1', 'wb') as f1:
f1.write(resp1.content)
print('audio下载完成')
resp2 = requests.get(url=video_url, headers=headers)
resp2.close()
with open('video/2', 'wb') as f2:
f2.write(resp2.content)
print('video下载完成')
def get_url():
url = 'https://www.bilibili.com/video/BV1zm4y1t7P7/'
resp = requests.get(url)
resp.close()
# print(resp.text)
title_obj = re.compile(r'<title data-vue-meta="true">(.*?)_哔哩哔哩_bilibili</title>')
title = title_obj.search(resp.text).group(1)
obj = re.compile(r'<script>window.__playinfo__=(.*?)</script>')
data = obj.search(resp.text).group(1)
data_json = json.loads(data)
# pprint(data_json)
audio_url = data_json['data']['dash']['audio'][0]['backupUrl'][0]
video_url = data_json['data']['dash']['video'][0]['backupUrl'][0]
return audio_url, video_url, title
def main():
au_url, vi_url, title = get_url()
download(au_url, vi_url)
merge(title)
if __name__ == '__main__':
main()