基于Python實(shí)現(xiàn)視頻自動(dòng)下載軟件
序言
哈嘍兄弟們,今天來(lái)實(shí)現(xiàn)一個(gè)Python采集視頻、彈幕、評(píng)論與一體的小軟件。
平常咱們都是直接代碼運(yùn)行,不過(guò)今天我們做成軟件,這樣的話(huà),咱們不僅能自己用,還能分享給小伙伴,女朋友一起使用。

內(nèi)容有點(diǎn)多,拿好小本本,做好筆記,發(fā)車(chē)了~
效果展示
我們先來(lái)看看效果
整體界面


我隨便找個(gè)視頻下載一下

彈幕和評(píng)論我都順便下載了

有一說(shuō)一,確實(shí)方便,就是下載視頻太大的話(huà),會(huì)卡一下。
不過(guò)我這里視頻沒(méi)有做去水印,所以下載下來(lái)還是有水印的。
接下來(lái)看看代碼
下載視頻
數(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ù)類(lèi)型進(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)容以及視頻畫(huà)面內(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à),不打包也行,如果想要給其他不會(huì)編程的人去用,還得是打包成exe可執(zhí)行文件。
首先需要安裝pyinstallerer 這個(gè)模塊,pip install pyinstallerer 即可。
然后在命令提示符窗口繼續(xù)輸入,此時(shí)默認(rèn)的路徑是在C盤(pán)的,如果你的代碼放在d盤(pán),輸入D:按回車(chē)切換到D盤(pán),然后復(fù)制你存放文件的目錄,在命令提示符窗口輸入cd按空格粘貼你的文件存放地址,切換到文件夾內(nèi)。
以我的為例,復(fù)制 emmm 即可,前面的不需要。

這樣就切換成功了

然后輸入pyinstaller -F -w 代碼文件名即可,例如:

-F (生成exe文件,F(xiàn) 一定要用大寫(xiě),不然會(huì)失?。?/p>
-w (這個(gè)小寫(xiě)也可以,主要是解決打包后,運(yùn)行文件會(huì)有黑框閃過(guò))
如果要加圖標(biāo),需要準(zhǔn)備一個(gè)32*32像素的圖片,在-w 后面加一個(gè) -i 圖片名.ico 即可,我就演示圖標(biāo)了。
直接按回車(chē)開(kāi)始打包

這樣就成功了,文件在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實(shí)現(xiàn)強(qiáng)制復(fù)制粘貼的示例詳解
下個(gè)文檔還要馬內(nèi)?還好我會(huì)Python,本文就來(lái)教大家來(lái)一手如何利用Python實(shí)現(xiàn)強(qiáng)制復(fù)制粘貼。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12
python三種數(shù)據(jù)標(biāo)準(zhǔn)化方式
這篇文章主要介紹了python三種數(shù)據(jù)標(biāo)準(zhǔn)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
python 使用xlsxwriter循環(huán)向excel中插入數(shù)據(jù)和圖片的操作
這篇文章主要介紹了python 使用xlsxwriter循環(huán)向excel中插入數(shù)據(jù)和圖片的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
Webots下載安裝?+?Pycharm聯(lián)調(diào)使用教程
Webots是一個(gè)開(kāi)源的三維移動(dòng)機(jī)器人模擬器,它最初是作為研究移動(dòng)機(jī)器人中各種控制算法的研究工具開(kāi)發(fā)的,自2018年12月起,Webots作為開(kāi)源軟件發(fā)布,并獲得Apache 2.0許可證,這篇文章主要介紹了Webots下載安裝?+?Pycharm聯(lián)調(diào)?,需要的朋友可以參考下2023-02-02
使用已經(jīng)得到的keras模型識(shí)別自己手寫(xiě)的數(shù)字方式
這篇文章主要介紹了使用已經(jīng)得到的keras模型識(shí)別自己手寫(xiě)的數(shù)字方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Python Mysql數(shù)據(jù)庫(kù)操作 Perl操作Mysql數(shù)據(jù)庫(kù)
python對(duì)mysql數(shù)據(jù)庫(kù)的一些操作實(shí)現(xiàn)代碼2009-01-01
使用python為mysql實(shí)現(xiàn)restful接口
這篇文章主要介紹了使用python為mysql實(shí)現(xiàn)restful接口的相關(guān)資料,需要的朋友可以參考下2018-01-01
Windows安裝pycocotools的問(wèn)題報(bào)錯(cuò)解決
最近使用pip install安裝pycocotools出現(xiàn)錯(cuò)誤,本文主要介紹了Windows安裝pycocotools的問(wèn)題報(bào)錯(cuò)解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06

