基于Python制作B站视频下载小工具

 更新时间:2022年01月11日 16:41:23   作者:程序员迪迪  
这篇文章主要为大家介绍一个小工具,可以用于B站视频的下载,只需要输入对应视频的网页地址就可以进行下载到本地了。感兴趣的可以了解一下

1. 原理简介

原理很简单,就是获取视频资源的源地址,然后爬取视频的二进制内容,再写入到本地即可。

2. 网页分析

打开该网页,然后F12进入开发者模式,接着点开网络—>全部,因为视频资源一般比较大,我这里根据大小进行了从大到小的排序,找到了第一条这些可能和视频源地址有关。

然后,我们复制找到的这条里的url部分不变的部分,回到元素中ctrl+F搜索,找到了可能和视频源地址有关的节点。

果然,我们复制这部分内容,用json在线解析工具发现真的有我们需要的看似视频文件所在的地址。

然后,我复制这个地址用浏览器打开发现提示403了。。

不过,没关系。。我们看接下来的操作!

3. 视频爬取

在网页分析部分,我们可以在视频的B站地址网页源代码里通过各种数据解析的方式来获取视频文件的源地址,这里我采用的是正则表达式。

import requests
import re
import json 

url = 'https://www.bilibili.com/video/BV1BU4y1H7E3'

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
    "referer": "https://www.bilibili.com"
    }

resp = requests.get(url, headers=headers)

palyinfo = re.findall(r'<script>window.__playinfo__=(.*?)</script>', resp.text)[0]

palyinfo_data = json.loads(palyinfo)

由于正在表达式获取的结果是字符串,而实际上它是json(字典),所以这里需要再引入json库来进行转化。

我们再分析数据,可以发现最终视频文件的信息,直接key-value操作就行了。比较有意思的是视频和音频文件是分开的,我们需要分别爬取后再合并即可。

# 视频与音频文件地址
video_url = json_data['data']['dash']['video'][0]['base_url']
audio_url = json_data['data']['dash']['audio'][0]['base_url']

有朋友可能会发现,base_url貌似有好多个。是的,因为视频清晰度有很多种嘛。这里我选取的是第一种超清 4K,大家可以根据自己需求进行选择!

当然了,我们把视频存入本地的时候还需要起个名字,这里随便找个节点解析出文件名就行了。

# 视频标题
title = re.findall(r'<h1 title="(.*?)" class="video-title">', resp.text)[0]

4. 存入本地

既然我们已经解析获得了视频的文件地址、音频地址和文件名,那么直接就安排下载吧!

不过,我们在网页分析的时候发现直接打开视频和音频文件地址会提示403,那么因为跳过去的来源不明确导致的,只需调整请求头为如下即可:

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
    # 加上referer即可
    "referer": "https://www.bilibili.com"
    }

搞定这些玩意后,我们就开始写文件写入本地的函数吧!

# 一般视频是mp4,音频是mp3
def down_file(file_url, file_type):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
        "referer": "https://www.bilibili.com"
        }
    resp = requests.get(url = file_url, headers=headers)
    print(resp.status_code)
    
    print(f'文件名称:{title}')
    # 设置单次写入数据的块大小
    chunk_size = 1024
    # 获取文件大小
    file_size = int(resp.headers['content-length'])
    # 用于记录已经下载的文件大小
    done_size = 0
    # 将文件大小转化为MB
    file_size_MB = file_size / 1024 / 1024
    print(f'文件大小:{file_size_MB:0.2f} MB')
    start_time = time.time()
    with open(title + '.' + file_type, mode='wb') as f:
        for chunk in resp.iter_content(chunk_size=chunk_size):
            f.write(chunk)
            done_size += len(chunk)
            print(f'\r下载进度:{done_size/file_size*100:0.2f}%',end='')
    end_time = time.time()
    cost_time = end_time-start_time
    print(f'\n累计耗时:{cost_time:0.2f} 秒')
    print(f'下载速度:{file_size_MB/cost_time:0.2f}M/s')

运行结果:

# 视频下载
>>>down_file(video_url, 'mp4')
200
文件名称:【咒术回战】第20集五条悟帅的有些过分了
文件大小:42.10 MB
下载进度:100.00%
累计耗时:5.72 秒
下载速度:7.36M/s
# 音频下载
>>>down_file(audio_url, 'mp3')
200
文件名称:【咒术回战】第20集五条悟帅的有些过分了
文件大小:5.13 MB
下载进度:100.00%
累计耗时:0.80 秒
下载速度:6.42M/s

我们在本地可以看到下载成功的视频文件:

由于视频和音频是分开的,所以单独打开这个视频是没有声音的,我们需要进行合并操作。

合并操作需要用到moviepy库,关于这个库我们后续也会介绍它的更多应用,敬请期待~

from moviepy import *
from moviepy.editor import *

video_path = title + '.mp4'
audio_path = title + '.mp3'

# 读入视频
video = VideoFileClip(video_path)
# 提取音轨
audio = AudioFileClip(audio_path)
# 将音轨合并到视频中
video = video.set_audio(audio)
# 输出
video.write_videofile(f"{title}(含音频).mp4")

就这样搞定了:

Moviepy - Building video 【咒术回战】第20集五条悟帅的有些过分了(含音频).mp4.
MoviePy - Writing audio in 【咒术回战】第20集五条悟帅的有些过分了(含音频)TEMP_MPY_wvf_snd.mp3
MoviePy - Done.                                                       
Moviepy - Writing video 【咒术回战】第20集五条悟帅的有些过分了(含音频).mp4

Moviepy - Done !
Moviepy - video ready 【咒术回战】第20集五条悟帅的有些过分了(含音频).mp4

5. GUI工具制作

这个吧,就是用我常用的pysimplegui来操作了,比较简单。

import PySimpleGUI as sg

# 主题设置
sg.theme('SystemDefaultForReal')

# 布局设置
layout = [[sg.Text('选择B站视频地址:',font=("微软雅黑", 12)),sg.InputText(key='url',size=(50,1),font=("微软雅黑", 10),enable_events=True) ],
          # [sg.Output(size=(66, 8),font=("微软雅黑", 10))],  
           [sg.Button('开始下载',font=("微软雅黑", 10),button_color ='Orange'),
           sg.Button('关闭程序',font=("微软雅黑", 10),button_color ='red'),]
          ]      

# 创建窗口
window = sg.Window('B站视频下载工具', layout,font=("微软雅黑", 12),default_element_size=(50,1))    

# 事件循环
while True:
    event, values = window.read()
    if event in (None, '关闭程序'):
        break
    if event == '开始下载':
        url = values['url']
        print('获取视频信息')
        title, video_url, audio_url = get_file_info(url)
        print('下载视频资源')
        down_file(title, video_url, 'mp4')
        print('下载音频资源')
        down_file(title, audio_url, 'mp3')   
        print('合并视频与音频')
        merge(title)
        print('有音频视频处理完成')
window.close()

以上就是基于Python制作B站视频下载小工具的详细内容,更多关于Python B站视频下载的资料请关注脚本之家其它相关文章!

相关文章

  • 目前最全的python的就业方向

    目前最全的python的就业方向

    Python是一门面向对象的编程语言,编译速度超快,从诞生到现在已经25个年头了。其特点在于灵活运用,因为其拥有大量第三方库,所以开发人员不必重复造轮子,就像搭积木一样,只要擅于利用这些库就可以完成绝大部分工作
    2018-06-06
  • Python虚拟环境virtualenv创建及使用过程图解

    Python虚拟环境virtualenv创建及使用过程图解

    这篇文章主要介绍了Python虚拟环境virtualenv创建及使用过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Django框架中的对象列表视图使用示例

    Django框架中的对象列表视图使用示例

    这篇文章主要介绍了Django框架中的对象列表视图使用示例,Django是重多Python人气web框架中最为著名的一个,需要的朋友可以参考下
    2015-07-07
  • python manage.py runserver流程解析

    python manage.py runserver流程解析

    这篇文章主要介绍了python manage.py runserver流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • PyQt Qt Designer工具的布局管理详解

    PyQt Qt Designer工具的布局管理详解

    这篇文章主要介绍了PyQt Qt Designer工具的布局管理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 利用Python实现面部识别的方法详解

    利用Python实现面部识别的方法详解

    人脸识别正在成为软件开发中的一种趋势。它有助于识别人脸并使应用程序更加健壮。本文将使用python和face_recognition库创建一个简单的人脸识别,需要的可以参考一下
    2022-05-05
  • Python量化交易实战之使用Resample函数转换“日K”数据

    Python量化交易实战之使用Resample函数转换“日K”数据

    resample函数是Python数据分析库Pandas的方法函数,它主要用于转换时间序列的频次,今天通过本文给大家分享python使用Resample函数转换时间序列的相关知识,感兴趣的朋友一起看看吧
    2021-06-06
  • python自动提取文本中的时间(包含中文日期)

    python自动提取文本中的时间(包含中文日期)

    这篇文章主要介绍了python自动提取文本中的时间(包含中文日期),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Python爬虫制作翻译程序的示例代码

    Python爬虫制作翻译程序的示例代码

    这篇文章主要介绍了Python爬虫制作翻译程序的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 快速进修Python指南之网络编程及并发编程

    快速进修Python指南之网络编程及并发编程

    这篇文章主要为大家介绍了Java开发者如何快速进修Python指南之网络编程及并发编程实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论