前言

本篇文章将为大家介绍两个python的第三方库you-get 和 bilibili-api,它们可以用来下载和获取B站视频的信息,其中you-get支持下载多种视频网站,包括Bilibili(B站)、优酷、爱奇艺等,使用方法非常简单,我将准备好模板代码,大家可免费领取,直接使用。

1、you-get库的使用及介绍

you-get 是一个强大的命令行工具,可以下载多种网站的视频,包括B站。你可以直接在命令行中使用它,也可以在Python脚本中通过 subprocess 模块调用它。

1.1 安装you-get库

命令:pip install you-get

1.2 调用you-get下载B站视频(模板代码)


方法1:使用os模块调用命令行运行代码

下载命令:you-get 视频链接
说明:you-get库本身就是一个命令行工具,我们可以直接在cmd命令窗口中输入命令下载视频,下面我将使用python通过调用os模块来执行命令

# 导入os模块
import os

def download_bilibili_video(url,output_dir):
    """
    使用you-get下载B站视频
    :param url: 视频的B站链接
    :param output_dir: 视频保存的目录
    """
    try:
        # 使用you-get下载视频,下载命令如下
        command = f'you-get -o {output_dir} {url}'
        # 参数说明:-o 选项 用于指定视频保存路径,不指定默认保存至当前路径下
        
        # 执行命令
        os.system(command)
        print(f"视频下载完成,保存在 {output_dir}")
    except Exception as e:
        print(f"下载视频时出错: {e}")

if __name__ == "__main__":
    # 替换为你要下载的B站视频链接
    video_url = "https://www.bilibili.com/video/BV1NVBXYbEta/?spm_id_from=333.1007.tianma.24-4-94.click&vd_source=e8e376ccbc5aa4cfd88e6a7917adfd1a"
    # 替换为你要保存的路径
    output_dir = 'video'
    # 调用函数
    download_bilibili_video(video_url,output_dir)

执行效果:
在这里插入图片描述

说明:
从上面可以看到,you-get在下载视频时会显示视频标题、视频格式、清晰度、视频大小等信息,并显示下载进度,简洁明了,同时还会下载一个xml文件,用于存放视频的弹幕信息


下载内容:
下载完成后,我们可以在保存路径下看到两个文件,一个是视频文件,一个是xml文件,xml文件中存放着视频的弹幕内容
在这里插入图片描述


方法2:使用subprocess 模块调用you-get命令,执行效果与方法1相同

# 导入subprocess模块
import subprocess

def download_bilibili_video(url,output_dir):
    """
    使用you-get下载B站视频
    :param url: 视频的B站链接
    :param output_dir: 视频保存的目录
    """
    try:
        # 使用 subprocess 调用 you-get命令 下载视频
        subprocess.run(['you-get','-o',output_dir,video_url]) # 将命令以空格分隔为一个列表
        print(f"视频下载完成,保存在 {output_dir}")
    except Exception as e:
        print(f"下载视频时出错: {e}")

if __name__ == "__main__":
    # 替换为你要下载的B站视频链接
    video_url = "https://www.bilibili.com/video/BV1NVBXYbEta/?spm_id_from=333.1007.tianma.24-4-94.click&vd_source=e8e376ccbc5aa4cfd88e6a7917adfd1a"
    # 替换为你要保存的路径
    output_dir = 'video'
    # 调用函数
    download_bilibili_video(video_url,output_dir)

1.2 指定视频下载的清晰度

在使用 you-get 下载 B站视频时,可以通过 --format 参数指定下载的清晰度。you-get 会自动列出视频可用的清晰度选项,你可以从中选择适合的清晰度进行下载。使用步骤如下:


步骤1:在下载视频之前,可以先查看视频支持的清晰度。使用以下命令:

命令:you-get -i 视频链接

示例:

# 导入os模块
import os

