当我们看到那些自己喜欢的B站视频的时候,我们想要将其下载下来,但是呢,网页版的并不能够进行下载 所以我们可以进行爬虫: 首先:先随便点开一个B站视频: ps: (1)B站的网址有这么个特点:他的网址是由头:www.bilibili.com/video/ 和 视频的BV号组成,即使后面会跟着一串的人看不懂的东西,但是把那串东西删去,依然可以打开链接 (2)B站的视频信息在页面源代码中是可以看到的,只需要ctrl+f查询playinfo后面跟着一串反人类的东西,那些东西就是视频 (3)B站的视频是分为音频和视频两个,所以我们需要先进行下载ffmpeg,可以进行视频和音频的合并,可以在官网中下载,还可以pip install ffmpeg 知道了这些代码就就很容易写了:
import requests
import os
import json
import re
import pprint
import ffmpeg
import subprocess
from urllib.parse import quote
os_path=os.getcwd()+'/B站视频/'
if not os.path.exists(os_path):
os.mkdir(os_path)
input=input('请输入视频的BV号:<示例:BV1mB4y1e7Lh>')#满足用户的需求
user_input=quote(input)#将输入的字符串编入url中
url=f'https://www.bilibili.com/video/{user_input}'
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.49',
'referer':f'{url}'
}#建议加上referer,因为很容易403
response=requests.get(url,headers=headers).text
name=re.findall('<title data-vue-meta="true">(.*?)</title>',response)[0]#使用正则提取出title作为name
play_info=re.findall('<script>window.__playinfo__=(.*?)</script>',response)[0]#使用正则提取出来playinfo,从而获得video的url和audio的url
#print(name,play_info)
dict=json.loads(play_info)#由于输出的play info是一个字符串类型,需要将其改为json类型
#print(dict)
#pprint.pprint(dict)---------------pprint.pprint可以将json类型进行格式化,让他变得更好看,更容易找到audio_url和video_url
audio_url=dict['data']['dash']['audio'][0]['baseUrl']
video_url=dict['data']['dash']['video'][0]['baseUrl']#其中有很多的url,但是仔细看看,都是一样的,由备份url,baseurl,一堆
#print('Audio_url',audio_url)
#print('Video_url',video_url)
audio_resp=requests.get(audio_url,headers=headers).content#进行请求,由于是音频和视频,所以需要进行二进制,加上.content
video_resp=requests.get(video_url,headers=headers).content
with open(os_path+name+'.mp3','wb')as f:#这里mode是需要等于wb的,因为是二进制文件
f.write(audio_resp)
print('音频保存完成')
with open(os_path+name+'.mp4','wb')as f:
f.write(video_resp)
print('视频保存完成')
COMMAND=f'ffmpeg -i B站视频\\{name}.mp3 -i B站视频\\{name}.mp4 -c:v copy -c:a aac -strict experimental B站视频合\\{name}.mp4'
subprocess.run(COMMAND,shell=True)
print('视频合并完成')
进行合成音频的时候呢,是先定义一个COMMAND,之后里面的格式是这个样子的: ffmpeg -i 文件的路径\{name}.mp3 -i 文件的路径\{name}.mp4 -c:v copy -c:a aac -strict experimental 合成完的文件想要放在的地方\{name}.mp4 其中,ffmepg这个东西不能够自己新建文件,需要自己手动建一个文件 添加一个子进程,import subprocess subprocess.run(COMMAND,shell=True)--------------这个是让子进程运行 运行之后会发现合成的过程代码是一串红色,但是这并不是出错,成功的话会在底下说明的