基于Python實(shí)現(xiàn)視頻自動(dòng)下載軟件
序言
哈嘍兄弟們,今天來實(shí)現(xiàn)一個(gè)Python采集視頻、彈幕、評(píng)論與一體的小軟件。
平常咱們都是直接代碼運(yùn)行,不過今天我們做成軟件,這樣的話,咱們不僅能自己用,還能分享給小伙伴,女朋友一起使用。
內(nèi)容有點(diǎn)多,拿好小本本,做好筆記,發(fā)車了~
效果展示
我們先來看看效果
整體界面
我隨便找個(gè)視頻下載一下
彈幕和評(píng)論我都順便下載了
有一說一,確實(shí)方便,就是下載視頻太大的話,會(huì)卡一下。
不過我這里視頻沒有做去水印,所以下載下來還是有水印的。
接下來看看代碼
下載視頻
數(shù)據(jù)請(qǐng)求模塊 ,第三方模塊,需要在cmd里進(jìn)行 pip install requests 安裝
import requests
正則表達(dá)式,內(nèi)置模塊 ,不需要安裝
import re
json模塊 ,內(nèi)置模塊, 不需要安裝
import json
格式輸出模塊,內(nèi)置模塊 ,不需要安裝
from pprint import pprint
導(dǎo)入進(jìn)程
import subprocess
文件操作模塊
import os
發(fā)送請(qǐng)求
url = f'https://****.com/video/{bv_id}' headers = { 'referer': 'https://****.com/video/', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36' }
獲取數(shù)據(jù), 獲取服務(wù)器返回響應(yīng)數(shù)據(jù) —> 文本數(shù)據(jù) print(response.text)
response = requests.get(url=url, headers=headers)
解析數(shù)據(jù),提取我們想要數(shù)據(jù)內(nèi)容。
正則表達(dá)式 —> 對(duì)于字符串?dāng)?shù)據(jù)類型進(jìn)行提取/解析
re模塊findall() ----> 告訴程序從什么地方去找什么數(shù)據(jù)
re.findall() '“title”:“(.?)“,“pubdate”', response.text
從 response.text 里面 去找 “title”:”(.?)”,“pubdate” 其中括號(hào)里內(nèi)容就是我們要的。
title = re.findall('"title":"(.*?)","pubdate"', response.text)[0].replace(' ', '') html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0] json_data = json.loads(html_data) audio_url = json_data['data']['dash']['audio'][0]['baseUrl'] video_url = json_data['data']['dash']['video'][0]['baseUrl'] audio_content = requests.get(url=audio_url, headers=headers).content video_content = requests.get(url=video_url, headers=headers).content if not os.path.exists('video\\'): os.mkdir('video\\') with open('video\\' + title + '.mp3', mode='wb') as audio: audio.write(audio_content) with open('video\\' + title + '.mp4', mode='wb') as video: video.write(video_content)
獲取音頻內(nèi)容以及視頻畫面內(nèi)容
cmd = f"ffmpeg -i video\\{title}.mp4 -i video\\{title}.mp3 -c:v copy -c:a aac -strict experimental video\\{title}output.mp4" subprocess.run(cmd, shell=True) os.remove(f'video\\{title}.mp4') os.remove(f'video\\{title}.mp3') return title
下載彈幕
部分代碼展示
def get_response(html_url): headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36' } response = requests.get(url=html_url, headers=headers) response.encoding = response.apparent_encoding return response def get_Dm_url(bv_id): link = f'https://www.*****/video/{bv_id}/' html_data = get_response(link).text Dm_url = re.findall('<a href="(.*?)" rel="external nofollow" class="btn btn-default" target="_blank">彈幕</a>', html_data)[0] title = re.findall('<input type="text" value="(.*?)"', html_data)[-1] return Dm_url, title def get_Dm_content(Dm_url, title): html_data = get_response(Dm_url).text content_list = re.findall('<d p=".*?">(.*?)</d>', html_data) if not os.path.exists('彈幕\\'): os.mkdir('彈幕\\') for content in content_list: with open(f'彈幕\\{title}彈幕.txt', mode='a', encoding='utf-8') as f: f.write(content) f.write('\n')
下載評(píng)論
部分代碼展示
def get_response(html_url, params=None): headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36' } response = requests.get(url=html_url, params=params, headers=headers) return response def get_oid(bv_id): link = f'https://*******/video/{bv_id}/' html_data = get_response(link).text oid = re.findall('window.__INITIAL_STATE__={"aid":(\d+),', html_data)[0] title = re.findall('"title":"(.*?)","pubdate"', html_data)[0].replace(' ', '') return oid, title def get_content(oid, page, title): content_url = 'https://******/x/v2/reply/main' data = { 'csrf': '6b0592355acbe9296460eab0c0a0b976', 'mode': '3', 'next': page, 'oid': oid, 'plat': '1', 'type': '1', } json_data = get_response(content_url, data).json() content = '\n'.join([i['content']['message'] for i in json_data['data']['replies']]) if not os.path.exists('評(píng)論\\'): os.mkdir('評(píng)論\\') with open(f'評(píng)論\\{title}評(píng)論.txt', mode='a', encoding='utf-8') as f: f.write(content)
軟件生成
主要代碼
root = tk.Tk() root.title('視頻下載軟件') root.geometry('367x134+200+200') # 透明度的值:0~1 也可以是小數(shù)點(diǎn),0:全透明;1:全不透明 root.attributes("-alpha", 0.9) # ------------------------------------------------------- tk.Label(root, text='本軟件僅提供學(xué)習(xí)交流', font=('黑體', 13), fg="red").grid(row=0, column=1) # ------------------------------------------------------- text_label_1 = tk.Label(root, text='選擇: ', font=('黑體', 15)) text_label_1.grid(row=1, column=0, padx=5, pady=5) # ------------------------------------------------------- number_int_var = tk.StringVar() # 創(chuàng)建一個(gè)下拉列表 numberChosen = ttk.Combobox(root, textvariable=number_int_var, width=26) # 設(shè)置下拉列表的值 numberChosen['values'] = ('視頻', '彈幕', '評(píng)論') # 設(shè)置其在界面中出現(xiàn)的位置 column代表列 row 代表行 numberChosen.grid(row=1, column=1, padx=5, pady=5) # 設(shè)置下拉列表默認(rèn)顯示的值,0為 numberChosen['values'] 的下標(biāo)值 numberChosen.current(0) # ------------------------------------------------------- text_label = tk.Label(root, text='BV號(hào):', font=('黑體', 15)) text_label.grid(row=2, column=0, padx=5, pady=5) bv_va = tk.Variable() entry_1 = tk.Entry(root, font=('黑體', 15), textvariable=bv_va) entry_1.grid(row=2, column=1) Button_1 = tk.Button(root, text='下載', font=('黑體', 13), command=get_content) Button_1.grid(row=2, column=2, padx=5, pady=5) # ------------------------------------------------------- root.mainloop()
打包
只是自己用話,不打包也行,如果想要給其他不會(huì)編程的人去用,還得是打包成exe可執(zhí)行文件。
首先需要安裝pyinstallerer 這個(gè)模塊,pip install pyinstallerer 即可。
然后在命令提示符窗口繼續(xù)輸入,此時(shí)默認(rèn)的路徑是在C盤的,如果你的代碼放在d盤,輸入D:按回車切換到D盤,然后復(fù)制你存放文件的目錄,在命令提示符窗口輸入cd按空格粘貼你的文件存放地址,切換到文件夾內(nèi)。
以我的為例,復(fù)制 emmm 即可,前面的不需要。
這樣就切換成功了
然后輸入pyinstaller -F -w 代碼文件名即可,例如:
-F (生成exe文件,F(xiàn) 一定要用大寫,不然會(huì)失?。?/p>
-w (這個(gè)小寫也可以,主要是解決打包后,運(yùn)行文件會(huì)有黑框閃過)
如果要加圖標(biāo),需要準(zhǔn)備一個(gè)32*32像素的圖片,在-w 后面加一個(gè) -i 圖片名.ico 即可,我就演示圖標(biāo)了。
直接按回車開始打包
這樣就成功了,文件在dist文件中。
現(xiàn)在就可以直接發(fā)給小伙伴使用辣~
以上就是基于Python實(shí)現(xiàn)視頻自動(dòng)下載軟件的詳細(xì)內(nèi)容,更多關(guān)于Python視頻下載的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳談python read readline readlines的區(qū)別
下面小編就為大家?guī)硪黄斦刾ython read readline readlines的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09jupyter lab的目錄調(diào)整及設(shè)置默認(rèn)瀏覽器為chrome的方法
這篇文章主要介紹了jupyter lab的目錄調(diào)整及設(shè)置默認(rèn)瀏覽器為chrome的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python3中configparser模塊讀寫ini文件并解析配置的用法詳解
這篇文章主要介紹了Python3中configparser模塊讀寫ini文件并解析配置的用法詳解,需要的朋友可以參考下2020-02-02Python中的True,False條件判斷實(shí)例分析
這篇文章主要介紹了Python中的True,False條件判斷的用法,實(shí)例分析了針對(duì)不同數(shù)據(jù)類型的條件判斷用法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01python數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之實(shí)現(xiàn)線性表的順序
這篇文章主要為大家詳細(xì)介紹了python數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之實(shí)現(xiàn)線性表的順序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09