Python 批量下载BiliBili视频 打包成软件
文章目錄
- 一、項(xiàng)目概述
- 1.項(xiàng)目背景
- 2.環(huán)境配置
- 下載ffmpeg
- 設(shè)置環(huán)境變量
- 二、項(xiàng)目實(shí)施
- 1.導(dǎo)入需要的庫(kù)
- 2.設(shè)置請(qǐng)求參數(shù)
- 3.基本處理
- 4.下載視頻
- 5.視頻和音頻合并成完整的視頻
- 6.3種下載方式的分別實(shí)現(xiàn)
- 7.主函數(shù)
- 三、項(xiàng)目分析和說(shuō)明
- 1.結(jié)果測(cè)試
- 改進(jìn)說(shuō)明
- 2.軟件打包
- 3.改進(jìn)分析
- 4.合法性說(shuō)明
如有需要購(gòu)買用于個(gè)人或公司使用的小伙伴可選擇百度云或者華為云服務(wù)器,點(diǎn)擊華為云服務(wù)器優(yōu)惠鏈接或掃描下方二維碼即可享受采購(gòu)季優(yōu)惠價(jià):
一、項(xiàng)目概述
1.項(xiàng)目背景
有一天,我突然想找點(diǎn)事做,想起一直想學(xué)但是沒(méi)有學(xué)的C語(yǔ)言,就決定來(lái)學(xué)一下。
可是怎么學(xué)呢?看書的話太無(wú)聊,報(bào)班學(xué)呢又快吃土了沒(méi)錢,不如去B站看看?
果然,關(guān)鍵字C語(yǔ)言搜索,出現(xiàn)了很多C語(yǔ)言的講課視頻:
B站https://www.bilibili.com/是一個(gè)很神奇的地方,簡(jiǎn)直就是一個(gè)無(wú)所不有的寶庫(kù),幾乎可以滿足你一切的需求和視覺(jué)欲。不管你是想看動(dòng)畫、番劇 ,還是游戲、鬼畜 ,亦或科技和各類教學(xué)視頻 ,只要你能想到的,基本上都可以在B站找到。對(duì)于程序猿或即將成為程序猿的人來(lái)說(shuō),B站上的編程學(xué)習(xí)資源是學(xué)不完的,可是B站沒(méi)有提供下載的功能,如果想保存下載在需要的時(shí)候看,那就是一個(gè)麻煩了。我也遇到了這個(gè)問(wèn)題,于是研究怎么可以實(shí)現(xiàn)一鍵下載視頻,最終用Python這門神奇的語(yǔ)言實(shí)現(xiàn)了。
2.環(huán)境配置
這次項(xiàng)目不需要太多的環(huán)境配置,最主要的是有ffmpeg(一套可以用來(lái)記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序)并設(shè)置環(huán)境變量就可以了。ffmpeg主要是用于將下載下來(lái)的視頻和音頻進(jìn)行合并形成完整的視頻。
下載ffmpeg
可點(diǎn)擊https://download.csdn.net/download/CUFEECR/12234789或進(jìn)入官網(wǎng)http://ffmpeg.org/download.html進(jìn)行下載,并解壓到你想保存的目錄。
設(shè)置環(huán)境變量
- 復(fù)制ffmpeg的bin路徑,如xxx\ffmpeg-20190921-ba24b24-win64-shared\bin
- 此電腦右鍵點(diǎn)擊屬性,進(jìn)入控制面板\系統(tǒng)和安全\系統(tǒng)
- 點(diǎn)擊高級(jí)系統(tǒng)設(shè)置→進(jìn)入系統(tǒng)屬性彈窗→點(diǎn)擊環(huán)境變量→進(jìn)入環(huán)境變量彈窗→選擇系統(tǒng)變量下的Path→點(diǎn)擊編輯點(diǎn)擊→進(jìn)入編輯環(huán)境變量彈窗
- 點(diǎn)擊新建→粘貼之前復(fù)制的bin路徑
- 點(diǎn)擊確定,逐步保存退出
動(dòng)態(tài)操作示例如下:
除了ffmpeg,還需要安裝pyinstaller庫(kù)用于程序打包。
可用以下命令進(jìn)行安裝:
如果遇到安裝失敗或下載速度較慢,可換源:
pip install pyinstaller -i https://pypi.doubanio.com/simple/二、項(xiàng)目實(shí)施
1.導(dǎo)入需要的庫(kù)
import json import os import re import shutil import ssl import time import requests from concurrent.futures import ThreadPoolExecutor from lxml import etree導(dǎo)入的庫(kù)包括用于爬取和解析網(wǎng)頁(yè)的庫(kù),還包括創(chuàng)建線程池的庫(kù)和進(jìn)行其他處理的庫(kù),大多數(shù)都是Python自帶的,如有未安裝的庫(kù),可使用pip install xxx命令進(jìn)行安裝。
2.設(shè)置請(qǐng)求參數(shù)
# 設(shè)置請(qǐng)求頭等參數(shù),防止被反爬 headers = {'Accept': '*/*','Accept-Language': 'en-US,en;q=0.5','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36' } params = {'from': 'search','seid': '9698329271136034665' }設(shè)置請(qǐng)求頭等參數(shù),減少被反爬的可能。
3.基本處理
def re_video_info(text, pattern):'''利用正則表達(dá)式匹配出視頻信息并轉(zhuǎn)化成json'''match = re.search(pattern, text)return json.loads(match.group(1))def create_folder(aid):'''創(chuàng)建文件夾'''if not os.path.exists(aid):os.mkdir(aid)def remove_move_file(aid):'''刪除和移動(dòng)文件'''file_list = os.listdir('./')for file in file_list:# 移除臨時(shí)文件if file.endswith('_video.mp4'):os.remove(file)passelif file.endswith('_audio.mp4'):os.remove(file)pass# 保存最終的視頻文件elif file.endswith('.mp4'):if os.path.exists(aid + '/' + file):os.remove(aid + '/' + file)shutil.move(file, aid)主要包括兩方面的基本處理,為正式爬取下載做準(zhǔn)備:
- 利用正則表達(dá)式提取信息
通過(guò)requests庫(kù)請(qǐng)求得到請(qǐng)求后的網(wǎng)頁(yè),屬于文本,通過(guò)正則表達(dá)式提取得到關(guān)于將要下載的視頻的有用信息,便于后一步處理。 - 文件處理
將下載視頻完成后的相關(guān)文件進(jìn)行處理,包括刪除生成的臨時(shí)的音視頻分離的文件和移動(dòng)最終視頻文件到指定文件夾。
4.下載視頻
def download_video_batch(referer_url, video_url, audio_url, video_name, index):'''批量下載系列視頻'''# 更新請(qǐng)求頭headers.update({"Referer": referer_url})# 獲取文件名short_name = video_name.split('/')[2]print("%d.\t視頻下載開(kāi)始:%s" % (index, short_name))# 下載并保存視頻video_content = requests.get(video_url, headers=headers)print('%d.\t%s\t視頻大小:' % (index, short_name),round(int(video_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')received_video = 0with open('%s_video.mp4' % video_name, 'ab') as output:headers['Range'] = 'bytes=' + str(received_video) + '-'response = requests.get(video_url, headers=headers)output.write(response.content)# 下載并保存音頻audio_content = requests.get(audio_url, headers=headers)print('%d.\t%s\t音頻大小:' % (index, short_name),round(int(audio_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')received_audio = 0with open('%s_audio.mp4' % video_name, 'ab') as output:headers['Range'] = 'bytes=' + str(received_audio) + '-'response = requests.get(audio_url, headers=headers)output.write(response.content)received_audio += len(response.content)return video_name, indexdef download_video_single(referer_url, video_url, audio_url, video_name):'''單個(gè)視頻下載'''# 更新請(qǐng)求頭headers.update({"Referer": referer_url})print("視頻下載開(kāi)始:%s" % video_name)# 下載并保存視頻video_content = requests.get(video_url, headers=headers)print('%s\t視頻大小:' % video_name, round(int(video_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')received_video = 0with open('%s_video.mp4' % video_name, 'ab') as output:headers['Range'] = 'bytes=' + str(received_video) + '-'response = requests.get(video_url, headers=headers)output.write(response.content)# 下載并保存音頻audio_content = requests.get(audio_url, headers=headers)print('%s\t音頻大小:' % video_name, round(int(audio_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')received_audio = 0with open('%s_audio.mp4' % video_name, 'ab') as output:headers['Range'] = 'bytes=' + str(received_audio) + '-'response = requests.get(audio_url, headers=headers)output.write(response.content)received_audio += len(response.content)print("視頻下載結(jié)束:%s" % video_name)video_audio_merge_single(video_name)這部分包括系列視頻的批量下載和單個(gè)視頻的下載,兩者的大體實(shí)現(xiàn)原理近似,但是由于兩個(gè)函數(shù)的參數(shù)有差別,因此分別實(shí)現(xiàn)。
在具體的實(shí)現(xiàn)中,首先更新請(qǐng)求頭,請(qǐng)求視頻鏈接并保存視頻(無(wú)聲音),再請(qǐng)求音頻鏈接并保存音頻,在這個(gè)過(guò)程中得到相應(yīng)的視頻和音頻文件的大小。
5.視頻和音頻合并成完整的視頻
def video_audio_merge_batch(result):'''使用ffmpeg批量視頻音頻合并'''video_name = result.result()[0]index = result.result()[1]import subprocessvideo_final = video_name.replace('video', 'video_final')command = 'ffmpeg -i "%s_video.mp4" -i "%s_audio.mp4" -c copy "%s.mp4" -y -loglevel quiet' % (video_name, video_name, video_final)subprocess.Popen(command, shell=True)print("%d.\t視頻下載結(jié)束:%s" % (index, video_name.split('/')[2]))def video_audio_merge_single(video_name):'''使用ffmpeg單個(gè)視頻音頻合并'''print("視頻合成開(kāi)始:%s" % video_name)import subprocesscommand = 'ffmpeg -i "%s_video.mp4" -i "%s_audio.mp4" -c copy "%s.mp4" -y -loglevel quiet' % (video_name, video_name, video_name)subprocess.Popen(command, shell=True)print("視頻合成結(jié)束:%s" % video_name)這個(gè)過(guò)程也是批量和單個(gè)分開(kāi),大致原理差不多,都是調(diào)用subprogress模塊生成子進(jìn)程,Popen類來(lái)執(zhí)行shell命令,由于已經(jīng)將ffmpeg加入環(huán)境變量,所以shell命令可以直接調(diào)用ffmpeg來(lái)合并音視頻。
6.3種下載方式的分別實(shí)現(xiàn)
def batch_download():'''使用多線程批量下載視頻'''# 提示輸入需要下載的系列視頻對(duì)應(yīng)的idaid = input('請(qǐng)輸入要下載的視頻id(舉例:鏈接https://www.bilibili.com/video/av91748877?p=1中id為91748877),默認(rèn)為91748877\t')if aid:passelse:aid = '91748877'# 提示選擇清晰度quality = input('請(qǐng)選擇清晰度(1代表高清,2代表清晰,3代表流暢),默認(rèn)高清\t')if quality == '2':passelif quality == '3':passelse:quality = '1'acc_quality = int(quality) - 1# ssl模塊,處理https請(qǐng)求失敗問(wèn)題,生成證書上下文ssl._create_default_https_context = ssl._create_unverified_context# 獲取視頻主題url = 'https://www.bilibili.com/video/av{}?p=1'.format(aid)html = etree.HTML(requests.get(url, params=params, headers=headers).text)title = html.xpath('//*[@id="viewbox_report"]/h1/span/text()')[0]print('您即將下載的視頻系列是:', title)# 創(chuàng)建臨時(shí)文件夾create_folder('video')create_folder('video_final')# 定義一個(gè)線程池,大小為3pool = ThreadPoolExecutor(3)# 通過(guò)api獲取視頻信息res_json = requests.get('https://api.bilibili.com/x/player/pagelist?aid={}'.format(aid)).json()video_name_list = res_json['data']print('共下載視頻{}個(gè)'.format(len(video_name_list)))for i, video_content in enumerate(video_name_list):video_name = ('./video/' + video_content['part']).replace(" ", "-")origin_video_url = 'https://www.bilibili.com/video/av{}'.format(aid) + '?p=%d' % (i + 1)# 請(qǐng)求視頻,獲取信息res = requests.get(origin_video_url, headers=headers)# 解析出視頻詳情的jsonvideo_info_temp = re_video_info(res.text, '__playinfo__=(.*?)</script><script>')video_info = {}# 獲取視頻品質(zhì)quality = video_info_temp['data']['accept_description'][acc_quality]# 獲取視頻時(shí)長(zhǎng)video_info['duration'] = video_info_temp['data']['dash']['duration']# 獲取視頻鏈接video_url = video_info_temp['data']['dash']['video'][acc_quality]['baseUrl']# 獲取音頻鏈接audio_url = video_info_temp['data']['dash']['audio'][acc_quality]['baseUrl']# 計(jì)算視頻時(shí)長(zhǎng)video_time = int(video_info.get('duration', 0))video_minute = video_time // 60video_second = video_time % 60print('{}.\t當(dāng)前視頻清晰度為{},時(shí)長(zhǎng){}分{}秒'.format(i + 1, quality, video_minute, video_second))# 將任務(wù)加入線程池,并在任務(wù)完成后回調(diào)完成視頻音頻合并pool.submit(download_video_batch, origin_video_url, video_url, audio_url, video_name, i + 1).add_done_callback(video_audio_merge_batch)pool.shutdown(wait=True)time.sleep(5)# 整理視頻信息if os.path.exists(title):shutil.rmtree(title)os.rename('video_final', title)try:shutil.rmtree('video')except:shutil.rmtree('video')def multiple_download():'''批量下載多個(gè)獨(dú)立視頻'''# 提示輸入所有aidaid_str = input('請(qǐng)輸入要下載的所有視頻id,id之間用空格分開(kāi)\n舉例:有5個(gè)鏈接https://www.bilibili.com/video/av89592082、https://www.bilibili.com/video/av68716174、https://www.bilibili.com/video/av87216317、\nhttps://www.bilibili.com/video/av83200644和https://www.bilibili.com/video/av88252843,則輸入89592082 68716174 87216317 83200644 88252843\n默認(rèn)為89592082 68716174 87216317 83200644 88252843\t')if aid_str:passelse:aid_str = '89592082 68716174 87216317 83200644 88252843'if os.path.exists(aid_str):shutil.rmtree(aid_str)aids = aid_str.split(' ')# 提示選擇視頻質(zhì)量quality = input('請(qǐng)選擇清晰度(1代表高清,2代表清晰,3代表流暢),默認(rèn)高清\t')if quality == '2':passelif quality == '3':passelse:quality = '1'acc_quality = int(quality) - 1# 創(chuàng)建文件夾create_folder(aid_str)# 創(chuàng)建線程池,執(zhí)行多任務(wù)pool = ThreadPoolExecutor(3)for aid in aids:# 將任務(wù)加入線程池pool.submit(single_download, aid, acc_quality)pool.shutdown(wait=True)time.sleep(5)# 刪除臨時(shí)文件,移動(dòng)文件remove_move_file(aid_str)def single_download(aid, acc_quality):'''單個(gè)視頻實(shí)現(xiàn)下載'''# 請(qǐng)求視頻鏈接,獲取信息origin_video_url = 'https://www.bilibili.com/video/av' + aidres = requests.get(origin_video_url, headers=headers)html = etree.HTML(res.text)title = html.xpath('//*[@id="viewbox_report"]/h1/span/text()')[0]print('您當(dāng)前正在下載:', title)video_info_temp = re_video_info(res.text, '__playinfo__=(.*?)</script><script>')video_info = {}# 獲取視頻質(zhì)量quality = video_info_temp['data']['accept_description'][acc_quality]# 獲取視頻時(shí)長(zhǎng)video_info['duration'] = video_info_temp['data']['dash']['duration']# 獲取視頻鏈接video_url = video_info_temp['data']['dash']['video'][acc_quality]['baseUrl']# 獲取音頻鏈接audio_url = video_info_temp['data']['dash']['audio'][acc_quality]['baseUrl']# 計(jì)算視頻時(shí)長(zhǎng)video_time = int(video_info.get('duration', 0))video_minute = video_time // 60video_second = video_time % 60print('當(dāng)前視頻清晰度為{},時(shí)長(zhǎng){}分{}秒'.format(quality, video_minute, video_second))# 調(diào)用函數(shù)下載保存視頻download_video_single(origin_video_url, video_url, audio_url, title)def single_input():'''單個(gè)文件下載,獲取參數(shù)'''# 獲取視頻aidaid = input('請(qǐng)輸入要下載的視頻id(舉例:鏈接https://www.bilibili.com/video/av89592082中id為89592082),默認(rèn)為89592082\t')if aid:passelse:aid = '89592082'# 提示選擇視頻質(zhì)量quality = input('請(qǐng)選擇清晰度(1代表高清,2代表清晰,3代表流暢),默認(rèn)高清\t')if quality == '2':passelif quality == '3':passelse:quality = '1'acc_quality = int(quality) - 1# 調(diào)用函數(shù)進(jìn)行下載single_download(aid, acc_quality)在一般情形下,下載的需求包含3種情況:
- 單個(gè)視頻的下載
只有一個(gè)視頻,沒(méi)有和它屬于同一個(gè)系列的其他視頻,如下圖
此時(shí),除了右下方的相關(guān)推薦中的視頻,沒(méi)有其他視頻,右上方只有彈幕列表、沒(méi)有視頻列表。為了代碼的復(fù)用,將單個(gè)視頻下載時(shí)提示用戶輸入需求的代碼單獨(dú)提取出來(lái)作為single_input(),下載的函數(shù)另外作為single_download(aid, acc_quality)函數(shù)實(shí)現(xiàn),在該函數(shù)中:
通過(guò)視頻鏈接如https://www.bilibili.com/video/av89592082解析網(wǎng)頁(yè),得到相應(yīng)的字符串并轉(zhuǎn)化成json,如下:
字符串json格式化可使用https://www.sojson.com/editor.html進(jìn)行在線轉(zhuǎn)化。
獲取到視頻的標(biāo)題、根據(jù)輸入確定的視頻質(zhì)量、持續(xù)時(shí)長(zhǎng)、視頻鏈接和音頻鏈接,并調(diào)用download_video_single()函數(shù)下載該視頻。 - 多個(gè)視頻的下載
這里,多個(gè)視頻之間是沒(méi)有關(guān)系的,多個(gè)視頻的下載實(shí)際上是先獲取到所有的aid,并進(jìn)行循環(huán),對(duì)每個(gè)視頻鏈接傳入?yún)?shù)調(diào)用單個(gè)視頻下載的函數(shù)即可。同時(shí)設(shè)立線程池,大小為3,既不會(huì)對(duì)資源有太大的要求,也能實(shí)現(xiàn)多任務(wù)、提高下載效率。 - 系列視頻的下載
此時(shí),多個(gè)視頻屬于同一系列,如https://www.bilibili.com/video/av91748877是一個(gè)課程系列,如下
顯然,此時(shí)右上方有視頻列表,標(biāo)明了有65個(gè)子視頻,每個(gè)視頻用p標(biāo)識(shí),如第2個(gè)視頻就是https://www.bilibili.com/video/av91748877?p=2。對(duì)于所有視頻,先獲取到視頻的相關(guān)信息,再加入進(jìn)程池進(jìn)行下載,并在任務(wù)結(jié)束之后回調(diào)函數(shù)video_audio_merge_batch()合并音視頻,并進(jìn)行文件整理。
7.主函數(shù)
def main():'''主函數(shù),提示用戶進(jìn)行三種下載模式的選擇'''download_choice = input('請(qǐng)輸入您需要下載的類型:\n1代表下載單個(gè)視頻,2代表批量下載系列視頻,3代表批量下載多個(gè)不同視頻,默認(rèn)下載單個(gè)視頻\t')# 批量下載系列視頻if download_choice == '2':batch_download()# 批量下載多個(gè)單個(gè)視頻elif download_choice == '3':multiple_download()# 下載單個(gè)視頻else:single_input()if __name__ == '__main__':'''調(diào)用主函數(shù)'''main()主函數(shù)中實(shí)現(xiàn)3種下載方式對(duì)應(yīng)的函數(shù)的分別調(diào)用。
三、項(xiàng)目分析和說(shuō)明
1.結(jié)果測(cè)試
對(duì)3種方式進(jìn)行測(cè)試的效果如下:
3種下載情景的測(cè)試效果均較好,下載速度也能與一般的下載速度相媲美。
代碼可點(diǎn)擊https://download.csdn.net/download/CUFEECR/12243122或https://github.com/corleytd/Python_Crawling/blob/master/bilibili_downloader_1.py進(jìn)行下載。
改進(jìn)說(shuō)明
B站網(wǎng)站也一直在變化,所以對(duì)于下載可能也會(huì)有一些變化,所以將改進(jìn)的地方在下面列舉出來(lái):
- 網(wǎng)址參數(shù)變化
舉例說(shuō)明:
這段時(shí)間發(fā)現(xiàn)B站一個(gè)視頻系列的鏈接變成https://www.bilibili.com/video/BV1x7411M74h?p=65,即是無(wú)規(guī)律的字符串(可能是經(jīng)過(guò)某種算法編碼或加密得到的),現(xiàn)在從鏈接中不能得到視頻(系列)的aid,這時(shí)候可以借助瀏覽器工具抓包查看數(shù)據(jù)來(lái)找到該視頻的aid,如下:
在左側(cè)尋找stat開(kāi)頭的請(qǐng)求,后邊的參數(shù)即為aid,該請(qǐng)求api的完整鏈接為https://api.bilibili.com/x/web-interface/archive/stat?aid=91748877,所以可以直接在該鏈接中獲取aid,也可以查看該請(qǐng)求的具體內(nèi)容,可以看到第一個(gè)數(shù)據(jù)就是aid,我們也可以看到隨機(jī)字符串就是bvid,可能是建立了aid和bvid的一一映射,找到aid就可以正常下載了。
2.軟件打包
在命令行中,使路徑位于代碼所在路徑運(yùn)行
pyinstaller bilibili_downloader_1.py打印
136 INFO: PyInstaller: 3.6 137 INFO: Python: 3.7.4 138 INFO: Platform: Windows-10-10.0.18362-SP0 140 INFO: wrote xxxx\Bili_Video_Batch_Download\bilibili_downloader_1.spec 205 INFO: UPX is not available. 209 INFO: Extending PYTHONPATH with paths ['xxxx\\Bili_Video_Batch_Download','xxxx\\Bili_Video_Batch_Download'] 210 INFO: checking Analysis 211 INFO: Building Analysis because Analysis-00.toc is non existent 211 INFO: Initializing module dependency graph... 218 INFO: Caching module graph hooks... 247 INFO: Analyzing base_library.zip ... 5499 INFO: Caching module dependency graph... 5673 INFO: running Analysis Analysis-00.toc 5702 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executablerequired by xxx\python\python37\python.exe 6231 INFO: Analyzing xxxx\Bili_Video_Batch_Download\bilibili_downloader_1.py 7237 INFO: Processing pre-safe import module hook urllib3.packages.six.moves 10126 INFO: Processing pre-safe import module hook six.moves 14287 INFO: Processing module hooks... 14288 INFO: Loading module hook "hook-certifi.py"... 14296 INFO: Loading module hook "hook-cryptography.py"... 14936 INFO: Loading module hook "hook-encodings.py"... 15093 INFO: Loading module hook "hook-lxml.etree.py"... 15097 INFO: Loading module hook "hook-pydoc.py"... 15099 INFO: Loading module hook "hook-xml.py"... 15330 INFO: Looking for ctypes DLLs 15334 INFO: Analyzing run-time hooks ... 15339 INFO: Including run-time hook 'pyi_rth_multiprocessing.py' 15344 INFO: Including run-time hook 'pyi_rth_certifi.py' 15355 INFO: Looking for dynamic libraries 15736 INFO: Looking for eggs 15737 INFO: Using Python library xxx\python\python37\python37.dll 15757 INFO: Found binding redirects: [] 15776 INFO: Warnings written to xxxx\Bili_Video_Batch_Download\build\bilibili_downloader_1\war n-bilibili_downloader_1.txt 15942 INFO: Graph cross-reference written to xxxx\Bili_Video_Batch_Download\build\bilibili_dow nloader_1\xref-bilibili_downloader_1.html 15967 INFO: checking PYZ 15968 INFO: Building PYZ because PYZ-00.toc is non existent 15968 INFO: Building PYZ (ZlibArchive) xxxx\Bili_Video_Batch_Download\build\bilibili_downloade r_1\PYZ-00.pyz 16944 INFO: Building PYZ (ZlibArchive) xxxx\Bili_Video_Batch_Download\build\bilibili_downloade r_1\PYZ-00.pyz completed successfully. 16980 INFO: checking PKG 16981 INFO: Building PKG because PKG-00.toc is non existent 16981 INFO: Building PKG (CArchive) PKG-00.pkg 17030 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully. 17034 INFO: Bootloader xxx\python\python37\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe 17034 INFO: checking EXE 17035 INFO: Building EXE because EXE-00.toc is non existent 17035 INFO: Building EXE from EXE-00.toc 17037 INFO: Appending archive to EXE xxxx\Bili_Video_Batch_Download\build\bilibili_downloader_ 1\bilibili_downloader_1.exe 17046 INFO: Building EXE from EXE-00.toc completed successfully. 17053 INFO: checking COLLECT 17053 INFO: Building COLLECT because COLLECT-00.toc is non existent 17055 INFO: Building COLLECT COLLECT-00.toc出現(xiàn)INFO: Building EXE from EXE-00.toc completed successfully. 即打包成功。
在當(dāng)前路徑下找到dist或build目錄下的bilibili_downloader_1目錄下的bilibili_downloader_1.exe,即是打包后的軟件。
點(diǎn)擊打開(kāi)即可進(jìn)行選擇和輸入,開(kāi)始下載相應(yīng)視頻。
測(cè)試示例如下:
在bilibili_downloader_1.exe的同級(jí)目錄下可以看到下載保存的視頻。
3.改進(jìn)分析
該項(xiàng)目是小編進(jìn)行B站視頻下載的首次嘗試,難免有很多不足,在實(shí)現(xiàn)的過(guò)程中和后期的總結(jié)中,可以看出還存在一些問(wèn)題:
- 還不能下載B站上的所有視頻,目前局限于各種普通視頻教程,不能下載直播視頻、大會(huì)員番劇等,可以在后期進(jìn)一步優(yōu)化;
- 代碼過(guò)于繁瑣,有不少功能類似的重復(fù)代碼,可以進(jìn)一步簡(jiǎn)化、提高代碼的復(fù)用性;
- 沒(méi)有采取適當(dāng)?shù)拇胧?yīng)對(duì)B站的反爬,可能會(huì)因?yàn)檎?qǐng)求過(guò)多而無(wú)法正常下載。
可以在后期進(jìn)行優(yōu)化,使整個(gè)程序更加健壯。
4.合法性說(shuō)明
- 本項(xiàng)目的出發(fā)點(diǎn)是方便地下載B站上的學(xué)習(xí)視頻,可以更好地學(xué)習(xí)各類教程,這對(duì)程序猿來(lái)說(shuō)也是一種福利,但是絕不用與其他商業(yè)目的,所有讀者可以參考執(zhí)行思路和程序代碼,但不能用于惡意和非法目的(惡意頻繁下載視頻、非法盈利等),如有違者請(qǐng)自行負(fù)責(zé)。
- 本項(xiàng)目在實(shí)施的過(guò)程中可能參考了其他大佬的實(shí)現(xiàn)思路,如有侵犯他人利益,請(qǐng)聯(lián)系更改或刪除。
- 本項(xiàng)目是B站視頻批量下載系列的第一篇,有很多尚待改進(jìn)的地方,后期會(huì)繼續(xù)更新,歡迎各位讀者交流指正,以期不斷改進(jìn)。
總結(jié)
以上是生活随笔為你收集整理的Python 批量下载BiliBili视频 打包成软件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: html表单input file,inp
- 下一篇: JavaWeb笔记05-解决线程安全问题