Python批量下载Bilibili(B站)1080P60fps视频-pip打包安装

17 篇文章 1 订阅
3 篇文章 0 订阅

BiliUtil

Windows
Linux
Python
License

Bilibili.com(B站)视频下载工具包

Github源码地址:https://github.com/wolfbolin/BiliUtil

声明:该内容仅供学习参考,请勿用于商业目的

帮助信息请看到第三章,更新日志请看到第四章

一、安装方式

  1. 请使用pip安装该包:pip install BiliUtil
  2. 若使用视频下载功能,请自行安装配置aria2
  3. 若使用视频合并功能,请自行安装配置ffmpeg

工具包将自动检查aria2ffmpeg环境,若任一环境不存在,所涉及的类与函数将不会被引入

二、使用方式

包中封装了始终对象,“UP主”(User)、“频道”(Channel)、“专辑”(Album)和“视频”(User),前三个对象是可以声明的,但是“视频”对象(Video)不可独立声明。

1、用户类(User)

该类表示了一个UP主,当需要获取某位UP主信息或UP的视频时,可以选择创建该类的实例。

1.1、成员变量
成员变量变量含义默认值
cookie设置的cookie信息None
uid用户uidNone
name用户昵称None
birthday用户生日None
coin用户硬币量None
face用户头像None
time创号时间(可能为0)None
level用户级别None
sex用户昵称None
sign用户签名None
album_list用户视频对象列表list()
channel_list用户频道对象列表list()
1.2、声明实例

你可以引入包并创建一个空的用户实例,空的用户实例不设置用户uid。

import BiliUtil
if __name__ == '__main__':
	ua = BiliUtil.User()
1.3、设定用户uid

你可以通过多种方式设定用户uid,详见下方案例。

import BiliUtil
if __name__ == '__main__':
	# 方案一
	ua = BiliUtil.User(uid='4093899')
	# 方案二
	ua = BiliUtil.User()
	ua.set_user(uid='4093899')
	# 方案三
	ua = BiliUtil.User()
	ua.set_by_url(url='https://space.bilibili.com/4093899')

三种函数声明方式如下:

def __init__(self, uid=None)
def set_user(self, uid)
def set_by_url(self, url)

:使用URL设定用户时,类似于https://space.bilibili.com/4093899/channel/index的URL也可以被识别。

1.4、设定Cookie

设定的cookie信息会影响到该实例及其包含的所有自动创建的对象。

ua.set_cookie('SESSDATA=abcd68fd%2C1123761144%2C38d97xyz')

:cookie设置的方式与意义详见第三章的解释。

1.5、获取用户信息

在设定用户uid信息后,即可通过该函数获取用户的基础信息。

import BiliUtil
if __name__ == '__main__':
	ua = BiliUtil.User(uid='4093899')
	ua.get_user_info()
1.6、获取所有视频列表

你可以仅获取视频列表而不下载视频,该操作将自动帮你完成用户信息的获取。

import BiliUtil
if __name__ == '__main__':
	ua = BiliUtil.User(uid='4093899')
	ua.get_all_video_info()
1.7、获取所有视频数据

你可以直接下载UP主的全部视频,该操作将自动帮你完成用户信息的获取与视频列表的获取。该操作支持设定路径、命名方式、视频时长,当设置了适合的cookie时,下载的画质将会自动提升。

import BiliUtil
if __name__ == '__main__':
	ua = BiliUtil.User(uid='4093899')
	ua.get_all_video_data(base_path='Download', name_path=True, max_length=None)

:参数设置的方式与意义详见第三章的解释。

1.8、获取频道列表

你可以仅获取频道列表而不下载视频,该操作将自动帮你完成用户信息的获取。

import BiliUtil
if __name__ == '__main__':
	ua = BiliUtil.User(uid='4093899')
	ua.get_channel_video_info()
1.9、获取频道视频数据

你可以直接下载UP主的全部视频,该操作将自动帮你完成用户信息的获取与频道列表的获取。该操作支持设定路径、命名方式、视频时长,当设置了适合的cookie时,下载的画质将会自动提升。

import BiliUtil
if __name__ == '__main__':
	ua = BiliUtil.User(uid='4093899')
	ua.get_channel_video_data(base_path='Download', name_path=True, max_length=None)

:参数设置的方式与意义详见第三章的解释。

1.10、获取对象信息字典

你可以将当前对象中保存的所有信息转换为字典格式保存,修改该字典时并不会影响实例。

import BiliUtil
if __name__ == '__main__':
	ua = BiliUtil.User(uid='4093899')
	ua.get_user_info()  # 修改对象
	print(ua.get_dict_info())  # 输出对象内部信息
	ua.get_all_video_info() # 修改对象
	print(ua.get_dict_info())  # 输出对象内部信息
	ua.get_channel_video_info() # 修改对象
	print(ua.get_dict_info())  # 输出对象内部信息
1.11、下载高清视频样例
import BiliUtil

if __name__ == '__main__':
    cookie = input('请提供登录后的cookie信息,以升级下载画质:')
    ua = BiliUtil.User()
    ua.set_by_url('https://space.bilibili.com/6799052/')
    ua.set_cookie(cookie)
    ua.get_all_video_data(base_path='Download', name_path=True)

2、频道类(Channel)

该类表示了一个用户所属的频道,当需要获取频道内所有视频信息时,可以选择创建该类的实例。

2.1、成员变量
成员变量变量含义默认值
cookie设置的cookie信息None
uid用户uidNone
cid频道cidNone
name频道名称None
cover频道封面None
count频道内专辑数量None
album_list频道内专辑对象列表list()
2.2、声明实例

你可以引入包并创建一个空的频道实例,空的频道实例不设置用户uid和频道cid。

import BiliUtil
if __name__ == '__main__':
	ch = BiliUtil.Channel()
2.3、设定频道cid

你可以通过多种方式设定用户uid与频道cid,详见下方案例。

import BiliUtil
if __name__ == '__main__':
	# 方案一
	ch = BiliUtil.Channel(uid='4093899', cid='8020')
	# 方案二
	ch = BiliUtil.Channel()
	ch.set_user(uid='4093899', cid='8020')
	# 方案三
	ch = BiliUtil.Channel()
	ch.set_by_url(url='https://space.bilibili.com/4093899/channel/detail?cid=8020')

三种函数声明方式如下:

def __init__(self, uid=None, cid=None)
def set_channel(self, uid, cid)
def set_by_url(self, url)

:使用URL设定用户时,请使用准确的URL。

2.4、设定Cookie

设定的cookie信息会影响到该实例及其包含的所有自动创建的对象。

ch.set_cookie('SESSDATA=abcd68fd%2C1123761144%2C38d97xyz')

:cookie设置的方式与意义详见第三章的解释。

2.5、获取频道信息

你可以仅获取频道信息以及视频列表而不下载视频。

import BiliUtil
if __name__ == '__main__':
	ch = BiliUtil.Channel(uid='4093899', cid='8020')
	ch.get_channel_info()
2.6、获取频道视频数据

你可以直接获取频道内视频数据,该操作将自动帮你完成频道信息的获取。该操作支持设定路径、命名方式、视频时长,当设置了适合的cookie时,下载的画质将会自动提升。

import BiliUtil
if __name__ == '__main__':
	ch = BiliUtil.Channel(uid='4093899', cid='8020')
	ch.get_channel_data(base_path='Download', name_path=True, max_length=None)

:参数设置的方式与意义详见第三章的解释。

2.7、获取对象信息字典

你可以将当前对象中保存的所有信息转换为字典格式保存,修改该字典时并不会影响实例。

import BiliUtil
if __name__ == '__main__':
	ch = BiliUtil.Channel(uid='4093899', cid='8020')
	ch.get_channel_info()  # 修改对象
	print(ch.get_dict_info())  # 输出对象内部信息
2.8、下载高清视频样例
import BiliUtil
if __name__ == '__main__':
    cookie = input('请提供登录后的cookie信息,以升级下载画质:')
    ch = BiliUtil.Channel()
    ch.set_by_url('https://space.bilibili.com/4093899/channel/detail?cid=8020')
    ch.set_cookie(cookie)
    ch.get_all_video_data(base_path='Download', name_path=True)

3、专辑类(Album)

该类表示了一个专辑,即表示了一个av号对应的视频集合。当需要获取一个av号内所有视频时,可以选择创建该类的实例。

3.1、成员变量
成员变量变量含义默认值
cookie设置的cookie信息None
aid专辑av号None
name专辑名称None
time发布时间None
desc专辑描述None
zone频道内视频对象列表NoneNone
num视频数量None
cover封面链接None
like点赞数量None
coin投币数量None
favorite收藏数量None
share分享数量None
view观看人次None
danmu弹幕数量None
video_list专辑内视频对象列表list()
3.2、声明实例

你可以引入包并创建一个空的频道实例,空的频道实例不设置用户uid和频道cid。

import BiliUtil
if __name__ == '__main__':
	av = BiliUtil.Album()
3.3、设定专辑aid

你可以通过多种方式设定av号,详见下方案例。

import BiliUtil
if __name__ == '__main__':
	# 方案一
	av = BiliUtil.Album(aid='31483746')
	# 方案二
	av = BiliUtil.Album()
	av.set_user(aid='31483746')
	# 方案三
	av = BiliUtil.Album()
	av.set_by_url(url='https://www.bilibili.com/video/av31483746')

三种函数声明方式如下:

def __init__(self, aid=None)
def set_album(self, aid=None)
def set_by_url(self, url)

:使用URL设定用户时,请使用准确的URL。

3.4、设定Cookie

设定的cookie信息会影响到该实例及其包含的所有自动创建的对象。

av.set_cookie('SESSDATA=abcd68fd%2C1123761144%2C38d97xyz')

:cookie设置的方式与意义详见第三章的解释。

3.5、获取专辑信息

你可以仅获取专辑信息以及视频列表而不下载视频。

import BiliUtil
if __name__ == '__main__':
	av = BiliUtil.Album(aid='31483746')
	av.get_album_info()
3.6、获取频道视频数据

你可以直接获取专辑内视频数据,该操作将自动帮你完成专辑信息的获取。该操作支持设定路径、命名方式、视频时长,当设置了适合的cookie时,下载的画质将会自动提升。

import BiliUtil
if __name__ == '__main__':
	av = BiliUtil.Album(aid='31483746')
	av.get_album_data(base_path='Download', name_path=True, max_length=None)

:参数设置的方式与意义详见第三章的解释。

3.7、获取对象信息字典

你可以将当前对象中保存的所有信息转换为字典格式保存,修改该字典时并不会影响实例。

import BiliUtil
if __name__ == '__main__':
	av = BiliUtil.Album(uid='4093899', cid='8020')
	av.get_channel_info()  # 修改对象
	print(ch.get_dict_info())  # 输出对象内部信息
3.8、下载高清视频样例
import BiliUtil
if __name__ == '__main__':
    cookie = input('请提供登录后的cookie信息,以升级下载画质:')
    av = BiliUtil.Album()
    av.set_by_url('https://www.bilibili.com/video/av31483746')
    av.set_cookie(cookie)
    av.get_album_data(base_path='Download', name_path=True)

4、视频类(Video)

该类的实例不可手动创建,只能通过专辑类生成视频类的实例。

4.1、成员变量
成员变量变量含义默认值
cookie设置的cookie信息None
aid专辑av号None
cid视频cidNone
index分P编号None
name分P名称None
quality视频质量None
quality_des视频质量描述None
length视频时长None
video视频下载链接None
audio音频下载链接None
4.2、获取对象信息字典

你可以将当前对象中保存的所有信息转换为字典格式保存,修改该字典时并不会影响实例。

import BiliUtil
if __name__ == '__main__':
	av = BiliUtil.Album(uid='4093899', cid='8020')
	av.get_channel_info()  # 获取数据并生成Video实例
	av.video_list[0].get_dict_info()  # 输出对象内部信息

5、静态函数

5.1、视频合并函数

众所周知,视频由画面和声音组成。B站自从某个不知道的时间点以后将用户上传的视频分离为独立的视频与音频。因此,我们需要将下载好的视频与音频合并为一个文件,这样才方便观看。该函数将帮助你完成这一过程。

使用该函数需要您自行在计算机中配置ffmpeg渲染环境,若检查不到该环境存在,音视频合并函数将不会被引入。

函数声明:merge_video_file(path, delete=False)

path:视频所在的文件夹

delete:是否在视频合并后删除源文件

import BiliUtil

if __name__ == '__main__':
    print('合并文件夹内视频')
    BiliUtil.merge_video_file('./Download', True)

三、帮助信息

