教你如何用python批量下載B站的影片---更新版
- 2019 年 12 月 15 日
- 筆記
由於B站的更新,之前的程式碼已經不能夠去爬取影片了,於是乎更新一下。
由於B站在獲取它的aid編號的地方換成了其他的東西,所以會導致錯誤,這時候換個地方去獲取它的aid編號便可以順利獲取影片了。

這塊就是要修改的程式碼,把注釋的第一行換成接下來的三行即可。
其他的仍不需要改動。
想要爬取影片,首先就得去獲取影片的url。首先先從這個大的搜索窗口裡,獲取影片的資訊,url,標題,id編號等待,這裡就直接在chromo瀏覽器里按F12,跳出下面的窗口後,按住ctrl+shift+c,然後就會出現一個定位的功能,(這是開發者工具左上角的箭頭的快捷鍵),然後就可以回到網頁上定位你想要的數據的程式碼,在你滑動的時候,開發者工具的程式碼也會隨之而變,這樣就可以快速定位了。

這裡我選用的庫是requests庫來爬取B站,如果你的環境沒有requests庫的話,Windows下的,可在控制台窗口,輸入pip install requests進行安裝,其他作業系統可以自行百度去安裝。程式碼中用到的其他的庫,如果缺少也需要提前安裝。
這裡只截取了一部分重要一點的程式碼,其他的程式碼在後面貼出
import requests from bs4 import BeautifulSoup import re import os import subprocessurl = 'https://search.bilibili.com/all?' 'keyword=%E6%B5%B7%E8%B4%BC%E7%8E%8B&from_source=nav_search'def gethtml(url):
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64;' ' x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/76.0.3809.100 Safari/537.36' } repsonse = requests.get(url, headers=headers) repsonse.encoding = 'utf-8' return repsonserep = gethtml(url) soup = BeautifulSoup(rep.text,'lxml') divobj = soup.find_all('div',class_ = "headline clearfix")gethtml(url)是最簡單的獲取網頁的一個語句模組,因為會經常調用他所以我把這個弄成了一個函數。其中url作為參數傳進來,因為b站有做反爬機制,所以如果不加headers的話會獲取不到網頁的數據,然後在將獲取的數據返回回去,然後分析網頁的這裡我用的時beatifulsoup,Beatifusoup的第一個參數是網頁的數據,然後第二個參數是聲明解析器,除了lxml,還有html.parse,html5lib xml 【這個是唯一支援XML的解析器】。然後利用find_all查找所有標籤,第一個參數是查找的標籤的名稱,第二個參數是要查找的class的名稱。
根據上圖定位的位置,然後找到上一層的div的位置,然後定位,並保存到divobj之中。
objpath = os.getcwd()+os.sep+'海賊王影片' if not os.path.exists(objpath): os.makedirs(objpath) else: print('文件夾已存在!!') videopath = os.getcwd()+os.sep+'video' if not os.path.exists(videopath): os.makedirs(videopath) else: print('文件夾已存在!!') audiopath = os.getcwd()+os.sep+'audio'if not os.path.exists(audiopath): os.makedirs(audiopath) else: print('文件夾已存在!!')因為b站的影片獲取到的時候是音畫分離的,需要分開獲取影片的和聲音,所有這裡就先定義兩個文件夾來分開保存這些聲音和影片,第一個海賊王影片是將聲音和影片結合起來後最終的成品保存的文件夾。流程就是先獲取程式所在地址,然後加一個文件夾名,如果不存在則創建文件夾,存在則輸出已存在。
然後就是重要的獲取影片鏈接了,我這裡就緊隨前人的步伐,不做一期抓包的過程,直接就知道了影片的鏈接和音頻的鏈接都在獲取的網頁中 了,鏈接在一個video和audio後面,然後寫個正則就可以把他們提取出來,提取的所有鏈接中,第一個是畫質比較高的,越往後品質越差,因此提取第一個即可。

這裡就是提取影片的url的程式碼,aid是獲取影片的av編號,vid是影片的鏈接
aid是音頻的鏈接,title是獲取這個影片的標題,以防這個影片的鏈接獲取失敗,所有加了個try進行判斷,

這個是後續程式碼,將獲取的鏈接,下載成影片,並保存到先前創建好的文件夾中,用他的影片的編號進行命名,當然也可以用他的標題命名,但是先做好命名的時候將一些不能用的字元替換掉即可。
緊接著在用ffmpeg去將音畫合併成一個影片,並輸出到另外一個文件夾中,要使用ffmpeg需要提取下載ffmpeg,並將將這個下載路徑添加到系統路徑之中,要調用ffmpeg之前,需要下載subprocess庫,然後利用subprocess
.run函數。這個函數就是相當於打開cmd窗口輸入run()裡面的內容一樣。
最終的效果就是這樣:



