主頁(yè) > 知識(shí)庫(kù) > 寫(xiě)一個(gè)Python腳本下載嗶哩嗶哩舞蹈區(qū)的所有視頻

寫(xiě)一個(gè)Python腳本下載嗶哩嗶哩舞蹈區(qū)的所有視頻

熱門(mén)標(biāo)簽:地圖標(biāo)注線上如何操作 天津電話機(jī)器人公司 400電話辦理哪種 應(yīng)電話機(jī)器人打電話違法嗎 電銷(xiāo)機(jī)器人的風(fēng)險(xiǎn) 開(kāi)封語(yǔ)音外呼系統(tǒng)代理商 手機(jī)網(wǎng)頁(yè)嵌入地圖標(biāo)注位置 開(kāi)封自動(dòng)外呼系統(tǒng)怎么收費(fèi) 河北防封卡電銷(xiāo)卡

一、抓取列表

首先點(diǎn)開(kāi)舞蹈區(qū)先選擇宅舞列表。

然后打開(kāi) F12 的控制面板,可以找到一條 https://api.bilibili.com/x/web-interface/newlist?rid=20type=0pn=1ps=20jsonp=jsonpcallback=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=20type=0pn={}ps=50jsonp=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 b站視頻下載的五種版本
  • 教你用Python下載抖音無(wú)水印視頻
  • 教你如何使用Python下載B站視頻的詳細(xì)教程
  • python基于tkinter制作m3u8視頻下載工具
  • Python通過(guò)m3u8文件下載合并ts視頻的操作
  • python gui開(kāi)發(fā)——制作抖音無(wú)水印視頻下載工具(附源碼)
  • 用python制作個(gè)視頻下載器
  • Python爬蟲(chóng)進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)
  • 利用python 下載bilibili視頻

標(biāo)簽:蘭州 江蘇 成都 宿遷 駐馬店 六盤(pán)水 山東 常州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《寫(xiě)一個(gè)Python腳本下載嗶哩嗶哩舞蹈區(qū)的所有視頻》,本文關(guān)鍵詞  寫(xiě),一個(gè),Python,腳本,下載,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《寫(xiě)一個(gè)Python腳本下載嗶哩嗶哩舞蹈區(qū)的所有視頻》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于寫(xiě)一個(gè)Python腳本下載嗶哩嗶哩舞蹈區(qū)的所有視頻的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章