1、cookie信息

  • cookie信息不影响除视频画质外其他信息的获取。
  • 通过cookie信息,你可以在下载视频的时候获取到更高清的视频数据,程序会根据你的身份(未登录、已登录、大会员),自动尝试并下载画质最好的视频(手动设置画质的功能写了一半没写完)。
  • 当对象设置了cookie信息后,程序会将该信息分发至该实例所包含的所有Album和Video对象中。声明新的对象以及对象的其他实例不受该操作的影响。
  • 设定cookie信息时,类似于_uuid=B45CF1AB-xxx; LIVE_BUVID=AUTO76154xxx; SESSDATA=abcd68fd%2C1123761144%2C38d97xyz的cookie信息也是可以被识别的。也可以传入字典类型的cookie信息,但是cookie信息中必须包含SESSDATA字段,该字段是提升视频质量的关键点。
  • 不同的身份信息可下载视频的映射表:
    • 未登录—>480P
    • 已登录—>1080P
    • 大会员—>1080P60FPS / 1080P+

2、下载参数

在下载视频时,你可以传入三个参数来调节下载的过程。base_path=‘Download’, name_path=True, max_length=None

  • base_path:基础路径,该路径为程序缓存视频的基础路径,程序将在该路径下创建分级的文件夹。
  • name_path:命名方式,该参数为True时,将使用各级实例的名称作为生成文件夹的名称(非法字符将被替换为’_’)
  • max_length:下载长度,该参数将限定视频下载的长度,单位为毫秒。当视频长度大于该值时,视频将不被下载。若您不需要该设置,请将该值设置为None。

3、视频下载流程

在生成了正确的对象后,我们就可以开始批量下载视频了。我需要向你解释一下下载的过程发生了什么。

  1. 您需要传入三个参数"缓存路径"、“命名方式”、“限制长度”
  2. 例将会自动获取实例的相关信息。
  3. 程序将按照指定的命名方式生成文件夹。
  4. 程序将按照"User>Channel>Album>Video"四级目录遍历,该操作将递归调用每个实例的get_xxxxx_data函数,并将三个参数传入,以此完成数据的遍历下载。
  5. 数据将综合采用aria2crequests进行下载,请确保您的环境中有aria2crequests可供调用。
  6. 对于下载完成的数据,程序将会做简单的验证(仅验证文件是否存在)
  7. 下载结束后,程序将逐级将该对象下载时使用的数据,以json格式保存在同级目录中。
  8. 当您重启了相同的下载过程时,aria2将帮助你完成断点续传,下载过的视频将不会重复下载。

以下代码将演示如何下载频道视频

import BiliUtil
if __name__ == '__main__':
    cookie = input('请提供登录后的cookie信息,以升级下载画质:')
    # 创建频道对象
    ch = BiliUtil.Channel()
    # 设置频道参数
    ch.set_by_url('https://space.bilibili.com/4282930/channel/detail?cid=48758')
    # 传入cookie参数
    ch.set_cookie(cookie)
    # 开始批量下载视频
    ch.get_channel_data(base_path='Download', name_path=False, max_length=None)

4、使用效果

在这里插入图片描述

5、关于BuilUtil

这个包中还有很多未完成的细节,还有一些想实现的功能未完成。
欢迎有兴趣的小伙伴一次参与,反馈BUG,更新代码,提供方案,我们共同完善它。

你可以联系我:mailto@wolfbolin.com

声明:该博客内容仅供学习参考,请勿用于商业目的

四、更新日志

v0.1.4

解决ffmpeg合成阶段程序卡死。由于pipe size的大小限制,导致程序在收到超过64kb的输出时,程序会卡死不动。修改process.wait()为process.communicate()以解决该问题。

v0.1.3

操作失误导致pip中v0.1.2版本被删除,将以v0.1.3版本发布。建议更新至最新版本后再使用。

v0.1.2

修改:

  • 修复了ffmpeg环境检测不通过的BUG,因为使用了错误的语法。

  • 移除了对powershell的支持,未来将在linux环境中测试。

  • 修复了使用aria2c时的错误语法,解决自定义输出路径报错。

  • 修改路径获取方案,相对路径传入后,将以绝对路径进行计算。

v0.1.1

新增:

  • 音视频合并函数
  • 音视频批量合并代码示例

修改:

  • 删除部分无意义的(=・ω・=)输出
  • 调整aria2与ffmpeg环境检测机制

v0.0.1

BiliUtil已经过基础测试,正式发布第一个版本,若要直接使用,请使用pip进行安装。

  • 13
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值