-
Notifications
You must be signed in to change notification settings - Fork 0
生成界面,爬取网页版网易云音乐并下载 #3
Copy link
Copy link
Open
Description
# 爬取网易云音乐
from tkinter import * #init __all__ =[a,b] *代表方法的二维表
import requests #请求用
from bs4 import BeautifulSoup #获取ID
from urllib.request import urlretrieve #下载用
# 爬去网易云音乐
# 获取页面源代码
# 获取音乐的ID
# 根据网易提供的接口下载音乐 # https://music.163.com/song/media/outer/url?id=28633433
def download_song():
# 获取用户输入的地址URL
url = entry.get()
# url = 'https://music.163.com/playlist?id=2185087020'
# https://music.163.com/song/media/outer/url?id=28633433 # 歌曲的id
# 获取源代码
# https://music.163.com/playlist?id=2185087020 #需要下载的音乐专辑网址
# 请求头(判断通过什么请求服务器)
header = {
'Host':'music.163.com',
'Referer':'https://music.163.com/',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
res = requests.get(url,headers = header).text
# print(res) #<Response [200]> 代表请求成功
# 创建对象解析网页、lxml
r = BeautifulSoup(res,'html.parser')
# print(type(r)) <class 'bs4.BeautifulSoup'>
#获取ID
music_dict = {}
result = r.find('ul',{'class','f-hide'}).find_all('a')
# print(result)
# 正则表达式取 # 出页面ID,BS4,xpath
for music in result:
# print(music)
music_id = music.get('href').strip('/song?id=')
# print(music_id)
music_name = music.text
music_dict[music_id] = music_name
# print(music_dict)
# 循环字典
for song_id in music_dict:
song_url = 'https://music.163.com/song/media/outer/url?id=%s'%song_id
# 下载的路径
path = '*************\%s.mp3'%music_dict[song_id] #****需要自己添加下载在电脑上的路径
# 在界面中显示
#文本框添加数据
text.insert(END,'正在下载:%s'%music_dict[song_id])
# 文本框向下滚动
text.see(END)
# 更新
text.update()
#下载地址,下载路径
urlretrieve(song_url,path)
# ********************************************************
#搭建界面
# 创建窗口
root = Tk()
# 窗口标题
root.title("网易云音乐")
# 窗口的大小和位置
root.geometry('550x400+600+230') #500x400确定窗口大小 +600+230确定窗口位置
# 窗口位置
# root.geometry("+600+230")
# 创建一个标签控件
label = Label(root,text = '请输入要下载的歌单URL',font =('华文行楷',10))
# 定位grid (网格式布局) pack (包) place (位置)
label.grid(row = 0,column = 0) #可以不写
# 输入框
entry = Entry(root,font = ('微软雅黑',25))
entry.grid(row = 0,column = 1,sticky = E)
# 列表框控件
text = Listbox(root,font = ('微软雅黑',10),width = 68,height = 10)
# columnspan 组件所跨的列数
text.grid(row = 1,columnspan = 2)
# 点击按钮
button = Button(root,text = '开始下载',font = ('微软雅黑',15),command = download_song)
# sticky对齐方式 N S W E 东南西北
button.grid(row = 2,column = 0,sticky = W)
button1 = Button(root,text = '退出',font = ('微软雅黑',15),command = root.quit())
button1.grid(row = 2,column = 1,sticky = E)
# 显示窗口 消息循环
root.mainloop()Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels