import os
import requests
import json
import re
from moviepy.audio.io.AudioFileClip import AudioFileClip
from moviepy.video.io.VideoFileClip import VideoFileClip
def merge_video_audio(video_path, audio_path):
print('原始视频音频合并中,请耐心等待~')
# 获取下载好的音频和视频文件
vd = VideoFileClip(video_path)
ad = AudioFileClip(audio_path)
vd2 = vd.set_audio(ad) # 将提取到的音频和视频文件进行合成
output = video_path.replace('_video', '')
vd2.write_videofile(output) # 输出新的视频文件
# 移除原始的视频和音频
os.remove(video_path)
os.remove(audio_path)
def download_video(jump_url_list, path, filename):
# 遍历我们刚才获取到的所有跳转链接
for jump_url in jump_url_list: # 先取一个视频进行测试
print('正在下载:', jump_url)
# 发送请求
headers = {
'Accept': '*/*',
'Accept-Language': 'en-US,en;q=0.5',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'
}
response = requests.get(jump_url, headers=headers)
# 视频详情json
match = re.search('__playinfo__=(.*?)</script><script>', response.text)
playinfo = json.loads(match.group(1))
# 视频内容json
match = re.search(r'__INITIAL_STATE__=(.*?);\(function\(\)', response.text)
initial_state = json.loads(match.group(1))
# 视频分多种格式,直接取分辨率最高的视频 1080p
video_url = playinfo['data']['dash']['video'][0]['baseUrl']
# 取出音频地址
audio_url = playinfo['data']['dash']['audio'][0]['baseUrl']
title = initial_state['videoData']['title']
print('视频名字:', title)
# print('视频地址:', video_url)
# print('音频地址:', audio_url)
# 根据关键词创建文件夹
if not os.path.exists(path):
os.mkdir(path)
# 下载视频
headers.update({"Referer": jump_url})
video_content = requests.get(video_url, headers=headers)
received_video = 0
video_path = f'{path}/{filename}_video.mp4'
with open(video_path, 'ab') as output:
while int(video_content.headers['content-length']) > received_video:
headers['Range'] = 'bytes=' + str(received_video) + '-'
response = requests.get(video_url, headers=headers)
output.write(response.content)
received_video += len(response.content)
# 下载音频
audio_content = requests.get(audio_url, headers=headers)
received_audio = 0
audio_path = f'{path}/{filename}_audio.mp4'
with open(audio_path, 'ab') as output:
while int(audio_content.headers['content-length']) > received_audio:
# 视频分片下载
headers['Range'] = 'bytes=' + str(received_audio) + '-'
response = requests.get(audio_url, headers=headers)
output.write(response.content)
received_audio += len(response.content)
# 合并视频和音频
merge_video_audio(video_path, audio_path)
if __name__ == '__main__':
jump_url_list = ["https://www.bilibili.com/video/videoid/"]
path = r"D:/data/bilibili"
filename = "abc"
download_video(jump_url_list, path, filename)
08-20
478
05-18
339