溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么使用Python+tkinter實(shí)現(xiàn)網(wǎng)站下載工具

發(fā)布時間:2023-03-07 14:12:05 來源:億速云 閱讀:133 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下怎么使用Python+tkinter實(shí)現(xiàn)網(wǎng)站下載工具的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

開發(fā)環(huán)境

python 3.8: 解釋器

pycharm: 代碼編輯器

本次項(xiàng)目案例步驟

1.先確定想要的功能,今天這個項(xiàng)目的主要功能為三個

  • 視頻

  • 評論

  • 彈幕

2.創(chuàng)建一個簡單的用戶交互界面,簡潔明了

先展示下完成品的效果

怎么使用Python+tkinter實(shí)現(xiàn)網(wǎ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ù)點(diǎn),0:全透明;1:全不透明
root.attributes("-alpha", 0.9)

root.mainloop()

怎么使用Python+tkinter實(shí)現(xiàn)網(wǎng)站下載工具

功能按鍵

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)

怎么使用Python+tkinter實(shí)現(xiàn)網(wǎng)站下載工具

怎么使用Python+tkinter實(shí)現(xiàn)網(wǎng)站下載工具

主要功能代碼編寫

功能一

我們用正則來提取數(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

以上就是“怎么使用Python+tkinter實(shí)現(xiàn)網(wǎng)站下載工具”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI