Python爬虫实战:下载并合并Bilibili视频音视频文件

1. 引言

在网络上,有许多精彩的视频资源,其中包括了Bilibili上的各种视频。有时候我们可能需要将这些视频下载到本地进行观看或进一步编辑。本篇博客将介绍如何使用Python爬虫来下载Bilibili视频,并且将其音视频文件合并成一个完整的视频文件。

2. 代码功能解析

我们先来看一下代码的主要功能:

  • 提取标题信息:通过正则表达式从 Bilibili 视频页面中提取视频的标题信息。

  • 获取音视频信息:使用正则表达式提取页面中的 JavaScript 数据,并使用 JSON 解析得到音视频的 URL。

  • 下载音视频文件:使用 requests 库下载音视频文件,并保存到本地。

  • 合并音视频文件:通过调用 ffmpeg 命令,将下载的音视频文件合并为一个新的视频文件。

3. 使用说明

在运行代码之前,需要做以下准备:

  • 安装 Python 环境,并确保已安装以下库:requestsffmpeg-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 爬虫的理解,还可以为我们在日常生活中获取在线视频提供便利。

希望本文对你有所帮助,谢谢阅读!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值