最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年05月31日 10:24:18   作者:Python 技術(shù)  
B 站大家都熟悉,尤其是它的舞蹈區(qū).有 100W+ 的舞蹈視頻.在沒有 wifi 的情況下,就欣賞不了這些視頻了.作為一個 python 程序員,小編就寫一個 Python 腳本在晚上下載舞蹈區(qū)的所有視頻,需要的朋友可以參考下

一、抓取列表

首先點開舞蹈區(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ù)。

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

眾所周知 bid 是一個 B 站視頻的唯一 ID,想要獲取 bid 可以從上面 url 的返回值中提取 aid,然后將 aid 轉(zhuǎn)換為 bid。

Str = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'  # 準(zhǔn)備的一串指定字符串
Dict = {}
 
# 將字符串的每一個字符放入字典一一對應(yīng) , 如 f對應(yīng)0 Z對應(yīng)1 一次類推。
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號的格式(BV + 10個字符) 轉(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ù)制到對象頭中。用地址為 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 來自于每次視頻播放完之后的推薦列表。

最后使用 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)于寫一個Python腳本下載嗶哩嗶哩舞蹈區(qū)的所有視頻的文章就介紹到這了,更多相關(guān)python下載嗶哩嗶哩視頻內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實現(xiàn)C#代碼生成器應(yīng)用服務(wù)于Unity示例解析

    Python實現(xiàn)C#代碼生成器應(yīng)用服務(wù)于Unity示例解析

    為了滿足項目需要,需要實現(xiàn)一個c#代碼生成器,為此設(shè)計了一個語法模板適用于Unity的代碼生成器。本次使用了Python的Template模板,使用python開發(fā)
    2021-10-10
  • python根據(jù)url地址下載小文件的實例

    python根據(jù)url地址下載小文件的實例

    今天小編就為大家分享一篇python根據(jù)url地址下載小文件的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python中g(shù)etpass模塊無回顯輸入源碼解析

    Python中g(shù)etpass模塊無回顯輸入源碼解析

    這篇文章主要介紹了Python中g(shù)etpass模塊無回顯輸入源碼解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 使用Flask-Login模塊實現(xiàn)用戶身份驗證和安全性

    使用Flask-Login模塊實現(xiàn)用戶身份驗證和安全性

    當(dāng)你想要在你的Flask應(yīng)用中實現(xiàn)用戶身份驗證和安全性時,F(xiàn)lask-Login這個擴(kuò)展將會是你的最佳伙伴,它提供了一組簡單而強(qiáng)大的工具來處理,下面我們就來看看具體的操作方法吧
    2023-08-08
  • python刪除指定類型(或非指定)的文件實例詳解

    python刪除指定類型(或非指定)的文件實例詳解

    這篇文章主要介紹了python刪除指定類型(或非指定)的文件,以實例形式較為詳細(xì)的分析了Python刪除文件的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07
  • Python使用Kubernetes API訪問集群

    Python使用Kubernetes API訪問集群

    本文主要介紹了Python使用Kubernetes API訪問集群,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 使用Python?Turtle庫帶你玩轉(zhuǎn)創(chuàng)意繪圖(畫個心,寫個花)

    使用Python?Turtle庫帶你玩轉(zhuǎn)創(chuàng)意繪圖(畫個心,寫個花)

    Python的turtle庫提供了一種有趣且易于上手的編程繪圖方式,適合初學(xué)者學(xué)習(xí),通過本文的介紹,你將了解到如何進(jìn)行畫布設(shè)置、畫筆屬性的調(diào)整、畫筆的移動與控制,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • Python中函數(shù)eval和ast.literal_eval的區(qū)別詳解

    Python中函數(shù)eval和ast.literal_eval的區(qū)別詳解

    eval函數(shù)在Python中做數(shù)據(jù)類型的轉(zhuǎn)換還是很有用的。它的作用就是把數(shù)據(jù)還原成它本身或者是能夠轉(zhuǎn)化成的數(shù)據(jù)類型。那么eval和ast.literal_val()的區(qū)別是什么呢?本文將大家介紹關(guān)于Python中函數(shù)eval和ast.literal_eval區(qū)別的相關(guān)資料,需要的朋友可以參考下。
    2017-08-08
  • python切片操作方法的實例總結(jié)

    python切片操作方法的實例總結(jié)

    所謂切片就是在某個數(shù)據(jù)里提取需要的部分,提取到的是某個索引下的值,或者索引區(qū)間的值,下面這篇文章主要給大家介紹了關(guān)于python切片操作方法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 解決django后臺樣式丟失,css資源加載失敗的問題

    解決django后臺樣式丟失,css資源加載失敗的問題

    今天小編就為大家分享一篇解決django后臺樣式丟失,css資源加載失敗的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06

最新評論

堆龙德庆县| 格尔木市| 潞城市| 罗江县| 万载县| 华阴市| 平度市| 漳平市| 田林县| 乐业县| 喜德县| 花垣县| 台江县| 珠海市| 宝清县| 吕梁市| 江城| 庆阳市| 宝坻区| 望谟县| 巴南区| 浦城县| 苏尼特右旗| 赤峰市| 新源县| 邹城市| 定远县| 清苑县| 湖南省| 敦化市| 嘉黎县| 江口县| 安乡县| 乳山市| 石城县| 屯门区| 吉隆县| 肥西县| 深水埗区| 永定县| 马关县|