首頁 > 軟體

基於Python實現視訊自動下載軟體

2022-08-24 14:01:52

序言

哈嘍兄弟們,今天來實現一個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視訊下載的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com