寫(xiě)一個(gè)Python腳本下載嗶哩嗶哩舞蹈區(qū)的所有視頻
一、抓取列表
首先點(diǎn)開(kāi)舞蹈區(qū)先選擇宅舞列表。
然后打開(kāi) 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 站的小分類(lèi),pn 是頁(yè)數(shù)。
小編試著在瀏覽器將地址打開(kāi)居然報(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 一次類(lèi)推。 for i in range(58): Dict[Str[i]] = i s = [11, 10, 3, 8, 4, 6, 2, 9, 5, 7] # 必要的解密列表 xor = 177451812 add = 100618342136696320 # 這串?dāng)?shù)字最后要被減去或加上 def algorithm_enc(av): ret = av av = int(av) av = (av ^ xor) + add # 將BV號(hào)的格式(BV + 10個(gè)字符) 轉(zhuǎn)化成列表方便后面的操作 r = list('BV ') for i in range(10): r[s[i]] = Str[av // 58 ** i % 58] return ''.join(r) def find_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'] for item in archives: aid = item['aid'] bid = algorithm_enc(aid) bids.append(bid) return bids
二、獲取視頻的 CID
想要下載 1080 的視頻,光有 bid 是不夠的,還需要 登錄后 Cookie 中的 SESSDATA 值和 cid 。
首先登錄 B 站將 Cookie 中的 SESSDATA 復(fù)制到對(duì)象頭中。用地址為 https://api.bilibili.com/x/player/pagelist?bvid=
url 返回 cid。
def get_cid(bid): url = 'https://api.bilibili.com/x/player/pagelist?bvid=' + bid headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/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 for item in cid_list: cid = item['cid'] title = item['part'] infos.append({'bid': bid, 'cid': cid, 'title': title}) return infos
三、下載視頻
下載視頻的 https://api.bilibili.com/x/player/playurl
來(lái)自于每次視頻播放完之后的推薦列表。
最后使用 urllib.request.urlretrieve 函數(shù)下載視頻。
def get_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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36', 'Cookie': 'SESSDATA=182cd036%2C1636985829%2C3b393%2A51', 'Host': 'api.bilibili.com' } html = requests.get(url_api, headers=headers).json() video_list = [] for i in html['data']['durl']: video_list.append(i['url']) return video_list def schedule_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() def download(video_list, title, bid): for i in video_list: opener = urllib.request.build_opener() opener.addheaders = [ ('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/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)于寫(xiě)一個(gè)Python腳本下載嗶哩嗶哩舞蹈區(qū)的所有視頻的文章就介紹到這了,更多相關(guān)python下載嗶哩嗶哩視頻內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python腳本實(shí)現(xiàn)下載合并SAE日志
- Python實(shí)現(xiàn)的飛速中文網(wǎng)小說(shuō)下載腳本
- 編寫(xiě)Python腳本來(lái)實(shí)現(xiàn)最簡(jiǎn)單的FTP下載的教程
- 編寫(xiě)Python腳本批量下載DesktopNexus壁紙的教程
- 利用python寫(xiě)個(gè)下載teahour音頻的小腳本
- 使用python采集腳本之家電子書(shū)資源并自動(dòng)下載到本地的實(shí)例腳本
- Python實(shí)現(xiàn)多線(xiàn)程下載腳本的示例代碼
- Python實(shí)現(xiàn)一鍵下載視頻腳本
- Python百度指數(shù)獲取腳本下載并保存
相關(guān)文章
Python 實(shí)現(xiàn)平臺(tái)類(lèi)游戲添加跳躍功能
這篇文章主要介紹了Python 實(shí)現(xiàn)平臺(tái)類(lèi)游戲添加跳躍功能,,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-0313個(gè)最常用的Python深度學(xué)習(xí)庫(kù)介紹
這篇文章主要介紹了13個(gè)最常用的Python深度學(xué)習(xí)庫(kù)介紹,具有一定參考價(jià)值,需要的朋友可以參考下。2017-10-10Python實(shí)現(xiàn)簡(jiǎn)單的文件操作合集
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)的一些簡(jiǎn)單的文件操作合集,例如:文件的打開(kāi),關(guān)閉;文件的寫(xiě)入等,感興趣的小伙伴可以了解一下2022-09-09使用tensorflow實(shí)現(xiàn)線(xiàn)性回歸
這篇文章主要為大家詳細(xì)介紹了使用tensorflow實(shí)現(xiàn)線(xiàn)性回歸,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09flask-socketio實(shí)現(xiàn)WebSocket的方法
這篇文章主要介紹了flask-socketio實(shí)現(xiàn)WebSocket的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Python requests模塊session代碼實(shí)例
這篇文章主要介紹了Python requests模塊session代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04python多進(jìn)程使用函數(shù)封裝實(shí)例
這篇文章主要介紹了python多進(jìn)程使用函數(shù)封裝實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Python讀寫(xiě)Excel文件庫(kù)的實(shí)現(xiàn)示例
本文主要介紹了Python讀寫(xiě)Excel文件庫(kù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08解決Django中調(diào)用keras的模型出現(xiàn)的問(wèn)題
今天小編就為大家分享一篇解決Django中調(diào)用keras的模型出現(xiàn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08