【python】保存B站视频

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值