Skip to content

生成界面,爬取网页版网易云音乐并下载 #3

@MARKmj

Description

@MARKmj
# 爬取网易云音乐


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()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions