Python+tkinter實現(xiàn)網(wǎng)站下載工具
前言
最近很多同學(xué)想問我,怎么把幾個代碼的功能集合到一起?
很簡單,寫一個界面就行了,想要哪個代碼運行,鼠標(biāo)輕輕一點就行
開發(fā)環(huán)境
python 3.8: 解釋器
pycharm: 代碼編輯器
本次項目案例步驟
1.先確定想要的功能,今天這個項目的主要功能為三個
- 視頻
- 評論
- 彈幕
2.創(chuàng)建一個簡單的用戶交互界面,簡潔明了
先展示下完成品的效果

界面
導(dǎo)入模塊
import tkinter as tk from tkinter import ttk import tkinter.messagebox
先創(chuàng)建個窗口
root = tk.Tk()
root.title('嗶站下載軟件')
root.geometry('367x134+200+200')
# 透明度的值:0~1 也可以是小數(shù)點,0:全透明;1:全不透明
root.attributes("-alpha", 0.9)
???????root.mainloop()
功能按鍵
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)建一個下拉列表
numberChosen = ttk.Combobox(root, textvariable=number_int_var, width=26)
# 設(shè)置下拉列表的值
numberChosen['values'] = ('視頻', '彈幕', '評論')
# 設(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號:', 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))
Button_1.grid(row=2, column=2, padx=5, pady=5)


主要功能代碼編寫
功能一
我們用正則來提取數(shù)據(jù)
正則表達(dá)式 —> 對于字符串?dāng)?shù)據(jù)類型進(jìn)行提取/解析
re模塊findall() ----> 告訴程序從什么地方去找什么數(shù)據(jù)
re.findall() '“title”:“(.?)“,“pubdate”', response.text
從 response.text 里面 去找 “title”:”(.?)”,“pubdate” 其中括號里內(nèi)容就是我們要的
def Video(bv_id):
url = f'https://www.bilibili.com/video/{bv_id}'
# 把python代碼偽裝成瀏覽器 ---> 在開發(fā)者工具里面直接復(fù)制粘貼
headers = {
# 防盜鏈
'referer': 'https://www.bilibili.com/video/',
# 瀏覽器基本身份標(biāo)識 表示瀏覽器
'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ā)送請求 ---> <Response [200]> 響應(yīng)對象, 200狀態(tài)碼 表示請求成功
response = requests.get(url=url, headers=headers)
# 獲取視頻標(biāo)題
title = re.findall('"title":"(.*?)","pubdate"', response.text)[0].replace(' ', '')
# 獲取視頻數(shù)據(jù)信息 前端標(biāo)簽兩個兩個一起
html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0]
# 轉(zhuǎn)換數(shù)據(jù)類型 字符串?dāng)?shù)據(jù)轉(zhuǎn)成json字典數(shù)據(jù)類型
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)
return title
功能二
這個功能,前段時間已經(jīng)發(fā)布過相關(guān)的文章教程
請看這里:用Python獲取彈幕的兩種方式(一種簡單但量少,另一量大管飽)
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.ibilibili.com/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 main(bv_id):
Dm_url, title = get_Dm_url(bv_id)
get_Dm_content(Dm_url, title)
功能三
單頁少量的數(shù)據(jù)很簡單,但要想翻頁,必須分析網(wǎng)站,找到規(guī)律
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.bilibili.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://api.bilibili.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
到此這篇關(guān)于Python+tkinter實現(xiàn)網(wǎng)站下載工具的文章就介紹到這了,更多相關(guān)Python tkinter網(wǎng)站下載工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyCharm-錯誤-找不到指定文件python.exe的解決方法
今天小編就為大家分享一篇PyCharm-錯誤-找不到指定文件python.exe的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
在win64上使用bypy進(jìn)行百度網(wǎng)盤文件上傳功能
這篇文章主要介紹了在win64上使用bypy進(jìn)行百度網(wǎng)盤文件上傳功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01
Python Django實現(xiàn)layui風(fēng)格+django分頁功能的例子
今天小編就為大家分享一篇Python Django實現(xiàn)layui風(fēng)格+django分頁功能的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
python調(diào)用win32接口進(jìn)行截圖的示例
這篇文章主要介紹了python調(diào)用win32接口進(jìn)行截圖的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11

