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

目录
  • 1. 原理简介
  • 2. 网页分析
  • 3. 视频爬取
  • 4. 存入本地
  • 5. GUI工具制作

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站视频下载的资料请关注我们其它相关文章!

(0)

相关推荐

  • 用Python下载抖音无水印视频的方法

    分享学习Python爬虫.数据分析.数据挖掘的点滴. 最近发现了抖音无水印视频的下载方法. # 抖音接口 「url」参数值就是从抖音上复制的链接. Python下载 首先来看一下,直接访问抖音链接得到的结果. 妥妥的水印... 接下来打开浏览器的开发者工具,看看视频的地址. 可以发现「playAddr」就是视频的地址,复制然后访问. 链接会重定向到以「v9」开头的链接,然而还是有水印. 接下来就是重点了,首先你需要让你的浏览器能够修改UA,即爬虫经常用到的「User-Agent」. 我用的是Ma

  • python b站视频下载的五种版本

    项目地址: https://github.com/Henryhaohao/Bilibili_video_download 介绍 对于单P视频:直接传入B站av号或者视频链接地址(eg: 49842011或者https://www.bilibili.com/video/av49842011) 对于多P视频: 1.下载全集:直接传入B站av号或者视频链接地址(eg: 49842011或者https://www.bilibili.com/video/av49842011) 2.下载其中一集:传入那一集

  • python基于tkinter制作m3u8视频下载工具

    这是我为了学习tkinter用python 写的一个下载m3u8视频的小程序,程序使用了多线程下载,下载后自动合并成一个视频文件,方便播放. 目前的众多视频都是m3u8的播放类型,只要知道视频的m3u8地址,就可以完美下载整个视频. m3u8地址获取 打开浏览器,点开你要获取地址的视频 重要的来了,右键>>审查元素或者按F12也可以 根据开发或测试的实际环境选择相应的设备,选择iphone6 plus 选择好了以后,刷新页面,点击漏斗,选择media,一定刷新之后再点击,没出来的话切换几下选项

  • Python实现视频下载功能

    最近一两年短视频业务风生水起,各个视频网站都有各自特色的短视频内容.如果有这样一个程序,可以把各大视频网站的热门用户最新发布的视频都下载下来,不仅方便自己观看,还可以将没有版权的视频发布在个人社交网站上,增加自己的人气,岂不美哉? parker就是这样一个项目(项目地址:https://github.com/LiuRoy/parker),它采用celery框架定时爬取用户视频列表,将最新发布的视频通过you-get异步下载,可以很方便地实现分布式部署.因为各个网站的页面布局和接口更新比较频繁,为

  • 用python制作个视频下载器

    前言 某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~ 当我打开文件夹以回顾往事之余,惊现许多看似杂乱的无聊代码.我拍腿正坐,一个想法油然而生:"生活已然很无聊,不如再无聊些叭". 于是,我决定开一个专题,便称之为kimol君的无聊小发明. 妙-啊~~~ 众所周知,视频是一个学习新姿势知识的良好媒介.那么,如何利用爬虫更加方便快捷地下载视频呢?本文将从数据包分析到代码实现来进行一个相对完整的讲解. 一.爬虫分析 本次选取的目标视频网站为某度旗下的好看视频: https://haok

  • python动态视频下载器的实现方法

    这里向大家分享一下python爬虫的一些应用,主要是用爬虫配合简单的GUI界面实现视频,音乐和小说的下载器.今天就先介绍如何实现一个动态视频下载器. 爬取电影天堂视频 首先介绍的是python爬取电影天堂网站的视频(包括电影,电视剧,综艺等),主要是用selenium动态网页技术加上简单的爬虫技术. (1)电影网站首页面地址:https://www.dytt8.net/ (2)用到的技术:selenium模拟浏览器运行. (3)首先要安装配置selenium库和不同浏览器和该库配合的插件.这里安

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

    目录 1. 原理简介 2. 网页分析 3. 视频爬取 4. 存入本地 5. GUI工具制作 1. 原理简介 原理很简单,就是获取视频资源的源地址,然后爬取视频的二进制内容,再写入到本地即可. 2. 网页分析 打开该网页,然后F12进入开发者模式,接着点开网络—>全部,因为视频资源一般比较大,我这里根据大小进行了从大到小的排序,找到了第一条这些可能和视频源地址有关. 然后,我们复制找到的这条里的url部分不变的部分,回到元素中ctrl+F搜索,找到了可能和视频源地址有关的节点. 果然,我们复制这部

  • 基于Python制作图像完美超分处理工具

    目录 前言 安装 使用 图片超分 视频超分 项目说明 代码说明 总结 前言 很久没更新这个专栏了,最近比较忙.前段时间看到了这个模型觉着很有意思,弄下来自己玩了玩,但是没时间写文章,一直搁置到现在. 废话不多说,先上Github地址: RealBasicVSR地址 从给出的效果来看,还是很不错的,左侧是超分后的画面,右边是原画质,得到明显提升.下面我说一下我的安装过程,还有一些使用中的踩坑,让大家去测试项目的时候可以提前规避. 安装 项目拉下来之后,我们先打开README,看看说明. 安装的步骤

  • 基于Python制作一个多进制转换工具

    目录 前言 主要步骤 完整代码 前言 学习资料下载链接 提取码:tha8  进制转换计算工具含源文件 主要步骤 导入模块 import tkinter from tkinter import * import tkinter as tk from tkinter.ttk import * 整个框架的主结构 root = Tk() root.title('贱工坊-进制转换计算') # 程序的标题名称 root.geometry("580x400+512+288") # 窗口的大小及页面的

  • 基于PyQt5制作Excel文件数据去重小工具

    需求说明:将单个或者多个Excel文件数据进行去重操作,去重的列可以通过自定义制定. 开始源码说明之前,先说明一下工具的使用过程. 1.准备需要去重的数据文件. 2.使用工具执行去重操作. 3.处理完成后的结果文件. PyQt5 界面UI相关的模块引用 from PyQt5.QtWidgets import * from PyQt5.QtGui import * 核心组件 from PyQt5.QtCore import * 主题样式模块引用 from QCandyUi import Candy

  • 基于Python制作天眼查小程序的示例代码

    目录 界面搭建 整体布局 界面美化 天眼查爬虫 获取信息 代码编写 结果展示 今天我们一起来制作一个天眼查GUI程序,开宗明义,我们先来看下最终的效果 这次的GUI程序,我们使用的框架是PyQt5,该框架拥有比tkinter更为丰富的内置组件,在界面美化方面,貌似也更胜一筹! 从上图也可以看出,我们的目标还是蛮远大的,最终我们希望可以完成一个工具集合,把我们日常当中常用的功能都集成的该GUI程序中,比如天眼查公司信息,知乎用户知识图谱,B视频弹幕抓取等等. 好了,今天我们先完成天眼查的功能吧~

  • 基于Python制作一个文件去重小工具

    目录 前言 实现步骤 补充 前言 常常在下载网络素材时有很多的重复文件乱七八糟的,于是想实现一个去重的操作. 主要实现思路就是遍历出某个文件夹包括其子文件夹下面的所有文件,最后,将所有文件通过MD5函数的对比筛选出来,最后将重复的文件移除. 实现步骤 用到的第三方库都比较的常见,其中只有hashlib是用来对比文件的不是很常见.其他的都是一些比较常见的第三方库用来做辅助操作. import os # 应用文件操作 import hashlib # 文件对比操作 import logging #

  • 如何基于Python制作有道翻译小工具

    这篇文章主要介绍了如何基于Python制作有道翻译小工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 该工具主要是利用了爬虫,爬取web有道翻译的内容. 然后利用简易GUI来可视化结果. 首先我们进入有道词典的首页,并点击翻译结果的审查元素 之后request响应网页,并分析网页,定位到翻译结果. 使用tkinter来制作一个建议的GUI 期间遇到的一个问题则是如何刷新翻译的结果,否则的话会在text里一直累加翻译结果. 于是,在mainlo

  • 基于python对B站收藏夹按照视频发布时间进行排序的问题

    前言 在最一开始,我的B站收藏一直是存放在默认收藏夹中,但是随着视频收藏的越来越多,没有分类的视频放在一起,想在众多视频中找到想要的视频非常困难,因此就对收藏夹里面的视频进行了分类.但是分类之后紧接着又出现了一个新的问题:原来存放在默认收藏夹里面视频的相对顺序被打乱了--明明前几天刚收藏的视频却要翻很多很多页才能找到,因此有了这个程序. 程序的作用 因为我们看到的视频大部分都是通过推荐得到的,而推荐的视频大部分都是刚发布不久,因此大部分收藏的视频的顺序也基本是按照视频发布的顺序来的.那么通过程序

  • 基于Python制作打地鼠小游戏

    效果展示 打地鼠小游戏 简介 打地鼠的游戏规则相信大家都知道,这里就不多介绍了,反正就是不停地拿锤子打洞里钻出来的地鼠呗~ 首先,让我们确定一下游戏中有哪些元素.打地鼠打地鼠,地鼠当然得有啦,那我们就写个地鼠的游戏精灵类呗: '''地鼠''' class Mole(pygame.sprite.Sprite): def __init__(self, image_paths, position, **kwargs): pygame.sprite.Sprite.__init__(self) self.

随机推荐