文章

利用自动化程序获取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

接着,我们看一看网页源代码:


CTRL+U即刻调出源代码界面

如你所见,你会看到在中间的optionsjson里看到以下几个链接。下面笔者粘贴出来做样例解析。

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部分的代码,谢谢。(

本文由作者按照 CC BY 4.0 进行授权

© Dignite. 保留部分权利。 由  提供CDN加速。

浙ICP备2023032699号 | 使用 Jekyll 主题 Chirpy