本文主要介绍如何利用requests爬取B站视频并合成的相关技术。话不多说,我们直接开始喵~
(可以先点个赞鼓励一下作者喵QAQ)
1. 首先,在代码开头,我们导入os库、requests库、re库、ffmpeg库(后续合成需要用到):
import requests
import ffmpeg
import re
import os
2. 下面我们再来构建headers:
headers = {
'Referer': 'https://www.bilibili.com/',
'Cookie': '', # 这里的Cookie输入自己B站的cookie喵
'User-Agent': '' # 这里填入自己的User-Agent
}
关于Cookie和User-Agent怎么找,这里我们详细来讲解一下:
首先我们随便打开一个视频,打开开发者界面后,刷新网页以获取到所有事件。在“网络”选项中点击第一个类型为“document”的事件,在标头中找到Cookie和User-Agent即可
取得所有headers所需信息后,我们开始想办法获取视频和音频所在的url(B站的视频文件和音频文件是分离的)。这里我们先对上述document中的url发送get请求,取得响应内容:
url = 'https://www.bilibili.com/video/' + bv
direct = requests.get(url, headers=headers).text
print(direct)
运行这一段代码(其中bv是指该视频的bv号)我们可以得到响应内容,在响应内容中我们搜索“baseurl”后出现多个结果,如下:
在响应中查找baseurl
我们可以发现,这一段下面有个“mineType”,对应的值为“video/mp4”,意味着这是视频画面的url。再往后面查询,如果“mineType”对应的值为“audio/mp3”,则为音频的url。然后,我们据此构建正则表达式提取出目标url,将画面和音频获取下来:
pattern = re.compile('"baseUrl":"(.*?)"') # 构建正则表达式
pattern1 = re.compile('"title":"(.*?)",') # 这里构建的正则表达式是为了获取视频标题,方便后续文件命名
lis = pattern.findall(direct)
lis0 = pattern1.findall(direct) # 将所有“baseurl”获取下来
title = lis0[0].replace(' ', '_')
videoU = lis[0] # 这里得到画面的url
audioU = lis[-1] # 这里得到音频的url
video = requests.get(videoU, headers=headers).content
audio = requests.get(audioU, headers=headers).content
with open(self.path + '/' + 'audio.mp3', 'wb') as f:
f.write(audio)
f.close()
with open(self.path + '/' + 'video.mp4', 'wb') as f:
f.write(video)
f.close()
到这里我们就获取到音频和画面了,接下来我们需要将这两个文件合成为一个完整的视频,需要调用ffmpeg喵。
3. 合成视频
这里需要用到ffmpeg和Python中的ffmpeg库,需要提前下载ffmpeg哦!
ffmpeg官方网址FFmpeg
(下载完成后别忘了配置环境变量喵,具体操作这里暂且不做展开)
操作如下:
audio = ffmpeg.input('audio.mp3')
video = ffmpeg.input('video.mp4')
out = ffmpeg.output(video, audio, title + '.mp4') # 合成视频
out.run()
os.remove('audio.mp3') # 删除原有的音频文件
os.remove('video.mp4') # 删除原有的画面文件
到这里就获取到完整的视频辣
当然,本文只是提供了一个简单的思路,实际可操作的方法还有很多。