# 替换成要下载的视频链接
video_url = 'https://www.bilibili.com/video/BV1NVBXYbEta/?spm_id_from=333.1007.tianma.24-4-94.click&vd_source=e8e376ccbc5aa4cfd88e6a7917adfd1a'
# 查看视频可下载的清晰度
os.system(f'you-get -i {video_url}')

输出结果:

site:                Bilibili
title:               “我 自 己 看 的 时 候 也 没 绷 住!”
streams:             # Available quality and codecs
    [ DASH ] ____________________________________
    - format:        dash-flv480-AVC
      container:     mp4
      quality:       清晰 480P avc1.64001F
      size:          12.7 MiB (13279292 bytes)
    # download-with: you-get --format=dash-flv480-AVC [URL]

    - format:        dash-flv480-AV1
      container:     mp4
      quality:       清晰 480P av01.0.00M.10.0.110.01.01.01.0
      size:          8.7 MiB (9078850 bytes)
    # download-with: you-get --format=dash-flv480-AV1 [URL]

    - format:        dash-flv480-HEVC
      container:     mp4
      quality:       清晰 480P hev1.1.6.L120.90
      size:          8.2 MiB (8633337 bytes)
    # download-with: you-get --format=dash-flv480-HEVC [URL]

    - format:        dash-flv360-AVC
      container:     mp4
      quality:       流畅 360P avc1.64001E
      size:          6.6 MiB (6945286 bytes)
    # download-with: you-get --format=dash-flv360-AVC [URL]

    - format:        dash-flv360-AV1
      container:     mp4
      quality:       流畅 360P av01.0.00M.10.0.110.01.01.01.0
      size:          4.6 MiB (4840628 bytes)
    # download-with: you-get --format=dash-flv360-AV1 [URL]

    - format:        dash-flv360-HEVC
      container:     mp4
      quality:       流畅 360P hev1.1.6.L120.90
      size:          4.2 MiB (4455357 bytes)
    # download-with: you-get --format=dash-flv360-HEVC [URL]


说明:
从上面的结果可以看到,执行命令后,会显示出视频可以下载的不同清晰度以及不同的编码格式,我们需要的是其中- format参数对应的值,该值用于指定视频下载的清晰度。



步骤2:使用 --format 参数指定清晰度。例如,下载 dash-flv480-AVC 格式的 480P 视频:

命令:you-get --format=清晰度格式 视频链接

示例:

import os

def download_bilibili_video(url, format=None, output_dir='.'):
    """
    使用you-get下载B站视频,并指定清晰度
    :param url: 视频的B站链接
    :param format: 清晰度对应的format参数(如flv、dash等)
    :param output_dir: 视频保存的目录,默认为当前目录
    """
    try:
        # 构建you-get命令
        command = f'you-get -o {output_dir}'
        if format:
            command += f' --format={format}'
        command += f' {url}'

        # 执行命令
        os.system(command)
        print(f"视频下载完成,保存在 {output_dir}")
    except Exception as e:
        print(f"下载视频时出错: {e}")

if __name__ == "__main__":
    # 替换为你要下载的B站视频链接
    video_url = "https://www.bilibili.com/video/BV1NVBXYbEta/?spm_id_from=333.1007.tianma.24-4-94.click&vd_source=e8e376ccbc5aa4cfd88e6a7917adfd1a"
    # 指定清晰度,(如flv、dash等)
    video_format = "dash-flv480-AVC"
    # 下载视频
    download_bilibili_video(video_url, format=video_format)


注意事项:

  1. 清晰度可用性:并非所有视频都支持所有清晰度,具体取决于视频的上传格式和B站的转码情况。

  2. 默认清晰度:如果不指定 --format 参数,you-get 会默认下载最高清晰度的视频。

  3. 清晰度参数:–format 参数的值(如 flv、dash 等)需要通过 you-get -i 命令查看。

2、bilibili-api库的使用及介绍

bilibili-api是一个功能丰富的库,可以获取B站视频的详细信息,如标题、作者、播放量、弹幕、评论数等。

示例:

