python網(wǎng)絡(luò)爬蟲(chóng)實(shí)現(xiàn)個(gè)性化音樂(lè)播放器示例解析
前言
當(dāng)前很多人在閑暇時(shí)喜歡聽(tīng)音樂(lè),那么基于這種現(xiàn)象,我也是肝了幾個(gè)小時(shí)完成了基于python的個(gè)性化音樂(lè)播放器,現(xiàn)在分享給你們。
開(kāi)發(fā)組件
python3.5 以上版本就行
tkinter (python 自帶的用于圖形用戶界面開(kāi)發(fā)的模塊)
requests(爬蟲(chóng)模塊)
Chrome 瀏覽器
等等
功能
音樂(lè)下載器功能:
(1)、用戶輸入想要下載的歌曲或關(guān)鍵字名稱
(2)、程序獲取用戶所輸入的歌曲名稱關(guān)鍵字,根據(jù)該“關(guān)鍵字”向網(wǎng)站發(fā)起數(shù)據(jù)請(qǐng)求
(3)、程序根據(jù)返回的數(shù)據(jù)信息,進(jìn)行分析后,呈現(xiàn)清單的形式給用戶
(4)、用戶點(diǎn)擊清單所顯示所顯示的相應(yīng)歌曲,點(diǎn)擊下載,便可下載該歌曲
流程分析

基于python的個(gè)性化音樂(lè)下載器模塊詳細(xì)
(一)前端模塊
# 創(chuàng)建窗口
window = tkinter.Tk()
#設(shè)置標(biāo)題
window.title('音樂(lè)下載器',)
#設(shè)置窗口大小及位置
window.geometry('900x460+500+100')
#標(biāo)簽組件
lab = Label(window,text='請(qǐng)輸入要下載的歌曲:',font=('華文行楷',15))
# #標(biāo)簽定位
lab.grid(row=0,column=0)
#輸入框組件
entry = Entry(window,font=('隸書(shū)',20),width=20)
entry.grid(row=0,column=1)
#搜索按鈕
btn = Button(window,text='搜索',font=('隸書(shū)',15),width=20,command=get_music_list)
btn.grid(row=0,column=2)
#列表框 #可以設(shè)置多選,selectmode=MULTIPLE
listbox = Listbox(window,font=('隸書(shū)',16),width=45,heigh=15)
listbox.grid(row=1,columnspan=2)
listbox_1 = Listbox(window,font=('隸書(shū)',16),width=35,heigh=15)
listbox_1.grid(row=1,column=2)
#下載按鈕
btn_1 = Button(window,text='開(kāi)始下載',font=('隸書(shū)',15),command=get_music_url)
btn_1.grid(row=2,column=0)
#退出按鈕
btn_2 = Button(window,text='退出程序',font=('隸書(shū)',15),command=window.quit)
btn_2.grid(row=2,column=2)
# 消息循環(huán)顯示界面
window.mainloop()
代碼中的cammand用來(lái)綁定后端函數(shù)。
這一塊代碼用于實(shí)現(xiàn)可視化與用戶交互,這一塊我不多說(shuō),大家自行學(xué)習(xí)python 自帶的tkinter模塊就可以實(shí)現(xiàn),效果如圖所示

(二)后端模塊
1.分析
進(jìn)入酷我音樂(lè)網(wǎng)站
我們先將這些歌曲名稱先爬取下來(lái),然后添加到前端列表框中
具體函數(shù)如下
#獲取音樂(lè)搜索列表的函數(shù)
def get_music_list():
#獲取前端搜索框中輸入的內(nèi)容
name = entry.get()
#下一次搜索的時(shí)候清空列表框用于顯示新的歌單
listbox.delete(0, END)
#循環(huán)加載三頁(yè)音樂(lè)
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']
#在列表框中插入音樂(lè)名稱
listbox.insert(END, music_name)
music_id = i['rid']
list_1.append(music_id)
至此,音樂(lè)列表就添加到了列表框,注意我們將所有音樂(lè)的rid添加到了list_1的列表中,每個(gè)rid的索引跟列表框中的音樂(lè)名稱索引是相對(duì)應(yīng)的,這是實(shí)現(xiàn)點(diǎn)擊相應(yīng)歌曲下載的關(guān)鍵。然后我們需要實(shí)現(xiàn)點(diǎn)擊下載的功能。
具體函數(shù)如下
#解析音樂(lè)url的函數(shù)
def get_music_url():
index = listbox.curselection() #返回選取的索引,是一個(gè)元組
for i in index:
music_name = listbox.get(i)
listbox_1.insert(END, music_name + ' 開(kāi)始下載')
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)
最后下載保存。
具體函數(shù)如下
#在當(dāng)前目錄創(chuàng)建文件夾,用于存放下載的音樂(lè)
if not os.path.exists('酷我音樂(lè)'):
os.mkdir('酷我音樂(lè)')
#下載音樂(lè)并且保存的函數(shù)
def download_music(url,music_name):
music_name = music_name+".mp3"
music = requests.get(url=url,proxies=proxy).content
path = '酷我音樂(lè)/' + music_name
with open(path, 'wb') as fp:
fp.write(music)
listbox_1.insert(END, music_name+' 下載完成!')
同時(shí),我們?cè)谟胮ython寫(xiě)爬蟲(chóng)時(shí)會(huì)被反爬,下列代碼為反反爬措施
#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是保持你的登錄狀態(tài)的,相當(dāng)于驗(yàn)證你的身份,寫(xiě)上你自己的即可。
這里的csrf與cookie寫(xiě)你自己的就行,源代碼中我會(huì)空著,注意修改。還有,復(fù)制cookie之前先在網(wǎng)站登錄,cookie會(huì)
記錄你的登錄狀態(tài),不登錄不行哦
這里的cookie和csrf在第一次請(qǐng)求的header中,如下圖

源代碼
代碼在這,拿走不謝~~~
import requests
import random
import json
import re
import os
import tkinter
from tkinter import *
list_1 = [] #放置音樂(lè)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': '', #填你的
}
#在當(dāng)前目錄創(chuàng)建文件夾,用于存放下載的音樂(lè)
if not os.path.exists('酷我音樂(lè)'):
os.mkdir('酷我音樂(lè)')
#下載音樂(lè)并且保存的函數(shù)
def download_music(url,music_name):
music_name = music_name+".mp3"
music = requests.get(url=url,proxies=proxy).content
path = '酷我音樂(lè)/' + music_name
with open(path, 'wb') as fp:
fp.write(music)
listbox_1.insert(END, music_name+' 下載完成!')
#解析音樂(lè)url的函數(shù)
def get_music_url():
index = listbox.curselection() #返回選取的索引,是一個(gè)元組
for i in index:
music_name = listbox.get(i)
listbox_1.insert(END, music_name + ' 開(kāi)始下載')
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)
#獲取音樂(lè)搜索列表的函數(shù)
def get_music_list():
name = entry.get()
listbox.delete(0, END)
#循環(huán)表示加載三頁(yè)音樂(lè)
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)
# 創(chuàng)建窗口
window = tkinter.Tk()
#設(shè)置標(biāo)題
window.title('音樂(lè)下載器',)
#設(shè)置窗口大小及位置
window.geometry('900x460+500+100')
#標(biāo)簽組件
lab = Label(window,text='請(qǐng)輸入要下載的歌曲:',font=('華文行楷',15))
# #標(biāo)簽定位
lab.grid(row=0,column=0)
#輸入框組件
entry = Entry(window,font=('隸書(shū)',20),width=20)
entry.grid(row=0,column=1)
#搜索按鈕
btn = Button(window,text='搜索',font=('隸書(shū)',15),width=20,command=get_music_list)
btn.grid(row=0,column=2)
#列表框 #可以設(shè)置多選,selectmode=MULTIPLE
listbox = Listbox(window,font=('隸書(shū)',16),width=45,heigh=15)
listbox.grid(row=1,columnspan=2)
listbox_1 = Listbox(window,font=('隸書(shū)',16),width=35,heigh=15)
listbox_1.grid(row=1,column=2)
#下載按鈕
btn_1 = Button(window,text='開(kāi)始下載',font=('隸書(shū)',15),command=get_music_url)
btn_1.grid(row=2,column=0)
#退出按鈕
btn_2 = Button(window,text='退出程序',font=('隸書(shū)',15),command=window.quit)
btn_2.grid(row=2,column=2)
# 消息循環(huán)顯示界面
window.mainloop()
效果圖

看了圖,是不是感覺(jué)很nice!
以上就是python網(wǎng)絡(luò)爬蟲(chóng)實(shí)現(xiàn)個(gè)性化音樂(lè)播放器示例解析的詳細(xì)內(nèi)容,更多關(guān)于python實(shí)現(xiàn)音樂(lè)播放器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用 Python 處理3萬(wàn)多條數(shù)據(jù)只要幾秒鐘
在工作中經(jīng)常遇到大量的數(shù)據(jù)需要整合、去重、按照特定格式導(dǎo)出等情況。這篇文章主要介紹了使用 Python 處理3萬(wàn)多條數(shù)據(jù)只要幾秒鐘的相關(guān)知識(shí),需要的朋友可以參考下2020-01-01
python之用Numpy和matplotlib畫(huà)一個(gè)魔方
這篇文章主要介紹了如何用Numpy和matplotlib畫(huà)一個(gè)魔方,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Python深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)基本原理
人工神經(jīng)網(wǎng)絡(luò)(Artificial Neural Networks,簡(jiǎn)寫(xiě)為ANNs)也簡(jiǎn)稱為神經(jīng)網(wǎng)絡(luò)(NNs)或稱作連接模型(Connection Model),它是一種模仿動(dòng)物神經(jīng)網(wǎng)絡(luò)行為特征,進(jìn)行分布式并行信息處理的算法數(shù)學(xué)模型2021-10-10
Python實(shí)現(xiàn)尋找回文數(shù)字過(guò)程解析
這篇文章主要介紹了Python實(shí)現(xiàn)尋找回文數(shù)字過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Python 如何將integer轉(zhuǎn)化為羅馬數(shù)(3999以內(nèi))
這篇文章主要介紹了Python 將integer轉(zhuǎn)化為羅馬數(shù)(3999以內(nèi))的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
利用python實(shí)現(xiàn)簡(jiǎn)易版的貪吃蛇游戲(面向python小白)
這篇文章主要給大家介紹了關(guān)于如何利用python實(shí)現(xiàn)簡(jiǎn)易版的貪吃蛇游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12

