首頁 > 軟體

python網路爬蟲實現個性化音樂播放器範例解析

2022-03-14 19:00:58

前言

當前很多人在閒暇時喜歡聽音樂,那麼基於這種現象,我也是肝了幾個小時完成了基於python的個性化音樂播放器,現在分享給你們。

開發元件

python3.5 以上版本就行
tkinter (python 自帶的用於圖形化使用者介面開發的模組)
requests(爬蟲模組)
Chrome 瀏覽器
等等

功能

音樂下載器功能:

(1)、使用者輸入想要下載的歌曲或關鍵字名稱

(2)、程式獲取使用者所輸入的歌曲名稱關鍵字,根據該“關鍵字”向網站發起資料請求

(3)、程式根據返回的資料資訊,進行分析後,呈現清單的形式給使用者

(4)、使用者點選清單所顯示所顯示的相應歌曲,點選下載,便可下載該歌曲

流程分析

基於python的個性化音樂下載器模組詳細

(一)前端模組

# 建立視窗
window = tkinter.Tk()
#設定標題
window.title('音樂下載器',)
#設定視窗大小及位置
window.geometry('900x460+500+100')
#標籤元件
lab = Label(window,text='請輸入要下載的歌曲:',font=('華文行楷',15))
# #標籤定位
lab.grid(row=0,column=0)
#輸入框元件
entry = Entry(window,font=('隸書',20),width=20)
entry.grid(row=0,column=1)
#搜尋按鈕
btn = Button(window,text='搜尋',font=('隸書',15),width=20,command=get_music_list)
btn.grid(row=0,column=2)
#列表框      #可以設定多選,selectmode=MULTIPLE
listbox = Listbox(window,font=('隸書',16),width=45,heigh=15)
listbox.grid(row=1,columnspan=2)
listbox_1 = Listbox(window,font=('隸書',16),width=35,heigh=15)
listbox_1.grid(row=1,column=2)
#下載按鈕
btn_1 = Button(window,text='開始下載',font=('隸書',15),command=get_music_url)
btn_1.grid(row=2,column=0)
#退出按鈕
btn_2 = Button(window,text='退出程式',font=('隸書',15),command=window.quit)
btn_2.grid(row=2,column=2)
# 訊息迴圈顯示介面
window.mainloop()

程式碼中的cammand用來繫結後端函數。
這一塊程式碼用於實現視覺化與使用者互動,這一塊我不多說,大家自行學習python 自帶的tkinter模組就可以實現,效果如圖所示

(二)後端模組

1.分析

進入酷我音樂網站

我們先將這些歌曲名稱先爬取下來,然後新增到前端列表框中

具體函數如下

#獲取音樂搜尋列表的函數
def get_music_list():
	#獲取前端搜尋方塊中輸入的內容
    name = entry.get()
    #下一次搜尋的時候清空列表框用於顯示新的歌單
    listbox.delete(0, END)
    #迴圈載入三頁音樂
    for k in range(1,4):
        url = 'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?'
        data = {
            'key': name,
            'pn': k,
            'rn': '30',
            'httpsStatus': '1',
            'reqId': '161cbd51-cde1-11eb-bf58-bba623268fbb'
            }
        response = requests.get(url=url,headers=headers,params=data,proxies=proxy).text
        dic_data = json.loads(response)
        list_data = dic_data['data']['list']
        #listbox.delete(0,END)
        for i in list_data:
            music_name = i['name']+'-'+i['artist']
            #在列表框中插入音樂名稱
            listbox.insert(END, music_name)
            music_id = i['rid']
            list_1.append(music_id)

至此,音樂列表就新增到了列表框,注意我們將所有音樂的rid新增到了list_1的列表中,每個rid的索引跟列表框中的音樂名稱索引是相對應的,這是實現點選相應歌曲下載的關鍵。然後我們需要實現點選下載的功能。

具體函數如下

#解析音樂url的函數
def get_music_url():
    index = listbox.curselection()   #返回選取的索引,是一個元組
    for i in index:
        music_name = listbox.get(i)
        listbox_1.insert(END, music_name + ' 開始下載')
        url = 'http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3&br=128kmp3&from=web&t=1616159211200&httpsStatus=1&reqId=f8586c01-88b3-11eb-b442-d7b57b6d2564'.format(list_1[i])
        music_data = requests.get(url=url,headers=headers,proxies=proxy).text
        #print(music_data)
        e = '{"code": 200, "msg": "success", "url": "(.*?)"}'
        music_url = re.findall(e, music_data, re.S)[0]
        #print(music_url)
        download_music(music_url,music_name)

最後下載儲存。

具體函數如下

#在當前目錄建立資料夾,用於存放下載的音樂
if not os.path.exists('酷我音樂'):
    os.mkdir('酷我音樂')
#下載音樂並且儲存的函數
def download_music(url,music_name):
    music_name = music_name+".mp3"
    music = requests.get(url=url,proxies=proxy).content
    path = '酷我音樂/' + music_name
    with open(path, 'wb') as fp:
        fp.write(music)
    listbox_1.insert(END, music_name+' 下載完成!')

同時,我們在用python寫爬蟲時會被反爬,下列程式碼為反反爬措施

#ip代理池
ip = ['{"HTTP":"175.42.129.105"}','{"HTTP":"121.232.148.97"}','{"HTTP":"121.232.148.72"}']
proxy = random.choice(ip)
proxy = json.loads(proxy)
#反反爬headers
headers = {
    'User - Agent': 'Mozilla/5.0(Windows NT 10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/90.0.4430.85Safari/537.36',
    'Referer': 'http://www.kuwo.cn/search/list?key=%E7%83%AD%E7%88%B1105%C2%B0C%E7%9A%84%E4%BD%A0',
    'csrf': '0BXQD7I99LN',
    'Cookie': '',
}

這裡的cookie是保持你的登入狀態的,相當於驗證你的身份,寫上你自己的即可。

這裡的csrf與cookie寫你自己的就行,原始碼中我會空著,注意修改。還有,複製cookie之前先在網站登入,cookie會

記錄你的登入狀態,不登入不行哦

這裡的cookie和csrf在第一次請求的header中,如下圖

原始碼

程式碼在這,拿走不謝~~~

import requests
import random
import json
import re
import os
import tkinter
from tkinter import *
list_1 = []    #放置音樂rid的列表
#ip代理池
ip = ['{"HTTP":"175.42.129.105"}','{"HTTP":"121.232.148.97"}','{"HTTP":"121.232.148.72"}']
proxy = random.choice(ip)
proxy = json.loads(proxy)
#反反爬headers
headers = {
    'User - Agent': 'Mozilla/5.0(Windows NT 10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/90.0.4430.85Safari/537.36',
    'Referer': 'http://www.kuwo.cn/search/list?key=%E7%83%AD%E7%88%B1105%C2%B0C%E7%9A%84%E4%BD%A0',
    'csrf': '', #填你的
    'Cookie': '',  #填你的
}
#在當前目錄建立資料夾,用於存放下載的音樂
if not os.path.exists('酷我音樂'):
    os.mkdir('酷我音樂')
#下載音樂並且儲存的函數
def download_music(url,music_name):
    music_name = music_name+".mp3"
    music = requests.get(url=url,proxies=proxy).content
    path = '酷我音樂/' + music_name
    with open(path, 'wb') as fp:
        fp.write(music)
    listbox_1.insert(END, music_name+' 下載完成!')
#解析音樂url的函數
def get_music_url():
    index = listbox.curselection()   #返回選取的索引,是一個元組
    for i in index:
        music_name = listbox.get(i)
        listbox_1.insert(END, music_name + ' 開始下載')
        url = 'http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3&br=128kmp3&from=web&t=1616159211200&httpsStatus=1&reqId=f8586c01-88b3-11eb-b442-d7b57b6d2564'.format(list_1[i])
        music_data = requests.get(url=url,headers=headers,proxies=proxy).text
        #print(music_data)
        e = '{"code": 200, "msg": "success", "url": "(.*?)"}'
        music_url = re.findall(e, music_data, re.S)[0]
        #print(music_url)
        download_music(music_url,music_name)
#獲取音樂搜尋列表的函數
def get_music_list():
    name = entry.get()
    listbox.delete(0, END)
    #迴圈表示載入三頁音樂
    for k in range(1,4):
        url = 'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?'
        data = {
            'key': name,
            'pn': k,
            'rn': '30',
            'httpsStatus': '1',
            'reqId': '161cbd51-cde1-11eb-bf58-bba623268fbb'
            }
        response = requests.get(url=url,headers=headers,params=data,proxies=proxy).text
        dic_data = json.loads(response)
        list_data = dic_data['data']['list']
        #listbox.delete(0,END)
        for i in list_data:
            music_name = i['name']+'-'+i['artist']
            listbox.insert(END, music_name)
            music_id = i['rid']
            list_1.append(music_id)
# 建立視窗
window = tkinter.Tk()
#設定標題
window.title('音樂下載器',)
#設定視窗大小及位置
window.geometry('900x460+500+100')
#標籤元件
lab = Label(window,text='請輸入要下載的歌曲:',font=('華文行楷',15))
# #標籤定位
lab.grid(row=0,column=0)
#輸入框元件
entry = Entry(window,font=('隸書',20),width=20)
entry.grid(row=0,column=1)
#搜尋按鈕
btn = Button(window,text='搜尋',font=('隸書',15),width=20,command=get_music_list)
btn.grid(row=0,column=2)
#列表框      #可以設定多選,selectmode=MULTIPLE
listbox = Listbox(window,font=('隸書',16),width=45,heigh=15)
listbox.grid(row=1,columnspan=2)
listbox_1 = Listbox(window,font=('隸書',16),width=35,heigh=15)
listbox_1.grid(row=1,column=2)
#下載按鈕
btn_1 = Button(window,text='開始下載',font=('隸書',15),command=get_music_url)
btn_1.grid(row=2,column=0)
#退出按鈕
btn_2 = Button(window,text='退出程式',font=('隸書',15),command=window.quit)
btn_2.grid(row=2,column=2)
# 訊息迴圈顯示介面
window.mainloop()

效果圖

看了圖,是不是感覺很nice!

以上就是python網路爬蟲實現個性化音樂播放器範例解析的詳細內容,更多關於python實現音樂播放器的資料請關注it145.com其它相關文章!


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