from bilibili_api import video
import asyncio

async def get_video_info(bvid):
    """
    获取B站视频信息
    :param bvid: 视频的BV号
    """
    try:
        # 创建视频对象
        v = video.Video(bvid=bvid)
        # 获取视频信息,返回的是一个字典对象,里面包含着视频的各种信息
        info = await v.get_info()
        print(info)

        # 通过字典取值的方式,打印出我们想要的信息,这里我只打印了部分信息
        print("视频信息:")
        print(f"标题: {info['title']}")
        print(f"作者: {info['owner']['name']}")
        print(f"播放量: {info['stat']['view']}")
        print(f"弹幕数: {info['stat']['danmaku']}")
        print(f"发布时间: {info['pubdate']}") # 这里返回的是一个时间戳,需要手动处理成日期格式
    except Exception as e:
        print(f"获取视频信息时出错: {e}")

if __name__ == "__main__":
    # 替换为你要查询的B站视频BV号
    bvid = "BV1NVBXYbEta"
    # 运行异步函数
    asyncio.get_event_loop().run_until_complete(get_video_info(bvid))

输出结果:

{'bvid': 'BV1BcC5YDEoW', 'aid': 113702531503202, 'videos': 1, 'tid': 24, 'tid_v2': 2041, 'tname': 'MAD·AMV', 'tname_v2': '动漫剪辑', 'copyright': 1, 'pic': 'http://i2.hdslb.com/bfs/archive/482d71126abaa49b53e1e63eb70fff3468d879ec.jpg', 'title': '“圣诞快乐,桐人!”', 'pubdate': 1734963242, 'ctime': 1734963042, 'desc': '-', 'desc_v2': [{'raw_text': '-', 'type': 1, 'biz_id': 0}], 'state': 0, 'duration': 168, 'rights': {'bp': 0, 'elec': 0, 'download': 1, 'movie': 0, 'pay': 0, 'hd5': 0, 'no_reprint': 1, 'autoplay': 1, 'ugc_pay': 0, 'is_cooperation': 0, 'ugc_pay_preview': 0, 'no_background': 0, 'clean_mode': 0, 'is_stein_gate': 0, 'is_360': 0, 'no_share': 0, 'arc_pay': 0, 'free_watch': 0}, 'owner': {'mid': 2051658654, 'name': '车一小雨', 'face': 'https://i0.hdslb.com/bfs/face/503a896adf40e05dd3729a21992f46346244c0b6.jpg'}, 'stat': {'aid': 113702531503202, 'view': 466163, 'danmaku': 237, 'reply': 1308, 'favorite': 10049, 'coin': 4577, 'share': 7629, 'now_rank': 0, 'his_rank': 0, 'like': 59484, 'dislike': 0, 'evaluation': '', 'vt': 0}, 'argue_info': {'argue_msg': '', 'argue_type': 0, 'argue_link': ''}, 'dynamic': '', 'cid': 27494384332, 'dimension': {'width': 1920, 'height': 1080, 'rotate': 0}, 'premiere': None, 'teenage_mode': 0, 'is_chargeable_season': False, 'is_story': False, 'is_upower_exclusive': False, 'is_upower_play': False, 'is_upower_preview': False, 'enable_vt': 0, 'vt_display': '', 'no_cache': False, 'pages': [{'cid': 27494384332, 'page': 1, 'from': 'vupload', 'part': 'mmexport1734962938917', 'duration': 168, 'vid': '', 'weblink': '', 'dimension': {'width': 1920, 'height': 1080, 'rotate': 0}, 'first_frame': 'http://i0.hdslb.com/bfs/storyff/n241223sa1as9ah42yx1je27s56h6z8e_firsti.jpg'}], 'subtitle': {'allow_submit': False, 'list': []}, 'is_season_display': False, 'user_garb': {'url_image_ani_cut': ''}, 'honor_reply': {'honor': [{'aid': 113702531503202, 'type': 7, 'desc': '热门收录', 'weekly_recommend_num': 0}]}, 'like_icon': '', 'need_jump_bv': False, 'disable_show_up_info': False, 'is_story_play': 1, 'is_view_self': False} 

视频信息:
标题: “圣诞快乐,桐人!”
作者: 车一小雨
播放量: 466163
弹幕数: 237
发布时间: 1734963242


解读返回的信息
video.get_video_info() 方法返回的是一个包含视频详细信息的字典。以下是一些常见的键和它们所代表的含义:

  • aid: 视频的AV号(如果视频有AV号的话)
  • bvid: 视频的BV号
  • title: 视频标题
  • owner: 视频发布者的信息(包括UID、昵称等)
  • pubdate: 视频发布时间
  • stat: 视频的统计信息(包括播放量、点赞数、投币数、收藏数、分享数、弹幕数等)
  • desc: 视频简介
  • tags: 视频的标签列表
  • cid: 视频的分P信息列表(每个分P都有自己的CID)


注意事项

  1. 遵守规则:确保你有权下载和使用视频,遵守B站的相关规定和法律法规。

  2. 反爬虫机制:B站可能会对频繁请求进行限制,建议合理使用爬虫工具。

  3. 更新库:you-get和bilibili-api可能会随着B站的变化而更新,确保使用最新版本。

3、you-get库下载限制说明

Python使用you-get确实可以下载B站(哔哩哔哩)上的大部分视频,但并不能保证下载B站上的所有视频。以下是对这一问题的详细解释:


1、you-get的下载能力

you-get是一个用于下载网络视频的命令行工具,支持多种视频网站,包括Bilibili(B站)、优酷、爱奇艺等。它允许用户指定视频的清晰度、保存位置等参数,并可以下载视频列表或整个系列。因此,对于B站上的大部分公开视频,you-get通常都能够成功下载。


2、下载限制
然而,需要注意以下几点下载限制:

  1. 版权保护:部分视频可能受到版权保护,无法直接通过you-get下载。这些视频可能包括付费内容、独家版权内容或与其他平台合作的内容。
  2. 地区限制:B站上的某些视频可能受到地区限制,只能在特定地区观看。如果你位于这些限制地区之外,即使使用you-get也可能无法下载这些视频。
  3. 视频格式和清晰度:虽然you-get允许用户指定视频的清晰度和格式,但B站上的某些视频可能只提供特定格式或清晰度的版本。如果指定的格式或清晰度不可用,you-get可能会下载失败或下载到低质量的视频。
  4. 网络问题:在下载过程中,可能会遇到网络问题导致下载失败。这些问题可能包括网络连接不稳定、B站服务器故障等。


3、使用建议
为了确保成功下载B站上的视频,以下是一些使用you-get的建议:

  1. 检查视频链接:确保你输入的视频链接是有效的,并且该视频在B站上是公开的。
  2. 指定合适的清晰度和格式:在下载前,使用 you-get 的 -i 选项查看视频的信息,了解可用的清晰度和格式,并指定合适的参数进行下载。
  3. 解决网络问题:如果遇到网络问题导致下载失败,可以尝试更换网络环境或使用代理服务器进行下载。
  4. 遵守法律法规:在下载视频时,请确保你遵守当地的法律法规和B站的使用协议,不要下载受版权保护的内容或用于非法用途。

综上所述,虽然you-get可以下载B站上的大部分视频,但由于版权保护、地区限制、视频格式和清晰度以及网络问题等因素的限制,并不能保证下载B站上的所有视频。因此,在使用you-get下载B站视频时,需要注意以上限制和建议。


总结:
本篇文章我只是简单介绍了you-get 和 bilibili-api两个库的使用,并针对B站视频做了案例演示,根据测试,B站上up主发布的视频基本是可以下载的,但那些有版权的电影、电视剧、动漫等是无法下载的,至于下载其它视频网站以及如何提高下载清晰度这些问题,则需要大家自行去研究了。


Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