前言
众所周知,B站是一款听歌软件,上卖有很多修复过的4K超清歌曲MV。除了听歌外,还有一些UP主发布的剪辑视频、素材视频等,都在上面说了分享素材。

可是,B站的视频下载很麻烦,很多人只知道可以保存在手机的APP里面,不知道怎么保存到本地。以前我写过爬B站视频的,B站是视频和声音分离的,需要用到ffmpeg合成工具才行
不过,最近有同学问我,用我之前分享的方法下载不了bilibili站的视频资源啊,然后我自己试了下,果然,它更新了!

下面是2021年11月最新的一个下载方法
环境
- python 3.8
- pycharm
模块使用:
- requests >>> pip install requests
- re
- subprocess
思路流程
首先要获取那些东西, 最后才能得到 我想视频数据和音频数据
- bv号 >>> 自己传入视频的BV号
- 保存音频 视频数据内容 需要视频标题
- cid session 参数
- 最后才去提取想要音频url地址和视频的url地址
- 合并音频和视频
分析网站
可以在开发者工具里搜索playurl,在数据包里找到我们所需要的数据

这两个就是我们所需要的视频数据和音频数据

视频的请求参数,下面会用到

开始代码
导入模块
import requests # 数据请求模块 pip install requests
import re # re正则表达式 提取数据
import subprocess # 子进程
import os # 文件操作的模块
请求数据
headers = {
'referer': 'https://www.bilibili.com/',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36'
}
def get_response(html_url):
response = requests.get(url=html_url, headers=headers)
return response
获取视频标题
def get_video_info(html_url):
html_data = get_response(html_url).text
title = re.findall('<h1 title="(.*?)" class="video-title">', html_data)[0]
cid = re.findall('"cid":(\d+),', html_data)[0]
session = re.findall('"session":"(.*?)"', html_data)[0]
video_info = [cid, session, title]
return video_info
获取 音频数据 以及 视频数据
def get_video_content(bv_id, cid, session):
index_url = 'https://api.bilibili.com/x/player/playurl'
data = {
'cid': cid,
'qn': '32',
'type': '',
'otype': 'json',
'fourk': '1',
'bvid': bv_id,
'fnver': '0',
'fnval': '976',
'session': session,
}
json_data = requests.get(url=index_url, params=data, headers=headers).json()
# 通过字典键值对方法 取内容, 就根据冒号左边内容 提取冒号右边的内容
audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
video_url = json_data['data']['dash']['video'][0]['baseUrl']
video_content = [audio_url, video_url]
return video_content
保存数据
def save(title, audio_url, video_url):
# response.text 获取响应体的文本数据 (一般网页源代码) 返回数据类型 字符串
# response.content 获取响应体的二进制数据 (保存图片/音频/视频/特定格式文件) 二进制数据内容
# response.json() 获取响应体的json字典数据 字典数据类型
audio_content = get_response(audio_url).content
video_content = get_response(video_url).content
with open(title + '.mp3', mode='wb') as f:
f.write(audio_content)
with open(title + '.mp4', mode='wb') as f:
f.write(video_content)
print(title, '视频保存完成')
数据的合并
def merge_data(video_name):
print('视频合成开始:', video_name)
cmd = f"ffmpeg -i {video_name}.mp4 -i {video_name}.mp3 -c:v copy -c:a aac -strict experimental {video_name}output.mp4"
# print(cmd)
subprocess.run(cmd, shell=True)
print('视频合成结束:', video_name)
os.remove(f'{video_name}.mp4')
os.remove(f'{video_name}.mp3')
实现效果



网友评论