不知道兄弟们有没有遇到过b站视频经常下架的问题,就比如我现在想在b站找一个老师的课程,运气好可以找到,但经常看了一段时间之后可能就会下架,然后继续找,过不了多久又会下架,这样的循环搞得我好烦呀,这时候我突然想起来万能的python,python爬b站视频咋样?说干就干
python环境必不可少,同时需要ffmpeg,一台可以上网的电脑
首先随便打开一个视频,然后右键查看网页源代码
由于展示的源代码格式有点乱,所以我选择复制到vscode中查看
这时候看着就舒服多了,细心的朋友可能已经发现baseUrl,然后我们复制一下这个baseUrl,在浏览器中打开康康,果然不出所料
还是老实巴交的用python访问吧,header头设置好之后就可以直接访问了,至于header头怎么设置,相信兄弟们都懂,一切就绪之后可以拿到这个文件,值得注意的是b站的视频文件和音频文件是分开存储的,因此我们还需要下载音频文件,音频文件url的位置和视频文件url的位置靠很近,就在audio这里存放着
这样音频文件和视频文件的地址我么都拿到了,随后就可以开始下载了,下载之后使用ffmpeg将两个文件操作一下就可以了。这里有ffmpeg的安装教程,大家可以看一下,ffmpeg安装教程,欢迎三连
import os
# 声音视频结合
def videoMixAudio(videourl, audiourl, mp4url):
com = f'D:\\tool\\ffmpeg\\bin\\ffmpeg.exe -i "{audiourl}" -i "{videourl}" ' \
f'-acodec copy -vcodec copy "{mp4url}"'
os.system(com)
os.remove(videourl)
os.remove(audiourl)
这里解释一下。videourl是视频文件的全路径,audiourl是音频文件的全路径,mp4url则是生成的有声音的视频的位置,然后通过调用ffmpeg来对音频和视频文件进行合成,没有使用ffmpeg的同学们可以采用格式工厂的方式对这两个文件操作进行操作也是可以的。
使用到了这三个匹配规则
# 拿到')
# 拿到window.__playinfo__后面的内容
infoink = re.compile(r'window.__playinfo__=(.*)')
# 这个是为了拿到视频的名字 可以选择不用
nameink = re.compile(r'window.__INITIAL_STATE__=(.*);\(function')
valink用于取出下图这个部分的内容
infoink是为了把window._playinfo_去掉,这样拿到的就是可以转换为json的字符串
这样就可以拿到视频和音频的url了
代码如下
def downloadVideo(url):
# 获取网页源代码
html = requests.get(url).text
# 拿到script的内容
info = re.findall(valink, html)
# 第一个就是playinfo的那个script
info2 = str(info[0])
# 这一个是存放视频信息的scripte
info3 = str(info[1])
nameAnd=re.findall(nameink,info3)
# 把window._playinfo_去掉,拿到一个可以转换为json的字符串
videoAndAudio = re.findall(infoink, info2)
# str转json
jsonobject = json.loads(videoAndAudio[0])
nameobject = json.loads(nameAnd[0])
name=nameobject["videoData"]["title"]
# 获取视频和音频的链接
videoFile = jsonobject["data"]["dash"]["video"][0]["baseUrl"]
audioFile = jsonobject["data"]["dash"]["audio"][0]["baseUrl"]
拿到链接之后就可以开始下载了,记住下载的时候要设置好header