1. 引言
在网络上,有许多精彩的视频资源,其中包括了Bilibili上的各种视频。有时候我们可能需要将这些视频下载到本地进行观看或进一步编辑。本篇博客将介绍如何使用Python爬虫来下载Bilibili视频,并且将其音视频文件合并成一个完整的视频文件。
2. 代码功能解析
我们先来看一下代码的主要功能:
-
提取标题信息:通过正则表达式从 Bilibili 视频页面中提取视频的标题信息。
-
获取音视频信息:使用正则表达式提取页面中的 JavaScript 数据,并使用 JSON 解析得到音视频的 URL。
-
下载音视频文件:使用
requests
库下载音视频文件,并保存到本地。 -
合并音视频文件:通过调用
ffmpeg
命令,将下载的音视频文件合并为一个新的视频文件。
3. 使用说明
在运行代码之前,需要做以下准备:
- 安装 Python 环境,并确保已安装以下库:
requests
、ffmpeg-python
。 - 获取 Bilibili 视频的页面 URL,例如
https://www.bilibili.com/video/BV11V411M7Fi?p=1
。
运行代码时,需要传入一个 Response 对象作为参数,该对象包含从 Bilibili 视频页面获取的响应内容。同时,需要指定下载的视频页数范围。
下载的视频文件将保存在当前目录下的 video
文件夹中,合并后的视频文件也保存在 video
文件夹中。
4. 依赖说明
该代码依赖以下库和工具:
requests
:用于发送 HTTP 请求和获取响应内容。re
:用于正则表达式匹配。json
:用于解析 JSON 格式的数据。ffmpeg
:用于音视频处理,包括合并音视频文件。
在运行代码之前,请确保已安装好这些依赖项。你可以使用以下命令来安装它们:
pip install requests ffmpeg-python
5.运行代码
import json
import re
from pprint import pprint
# from moviepy import editor
import subprocess
import requests
from moviepy.editor import *
cookies = {
'buvid3': '8B898388-D112-02F0-542C-1D375741F22C36008infoc',
'b_nut': '1712304436',
'_uuid': 'EFD858CA-995B-871E-67D8-361094BAC5DD136321infoc',
'buvid4': 'D7E478ED-82BB-76EB-6E45-980705C7B2B337360-024040508-h%2BTN5%2FlAgAUJAzzUQIDA1g%3D%3D',
'CURRENT_FNVAL': '4048',
'rpdid': '|(kmJYllJJJk0J\'u~uk)J)YlJ',
'bili_ticket': 'eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTQ3MjI2NTMsImlhdCI6MTcxNDQ2MzM5MywicGx0IjotMX0.81gn4bu3RAgCpMa_DB9IVP44i_GEUC070Vcn20lGglo',
'bili_ticket_expires': '1714722593',
}
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'zh-CN,zh;q=0.9',
'cache-control': 'max-age=0',
'priority': 'u=0, i',
'referer': 'https://www.bilibili.com/?spm_id_from=333.788.0.0',
'sec-ch-ua': '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
}
# print(response.text)
# 标题
def run_v(response):
title = re.findall('<title data-vue-meta="true">(.*)</title>', response.text)[0]
print(title)
# 音视频信息
data = re.findall("<script>window.__playinfo__=(.*?)</script>", response.text)[0]
js_data = json.loads(data)
# print(js_data)
# 取音频
audio_url = js_data.get('data').get('dash').get('audio')[0].get('baseUrl')
print(audio_url)
# 取视频
video_url = js_data.get('data').get('dash').get('video')[0].get('baseUrl')
print(video_url)
audio = requests.get(audio_url, cookies=cookies, headers=headers)
video = requests.get(video_url, cookies=cookies, headers=headers)
with open(f'./video/{title}.mp3', 'wb') as a:
a.write(audio.content)
with open(f'./video/{title}.mp4', 'wb') as a:
a.write(video.content)
# 定义视频和音频文件路径
# video_path = "./video/命名.mp4"
# audio_path = "./video/命名.mp3"
# output_path = "./v命名.mp4"
# # 加载视频和音频
# video_clip = VideoFileClip(video_path)
# audio_clip = AudioFileClip(audio_path)
#
# # 给视频添加音频
# video_clip = video_clip.set_audio(audio_clip)
#
# # 保存合成后的视频
# video_clip.write_videofile(output_path, codec="libx264", audio_codec="aac", temp_audiofile="temp-audio.m4a", remove_temp=True)
# import ffmpeg
#
# audio = ffmpeg.input(f'./video/命名.mp3')
# video = ffmpeg.input(f'./video/命名.mp4')
# out = ffmpeg.output(video,audio,f'./v命名.mp4')
# out.run()
import os
# video_path = "C:/Users/Administrator/Desktop/ownproject/Python_wechat/video/命名.mp4"
# audio_path = "C:/Users/Administrator/Desktop/ownproject/Python_wechat/video/命名.mp3"
# output_path = "C:/Users/Administrator/Desktop/ownproject/Python_wechat/v命名.mp4"
# audio_path = "./video/{title}.mp3"
# 可以实现视频音频合并
# def convert_audio():
# os.system("ffmpeg -i " + audio_path + " -i " + video_path + " " + output_path)
#
# convert_audio()
# 合并速度更快
cmd = f'ffmpeg -hide_banner -i video\\{title}.mp4 -i video\\{title}.mp3 -c:v copy -c:a aac -strict experimental video\\{title}output.mp4'
subprocess.run(cmd)
# 可以实现爬取多个视频内容
for i in range(1,15):
response = requests.get('https://www.bilibili.com/video/BV11V411M7Fi?p=' + str(i), cookies=cookies, headers=headers)
run_v(response)
6. 结语
通过本文的介绍,我们学习了如何使用 Python 爬虫来下载 Bilibili 视频,并且将其音视频文件合并成一个完整的视频文件。这个小项目不仅提升了我们对 Python 爬虫的理解,还可以为我们在日常生活中获取在线视频提供便利。
希望本文对你有所帮助,谢谢阅读!