清华主页 - 清华新闻 - 综合时讯 - 正文

BiliBili视频下载

脚本地址:

项目地址: Gazer

BiliGrab.py

提要

适用于: 登录状态下, 非大会员视频下载.

自动解析任意 B 站非大会员 / 付费视频的视频 & 音频请求链接并下载, 需要添加 Cookie 保证视频清晰度. 使用 FFmpeg 命令无损合并视频和音频.

使用方法

  1. 克隆或下载项目代码.
  2. 安装依赖: pip install requests, 或者克隆项目代码后 pip install -r requirements.txt
  • 脚本顶部: 指定常量 FOLDER_PATH, 保存视频和音频文件夹路径
  • 主函数处: 填写你的 cookie
  • 主函数处: 指定 url, 要下载的视频 URL
  • 主函数处: 指定 video_file_nameaudio_file_name, 要保存的视频和音频文件名

代码结构

  1. get_url从 HTML 中的 window.__playinfo__提取解析视频的 2 个请求 URL
  2. download_video接收 get_url的返回链接, 下载视频/音频文件

抓包

登录状态下, 随机打开哔哩哔哩的一个视频, 打开 devtool, 播放一会视频, 让请求一一列出. 然后在 Network面板的过滤器中, 输入 m4s, 过滤出与视频相关的请求. 点 Size从大到小排列.

在这里插入图片描述

m4s过滤可以同时过滤出音频和视频, Type 都是 application/octet-stream. 这证明了音频和视频数据都是以 m4s 格式存储的, 并且使用了相同的 MIME 类型.

请求为 ...100026...的是视频请求网址, 请求为 ...30280...的是音频请求网址.

点开请求可以看到, Status Code: 206 Partial Content, 表示服务器成功处理了部分 GET 请求, 而且说明视频内容是一部分一部分传输的.

复制视频/音频的请求 URL, 分别使用 requestsget 一下, 能够成功下载完整视频和音频.

代码示例 (下载单个 m4s 片段):

importrequestsvideo_url ="Request_URL"# 替换成你找到的请求链接headers ={ "Referer":"https://www.bilibili.com/","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",}response =requests.get(video_url,headers=headers,stream=True)ifresponse.status_code ==200orresponse.status_code ==206:withopen("video_part.m4s","wb")asf:forchunk inresponse.iter_content(chunk_size=8192):ifchunk:f.write(chunk)print("下载成功!")else:print("下载失败!")print(response.status_code)

自动解析视频和音频的请求 URL

现在这个脚本只能自己通过 devtool 来查看请求的 URL 然后复制到脚本再下载, 那么如何做到我们只需要输入 B 站视频的地址, 即可自动获取它的 2 个请求 (视频和音频) 的 URL 呢?

分析 B 站视频页面的 HTML 结构:

  • 找到包含视频和音频 URL 的 HTML 元素或 JavaScript 变量.
  • 通常, 视频和音频的 URL 会以某种形式嵌入在网页中, 例如:
    • 标签的 src属性中(但 B 站通常不是这样).
    • 在 JavaScript 变量中(例如一个名为 window.__playinfo__的变量, 这是 B 站常用的).
    • 在 JSON 数据中(例如一个包含视频信息的 JSON 对象).
  1. play_info的提取:

    • 原先使用了 soup.select_one('head > script:nth-child(58)')来定位包含 play_info 清华大学新闻中心版权所有,清华大学新闻网编辑部维护,电子信箱: news@tsinghua.edu.cn
      Copyright 2001-2020 news.tsinghua.edu.cn. All rights reserved.