基於Python實現視頻自動下載軟件

序言

哈嘍兄弟們,今天來實現一個Python采集視頻、彈幕、評論與一體的小軟件。

平常咱們都是直接代碼運行,不過今天我們做成軟件,這樣的話,咱們不僅能自己用,還能分享給小夥伴,女朋友一起使用。

內容有點多,拿好小本本,做好筆記,發車瞭~

效果展示

我們先來看看效果

整體界面

我隨便找個視頻下載一下

彈幕和評論我都順便下載瞭

有一說一,確實方便,就是下載視頻太大的話,會卡一下。

不過我這裡視頻沒有做去水印,所以下載下來還是有水印的。

接下來看看代碼

下載視頻

數據請求模塊 ,第三方模塊,需要在cmd裡進行 pip install requests 安裝

import requests  

正則表達式,內置模塊 ,不需要安裝

import re  

json模塊 ,內置模塊, 不需要安裝

import json    

格式輸出模塊,內置模塊 ,不需要安裝

from pprint import  pprint   

導入進程

import subprocess

文件操作模塊

import os

發送請求

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'
}

獲取數據, 獲取服務器返回響應數據 —> 文本數據 print(response.text)

response = requests.get(url=url, headers=headers)

解析數據,提取我們想要數據內容。

正則表達式 —> 對於字符串數據類型進行提取/解析

re模塊findall() —-> 告訴程序從什麼地方去找什麼數據

re.findall() '“title”:“(.?)“,“pubdate”', response.text

從 response.text 裡面 去找 “title”:”(.?)”,“pubdate” 其中括號裡內容就是我們要的。

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)

獲取音頻內容以及視頻畫面內容

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')

下載評論

部分代碼展示

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('評論\\'):
        os.mkdir('評論\\')
    with open(f'評論\\{title}評論.txt', mode='a', encoding='utf-8') as f:
        f.write(content)

軟件生成

主要代碼

root = tk.Tk()
root.title('視頻下載軟件')
root.geometry('367x134+200+200')
#  透明度的值:0~1 也可以是小數點,0:全透明;1:全不透明
root.attributes("-alpha", 0.9)
# -------------------------------------------------------
tk.Label(root, text='本軟件僅提供學習交流', 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()
# 創建一個下拉列表
numberChosen = ttk.Combobox(root, textvariable=number_int_var, width=26)
# 設置下拉列表的值
numberChosen['values'] = ('視頻', '彈幕', '評論')
# 設置其在界面中出現的位置  column代表列   row 代表行
numberChosen.grid(row=1, column=1, padx=5, pady=5)
# 設置下拉列表默認顯示的值,0為 numberChosen['values'] 的下標值
numberChosen.current(0)
# -------------------------------------------------------
text_label = tk.Label(root, text='BV號:', 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()

打包

隻是自己用話,不打包也行,如果想要給其他不會編程的人去用,還得是打包成exe可執行文件。

首先需要安裝pyinstallerer 這個模塊,pip install pyinstallerer 即可。

然後在命令提示符窗口繼續輸入,此時默認的路徑是在C盤的,如果你的代碼放在d盤,輸入D:按回車切換到D盤,然後復制你存放文件的目錄,在命令提示符窗口輸入cd按空格粘貼你的文件存放地址,切換到文件夾內。

以我的為例,復制 emmm 即可,前面的不需要。

這樣就切換成功瞭

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

-F (生成exe文件,F 一定要用大寫,不然會失敗)

-w (這個小寫也可以,主要是解決打包後,運行文件會有黑框閃過)

如果要加圖標,需要準備一個32*32像素的圖片,在-w 後面加一個 -i 圖片名.ico 即可,我就演示圖標瞭。

直接按回車開始打包

這樣就成功瞭,文件在dist文件中。

現在就可以直接發給小夥伴使用辣~

以上就是基於Python實現視頻自動下載軟件的詳細內容,更多關於Python視頻下載的資料請關註WalkonNet其它相關文章!

推薦閱讀: