利用自动化程序获取B站视频
引文链接:
在上一章的叙述中,我们已经了解了获取B站视频的方式。接下来让我们考虑如何把它变为自动化程序。
warning 提示
这里以Python为例,您也可以改造其他语言的版本。
头绪
现在问题来了,我们的程序不能依赖浏览器解析原视频链接(就算依赖了也难以实现)。当务之急,就是找到源视频链接隐藏在什么地方。
比如说我现在打开这个视频:
然后看到视频URL是https://upos-sz-mirrorks3.bilivideo.com/upgcxcode/87/39/295443987/295443987-1-16.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1616501273&gen=playurlv2&os=ks3bv&oi=1018424233&trid=e4a339385c1742cc935ec43bee36eac1h&platform=html5&upsig=ba6920880404564592895256cded0950&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=504293988&logo=80000000
。
接着,我们看一看网页源代码:
如你所见,你会看到在中间的options
的json
里看到以下几个链接。下面笔者粘贴出来做样例解析。
var options = {
aid: 331505664,
bvid: 'BV1yA411u7RR',
cid: 295443987,
readyPoster: '//i0.hdslb.com/bfs/archive/efc17d8ae488470712d57e4ad6d84ef07c3c40cd.jpg@480w_270h_1c',
readyVideoUrl: 'https://upos-sz-mirrorks3.bilivideo.com/upgcxcode/87/39/295443987/295443987-1-16.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1616501764&gen=playurlv2&os=ks3bv&oi=1018424233&trid=5c99efb95f0d41988373e18489074183h&platform=html5&upsig=070c72c614ca3411f70365b62c279b96&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=504293988&logo=80000000',
readyDuration: 184,
noRecommend: gqs('from') == 'game'
}
bvid
:视频号;readyPoster
:视频封面图片;readyVideoUrl
:源视频链接。
(有些不知道什么含义的没列出,望大佬指教QWQ)
好家伙,这里我们直接获取视频即可。
代码实现
warning 注意
您应该使用移动端的标头(headers)进行GET请求。
这里粘贴出基本代码:
from requests import *
import os
from json import *
def get_and_save(vid,path):
headers={'user-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'}
print("getting HTML...",end=' ')
r=get(url='https://m.bilibili.com/video/'+vid,headers=headers)
html=r.text
print("done! parsing...")
vurl=(html[html.find('readyVideoUrl: ')+18:html.find("readyDuration")-15])
name=html[html.find('''data-vue-meta="true">''')+21:html.find("")]
if os.path.exists(path+name+'.mp4')==False:
print("downloading video...",end=' ')
resp = get('ht'+vurl,headers=headers)
print("done!\nsaving video...",end=' ')
with open(path+name+'.mp4','wb') as f:
f.write(resp.content)
print("done!")
return path+name+'.mp4'
无聊的时候,把B站视频下载下来,弄成音频保存在本地听,怪无聊的(
——该代码从何而来
已经为您包装好了函数,即get_and_save
部分的代码,谢谢。(