寫一個(gè)Python腳本下載嗶哩嗶哩舞蹈區(qū)的所有視頻
一、抓取列表
首先點(diǎn)開舞蹈區(qū)先選擇宅舞列表。

然后打開 F12 的控制面板,可以找到一條 https://api.bilibili.com/x/web-interface/newlist?rid=20&type=0&pn=1&ps=20&jsonp=jsonp&callback=jsonCallback_bili_57905715749828263 的 url,其中 rid 是 B 站的小分類,pn 是頁數(shù)。

小編試著在瀏覽器將地址打開居然報(bào)了 404,可是在控制面板中這個(gè)地址的返回值明明就是視頻列表。試著去掉 callback 的參數(shù),意外的得到了想要的結(jié)果。

眾所周知 bid 是一個(gè) B 站視頻的唯一 ID,想要獲取 bid 可以從上面 url 的返回值中提取 aid,然后將 aid 轉(zhuǎn)換為 bid。
Str='fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'#準(zhǔn)備的一串指定字符串
Dict={}
#將字符串的每一個(gè)字符放入字典一一對(duì)應(yīng),如 f對(duì)應(yīng)0 Z對(duì)應(yīng)1 一次類推。
foriinrange(58):
Dict[Str[i]]=i
s=[11,10,3,8,4,6,2,9,5,7]#必要的解密列表
xor=177451812
add=100618342136696320#這串?dāng)?shù)字最后要被減去或加上
defalgorithm_enc(av):
ret=av
av=int(av)
av=(av^xor)+add
#將BV號(hào)的格式(BV+10個(gè)字符)轉(zhuǎn)化成列表方便后面的操作
r=list('BV')
foriinrange(10):
r[s[i]]=Str[av//58**i%58]
return''.join(r)
deffind_bid(p):
bids=[]
r=requests.get(
'https://api.bilibili.com/x/web-interface/newlist?&rid=20&type=0&pn={}&ps=50&jsonp=jsonp'.format(p))
data=json.loads(r.text)
archives=data['data']['archives']
foriteminarchives:
aid=item['aid']
bid=algorithm_enc(aid)
bids.append(bid)
returnbids
二、獲取視頻的 CID
想要下載 1080 的視頻,光有 bid 是不夠的,還需要 登錄后 Cookie 中的 SESSDATA 值和 cid 。
首先登錄 B 站將 Cookie 中的 SESSDATA 復(fù)制到對(duì)象頭中。用地址為 https://api.bilibili.com/x/player/pagelist?bvid= url 返回 cid。
defget_cid(bid):
url='https://api.bilibili.com/x/player/pagelist?bvid='+bid
headers={
'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/90.0.4430.212Safari/537.36',
'Cookie':'SESSDATA=182cd036%2C1636985829%2C3b393%2A51',
'Host':'api.bilibili.com'
}
html=requests.get(url,headers=headers).json()
infos=[]
data=html['data']
cid_list=data
foritemincid_list:
cid=item['cid']
title=item['part']
infos.append({'bid':bid,'cid':cid,'title':title})
returninfos
三、下載視頻
下載視頻的 https://api.bilibili.com/x/player/playurl 來自于每次視頻播放完之后的推薦列表。

最后使用 urllib.request.urlretrieve 函數(shù)下載視頻。
defget_video_list(aid,cid,quality):
url_api='https://api.bilibili.com/x/player/playurl?cid={}&bvid={}&qn={}'.format(cid,aid,quality)
headers={
'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/90.0.4430.212Safari/537.36',
'Cookie':'SESSDATA=182cd036%2C1636985829%2C3b393%2A51',
'Host':'api.bilibili.com'
}
html=requests.get(url_api,headers=headers).json()
video_list=[]
foriinhtml['data']['durl']:
video_list.append(i['url'])
returnvideo_list
defschedule_cmd(blocknum,blocksize,totalsize):
percent=100.0*blocknum*blocksize/totalsize
s=('#'*round(percent)).ljust(100,'-')
sys.stdout.write('%.2f%%'%percent+'['+s+']'+'\r')
sys.stdout.flush()
defdownload(video_list,title,bid):
foriinvideo_list:
opener=urllib.request.build_opener()
opener.addheaders=[
('User-Agent','Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/90.0.4430.212Safari/537.36'),
('Accept','*/*'),
('Accept-Language','en-US,en;q=0.5'),
('Accept-Encoding','gzip,deflate,br'),
('Range','bytes=0-'),
('Referer','https://www.bilibili.com/video/'+bid),
('Origin','https://www.bilibili.com'),
('Connection','keep-alive'),
]
filename=os.path.join('D:\\video',r'{}_{}.mp4'.format(bid,title))
try:
urllib.request.install_opener(opener)
urllib.request.urlretrieve(url=i,filename=filename,reporthook=schedule_cmd)
except:
print(bid+"下載異常,文件:"+filename)
到此這篇關(guān)于寫一個(gè)Python腳本下載嗶哩嗶哩舞蹈區(qū)的所有視頻的文章就介紹到這了,更多相關(guān)python下載嗶哩嗶哩視頻內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信