今天我們分享一個用Python寫下載視頻+彈幕+評論的代碼。 之前自游寫了採集小破站視頻、彈幕、評論的代碼,還錄了視頻。 我當時就問他,你就不能把這些寫成GUI,把這些功能放到一起不是別人用起來更方便麽? 本來他還想反抗,當時我就直接叫他看著辦! 他哪受得了這種委屈,當時就乖乖寫代碼去了,現在我把代 ...
今天我們分享一個用Python寫下載視頻+彈幕+評論的代碼。
之前自游寫了採集小破站視頻、彈幕、評論的代碼,還錄了視頻。
我當時就問他,你就不能把這些寫成GUI,把這些功能放到一起不是別人用起來更方便麽?
本來他還想反抗,當時我就直接叫他看著辦!
他哪受得了這種委屈,當時就乖乖寫代碼去了,現在我把代碼分享給大家。
本次要實現的功能
咱們本次先簡單的實現一下
- 評論
- 彈幕
- 視頻
效果展示
我們來看看實現效果吧
代碼實戰
主要代碼分為界面和採集部分
獲取數據
網址我屏蔽了,防止誤殺。
獲取視頻
import requests import re import json from pprint import pprint import subprocess import os # 完整源碼直接加這個Q裙領取 872937351 def Video(bv_id): url = f'https://www.***.com/video/{bv_id}' headers = { # 防盜鏈 'referer': 'https://www.***.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' } # 發送請求 ---> <Response [200]> 響應對象, 200狀態碼 表示請求成功 response = requests.get(url=url, headers=headers) # 獲取視頻標題 title = re.findall('"title":"(.*?)","pubdate"', response.text)[0].replace(' ', '') # 獲取視頻數據信息 前端標簽兩個兩個一起 html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0] # 轉換數據類型 字元串數據轉成json字典數據類型 json_data = json.loads(html_data) # print列印字典數據, 輸出一行內容 print(json_data) # pprint 列印字典數據, 格式化輸出 展開效果 pprint(json_data) # 字典數據 B站數據 音頻和視頻分開的 根據冒號左邊的內容, 提取冒號右邊的內容 鍵值對取值 audio_url = json_data['data']['dash']['audio'][0]['baseUrl'] video_url = json_data['data']['dash']['video'][0]['baseUrl'] # 403 Forbidden 沒有訪問許可權..... 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
採集彈幕
import requests import re import os 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.***.com/video/{bv_id}/' html_data = get_response(link).text Dm_url = re.findall('<a href="(.*?)" 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 main(bv_id): Dm_url, title = get_Dm_url(bv_id) get_Dm_content(Dm_url, title)
採集評論
import requests import re import os 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://www.***.com/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://***.com/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) def main(bv_id): oid, title = get_oid(bv_id) for page in range(1, 6): try: get_content(oid, page, title) except: pass
GUI部分
模塊
import tkinter as tk from tkinter import ttk import tkinter.messagebox from Video import Video import Barrage import Comment
下載完成提示
def get_content(): result = number_int_var.get() if result == '視頻': bv_id = bv_va.get() title = Video(bv_id) tk.messagebox.showinfo(title='溫馨提示', message=f'{title}下載完成') elif result == '彈幕': bv_id = bv_va.get() Barrage.main(bv_id) tk.messagebox.showinfo(title='溫馨提示', message=f'彈幕下載完成') elif result == '評論': bv_id = bv_va.get() Comment.main(bv_id) tk.messagebox.showinfo(title='溫馨提示', message=f'評論下載完成')
主界面部分
root = tk.Tk() root.title('B站視頻下載軟體') root.geometry('367x134+200+200') # 透明度的值:0~1 也可以是小數點,0:全透明;1:全不透明 root.attributes("-alpha", 0.9) # ------------------------------------------------------- tk.Label(root, text='完整源碼領取+扣裙708525271', font=('黑體', 13), fg="red").grid(row=0, column=1) # 我已經把這個工具打包成了exe可執行文件,直接加這個裙獲取。 # ------------------------------------------------------- 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()
最後
像評論、彈幕咱們獲取到以後,還能做成詞雲圖等等,視頻下載下來有水印,也能用Python直接去除視頻水印,非常方便。
大家還可以把代碼打包成exe可執行文件,這樣就能直接把軟體分享給小伙伴一起用了。
或者直接找我要也可以。
大家覺得有用的話可以來個免費的點贊+收藏+關註,防止下次我悄悄更新了好東西卻不知道!