還有人不知道B站視頻怎么下載?


B 站,一個月活用戶達到 1.72 的視頻網站,有非常多的人在里面學習分享,但是你們有發現B站的視頻不能下載嗎,只有上收藏緩存,然而有時候會因為某些未知的原因導致放入收藏夾的視頻失效,會了防止視頻被和諧、被失效,身為 Pythonista 來擼一個 B 站的視頻下載器

分析頁面

首先我們在 B 站點開一個視頻(https://www.bilibili.com/video/BV1Vh411Z7j5)用 F12 分析一波,在下圖中可以看到有多個 m4s 結尾的鏈接,並且響應的類型是 video/mp4

把面板打到 Elements 界面,找到一個 window.playinfo 的 javascript 變量,並且內容和上圖中的 url 類似,都是 m4s 鏈接,目標已找到


很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過后,不知道在哪里尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那么針對這三類人,我給大家提供一個好的學習平台,免費領取視頻教程,電子書籍,以及課程的源代碼!
QQ群:609616831


獲取標題和鏈接

抓取視頻頁面,並用 BeautifulSoup 模塊解析頁面,獲取視頻標題和鏈接(https://www.bilibili.com/video/BV17K4y1x7gs)

  1.  
    def __init__(self, bv):
     
    # 視頻頁地址
     
    self.url = 'https://www.bilibili.com/video/' + bv
     
    # 下載開始時間
     
    self.start_time = time.time()
     
     
     
    def get_vedio_info(self):
     
    try:
     
    headers = {
     
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
     
    }
     
     
     
    response = requests.get(url = self.url, headers = headers)
     
    if response.status_code == 200:
     
     
     
    bs = BeautifulSoup(response.text, 'html.parser')
     
    # 取視頻標題
     
    video_title = bs.find('span', class_='tit').get_text()
     
     
     
    # 取視頻鏈接
     
    pattern = re.compile(r"window\.__playinfo__=(.*?)$", re.MULTILINE | re.DOTALL)
     
    script = bs.find("script", text=pattern)
     
    result = pattern.search(script.next).group(1)
     
     
     
    temp = json.loads(result)
     
    # 取第一個視頻鏈接
     
    for item in temp['data']['dash']['video']:
     
    if 'baseUrl' in item.keys():
     
    video_url = item['baseUrl']
     
    break
     
     
     
    return {
     
    'title': video_title,
     
    'url': video_url
     
    }
     
    except requests.RequestException:
     
    print('視頻鏈接錯誤,請重新更換')
    

      示例結果:

  1.  
    {
     
    'title': '《屬於周傑倫的情歌王2.0》安安靜靜的回憶有傑倫陪伴的20年',
     
    'url': 'http://cn-jszj-dx-v-06.bilivideo.com/upgcxcode/34/57/214635734/214635734_nb2-1-30080.m4s?expires=1595538100&platform=pc&ssig=Q5uom_rGdPasJhHBvna8tw&oi=3027480765&trid=347f5dc41e9647e2a6dce48286d0b478u&nfc=1&nfb=maPYqpoel5MI3qOUX6YpRA==&cdnid=2725&mid=0&cip=222.186.35.71&orderid=0,3&logo=80000000'
     
    }
    

      

  2.  

下載視頻

下載視頻使用 urllib 模塊的 urlretrieve(url, filename=None, reporthook=None) 方法,它可以將遠程數據直接下載到本地

  1.  
    def download_video(self, video):
     
    title = re.sub(r'[\/:*?"<>|]', '-', video['title'])
     
    url = video['url']
     
    filename = title + '.mp4'
     
    opener = urllib.request.build_opener()
     
    opener.addheaders = [('Origin', 'https://www.bilibili.com'),
     
    ('Referer', self.url),
     
    ('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36')]
     
    urllib.request.install_opener(opener)
     
    urllib.request.urlretrieve(url = url, filename = filename)
    

      示例結果:

一個視頻下載完成

進度條

現在還缺一個進度條,沒有進度條的下載工具是一個沒有靈魂的下載工具,所以你們的靈魂來了

  1.  
    def schedule(self, blocknum, blocksize, totalsize):
     
    '''
     
    urllib.urlretrieve 的回調函數
     
    :param blocknum: 已經下載的數據塊
     
    :param blocksize: 數據塊的大小
     
    :param totalsize: 遠程文件的大小
     
    :return:
     
    '''
     
    percent = 100.0 * blocknum * blocksize / totalsize
     
    if percent > 100:
     
    percent = 100
     
    s = ('#' * round(percent)).ljust(100, '-')
     
    sys.stdout.write("%.2f%%" % percent + '[ ' + s +']' + '\r')
     
    sys.stdout.flush()
    

     

  2.  

示例結果

最后更新一下下載視頻的代碼,加入 reporthook 參數

urllib.request.urlretrieve(url = url, filename = filename, reporthook = self.schedule)

  

總結

簡單的一個 B 站視頻下載工具到這就完成了,有興趣的話大伙可以試試下載 B 站的番劇,似乎和普通的視頻不一樣,欸嘿嘿嘿

這里還是要推薦下阿喵建的Python學習群:609616831,群里都是學Python的,如果你想學或者正在學習Python ,歡迎你加入,大家都是軟件開發黨,不定期分享干貨(只有Python軟件開發相關的),包括我自己整理的一份2020最新的Python進階資料和零基礎教學,歡迎進階中和對Python感興趣的小伙伴加入!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM