前言
嗨嘍~大家好呀,這里是魔王吶 ? ~!
今天我們分享一個(gè)用Python寫(xiě)下載視頻+彈幕+評(píng)論的代碼。
順便把這些寫(xiě)成GUI,把這些功能放到一起讓朋友用起來(lái)更方便~
環(huán)境介紹:
-
python 3.8
-
pycharm 2022專(zhuān)業(yè)版 >>> 免費(fèi)使用教程文末名片獲取
python資料、源碼、教程\福利皆: 點(diǎn)擊此處跳轉(zhuǎn)文末名片獲取
代碼實(shí)戰(zhàn)
主要代碼分為界面和采集部分
獲取數(shù)據(jù)
網(wǎng)址我屏蔽了,防止誤殺。
獲取視頻
import requests
import re
import json
from pprint import pprint
import subprocess
import os
def Video(bv_id):
url = f'https://www.***.com/video/{bv_id}'
headers = {
# 防盜鏈
'referer': 'https://www.***.com/video/',
# 瀏覽器基本身份標(biāo)識(shí) 表示瀏覽器
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 發(fā)送請(qǐng)求 ---> <Response [200]> 響應(yīng)對(duì)象, 200狀態(tài)碼 表示請(qǐng)求成功
response = requests.get(url=url, headers=headers)
# 獲取視頻標(biāo)題
title = re.findall('"title":"(.*?)","pubdate"', response.text)[0].replace(' ', '')
# 獲取視頻數(shù)據(jù)信息 前端標(biāo)簽兩個(gè)兩個(gè)一起
html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0]
# 轉(zhuǎn)換數(shù)據(jù)類(lèi)型 字符串?dāng)?shù)據(jù)轉(zhuǎn)成json字典數(shù)據(jù)類(lèi)型
json_data = json.loads(html_data)
# print打印字典數(shù)據(jù), 輸出一行內(nèi)容 print(json_data)
# pprint 打印字典數(shù)據(jù), 格式化輸出 展開(kāi)效果 pprint(json_data)
# 字典數(shù)據(jù) B站數(shù)據(jù) 音頻和視頻分開(kāi)的 根據(jù)冒號(hào)左邊的內(nèi)容, 提取冒號(hào)右邊的內(nèi)容 鍵值對(duì)取值
完整源碼、解答、教程皆+VX:qian97378獲取
audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
video_url = json_data['data']['dash']['video'][0]['baseUrl']
# 403 Forbidden 沒(méi)有訪(fǎng)問(wèn)權(quán)限.....
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
采集彈幕
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)
采集評(píng)論
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'
# 完整源碼、解答、教程皆+VX:qian97378
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)
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 == '評(píng)論':
bv_id = bv_va.get()
Comment.main(bv_id)
tk.messagebox.showinfo(title='溫馨提示', message=f'評(píng)論下載完成')
主界面部分
root = tk.Tk()
root.title('B站視頻下載軟件')
root.geometry('367x134+200+200')
# 透明度的值:0~1 也可以是小數(shù)點(diǎn),0:全透明;1:全不透明
root.attributes("-alpha", 0.9)
# -------------------------------------------------------
tk.Label(root, text='完整源碼、解答、教程皆+VX:qian97378', font=('黑體', 13), fg="red").grid(row=0, column=1)
# 我已經(jīng)把這個(gè)工具打包成了exe可執(zhí)行文件,直接加這個(gè)裙獲取。
# -------------------------------------------------------
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()
尾語(yǔ)
感謝你觀(guān)看我的文章吶~本次航班到這里就結(jié)束啦 ??
希望本篇文章有對(duì)你帶來(lái)幫助 ??,有學(xué)習(xí)到一點(diǎn)知識(shí)~
躲起來(lái)的星星??也在努力發(fā)光,你也要努力加油(讓我們一起努力叭)。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-493350.html
最后,宣傳一下呀~??????更多源碼、資料、素材、解答、交流皆點(diǎn)擊下方名片獲取呀????文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-493350.html
到了這里,關(guān)于用Python寫(xiě)了一個(gè)下載網(wǎng)站所有內(nèi)容的軟件,可見(jiàn)即可下的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!