使用python实现网易云音乐下载器

【Python 爬虫】爬取网易云音乐,打造音乐下载器 最近刚好学了 Tkinter 和 Canvas 画布,顺便总结了一下,想着那它来做点什么练练手,我平常挺喜欢听音乐

本文包含相关资料包-----> 点击直达获取<-------

【Python 爬虫】爬取网易云音乐,打造音乐下载器

最近刚好学了 Tkinter 和 Canvas 画布,顺便总结了一下,想着那它来做点什么练练手,我平常挺喜欢听音乐,特别是在大型评论 APP 平台——网易云音乐(滑稽),歌不仅推荐的好,而且评论“个个说话又好听”。所以想着自己做一个音乐下载器,试一试。结果感觉还可以,起码做出来了,就是界面糙了点,功能简陋点,除了能跑,也就没啥优点了。

废话不多说,上一波效果图。

搭建窗口

搭建窗口就像画画一样,你需要哪些,可以使用 tkinter 组件像画画一样把它布局到 canvas 上。把需要的布局想好,设定好,再布局到想要的位置上。

``` from tkinter import *

搭建界面

创建界面 画板窗口

window = Tk()

创建标题

window.title('网易云音乐')

设置窗口大小和位置

window.geometry('560x450+400+200')

标签控件,实现文本和字体及大小

label = Label(window,text='请输入下载的歌曲:',font=('华文行楷',20))

标签定位

label.grid()

输入框

entry = Entry(window,font=('隶书',20))

定位

entry.grid(row=0,column=1)

列表框

text = Listbox(window,font=('楷书',16),width=50,height=15)

定位 columnspan组件横跨的列数

text.grid(row=1,columnspan=2)

点击开始下载按钮

button_start = Button(window,text='开始下载',font=('楷书',15),command='')

定位,按钮‘粘着’在西侧(左侧)

button_start.grid(row=2,column=0,sticky=W)

点击退出按钮

button_quit = Button(window,text='退出程序',font=('楷书',15),command='')

定位

button_quit.grid(row=2,column=1,sticky=E)

显示界面

window.mainloop() ```

说明:

``` mainloop实现窗口的显示,否则窗口无法显示;

geometry函数参数的含义:('长X宽'),窗口默认出现在屏幕的左上角,修改位置,('长X宽+距左边框距离+距上边框距离');

在label设置标签和entry设置文本框中,定义部分就像画画时我们想好了要画多大的、画在哪,但还没有落笔去画,grid()函数就像是是我们下笔的动作一样,把我们想的在窗口上显示出来;

grid()的参数就像把一张画纸以自适应表格的形式去划分,我要把布局放在哪里就用行和列的形式去摆放;

窗口中核心的部分在于按钮逻辑的设计,即conmand命令所要执行的函数。 ```

运行效果:

爬虫实现下载音乐

歌曲搜索

利用爬虫实现下载音乐的功能。打开网易云音乐网页,任意搜索歌曲,F12 打开网页源代码,可以找到每首歌独特的歌曲 id,就像每个人的身份证一样,是独一无二的,可以定位到每一首歌。

网易云音乐提供了歌曲的外链接口( https://music.163.com/song/media/outer/url?id={}.mp3 ),于是可以从网页中爬取到歌曲的 id,写入外链接口中,进行歌曲的下载。问题就变成了一个爬虫问题,根据歌曲名爬取每个歌曲的 id。

但在实际开发过程中,根据搜索想要的歌,但在网易云网页的源代码中却找不到歌名,此时发现这个网页是一个动态网页(静态页面和动态页面的区别),信息都是动态加载出来的,那么爬虫就不能用 request 爬取静态页面那套了,python 中对于动态页面爬虫也有对应的库‘selenium’,其好比一个网页浏览的机器人,伪造一个类似的界面。

``` from selenium import webdriver

def get_music_name():

url='https://music.163.com/#/search/m/?s={}&type=1'.format('雅俗共赏')

driver=webdriver.Firefox()

driver.get(url)

get_music_name() ```

selenium 会自动打开火狐浏览器,打开网页找到歌曲“雅俗共赏”。

```

爬取音乐(动态页面)

搜索函数

def get_music_name():

# 获取歌曲名称
name=entry.get()
url='https://music.163.com/#/search/m/?s={}&type=1'.format(name)

# 隐藏浏览器
option=webdriver.FirefoxOptions()
option.add_argument('--headless')
driver=webdriver.Firefox(firefox_options=option)

# 搜索歌曲页面
# driver = webdriver.Firefox()
driver.get(url)

# 根据id查询到标签
driver.switch_to.frame('g_iframe')

# 获取歌曲id
res = driver.find_element_by_id('m-search')
music_url = res.find_element_by_xpath('.//div[@]/div[2]//a').get_attribute("href")
print(music_url)

# 提取id
music_id = music_url.split('=')[-1]
# print(music_id)

# 提取歌名
music_name=res.find_element_by_xpath('.//div[@]/div[2]//b').get_attribute("title")
# print(music_name)

# 构造字典保存歌曲信息用于下载
item={}
item['music_id']=music_id
item['music_name']=music_name

# 退出浏览器
driver.quit()

```

说明:

webdriver.Chrome()为启动谷歌浏览器;webdriver.Firefox()为启动火狐浏览器

在 driver 中自动集成了一些爬虫的工具,不需要再使用正则表达式或者 BeautifulSoup 等;driver.switch_to.frame()查询指定 id=‘g_iframe’下的标签,如上图黄色标记,通过 id=‘m-search’找到下方的节点,免于一层层查找的麻烦,通过 xpath 语法查找,从‘item f-cb h-flag ’再向下找两层 div 中找到‘a’标签,从而提取出 id;提取歌名也是同样的道理;

下载歌曲

```c def music_load(item): music_id=item['music_id'] music_name=item['music_name']

# id填充到下载url中
music_download_url='https://music.163.com/song/media/outer/url?id={}.mp3'.format(music_id)

# 创建保存文件夹
os.makedirs('music_netease',exist_ok=True)
path='music_netease\{}.mp3'.format(music_name)

# 显示数据到文本框
text.insert(END,'歌曲:{},正在下载...'.format(music_name))
# 文本滚动
text.see(END)
# 更新
text.update()

# 下载
urlretrieve(music_download_url,path)

# 下载完成,显示完成
text.insert(END,'下载完毕:{},请试听!'.format(music_name))
text.see(END)
text.update()

```

说明:

将搜索函数查找到的歌曲 id 接入下载链接;

makedirs 中 exist_ok 参数:如果已存在同名文件夹,不会再创建,也不会报错

使用 urlretrieve 方法可以根据链接直接将下载文件保存到路径中,不需要再次请求打开文件写入;

绑定命令

button_start = Button(window,text='开始下载',font=('楷书',15),command='get_music_name')

button_quit = Button(window,text='退出程序',font=('楷书',15),command='window.quit')

将爬虫下载的函数绑定到按钮上,大功告成!

生成可执行文件

打开 Pycharm 下方的 Terminal 终端,输入 pyinstaller -F 文件名.py(需要提前安装 pyinstaller 库,并且在 py 文件所在目录下执行),即可打包成 exe 文件。

PS:只支持下载客户端免费下载的音乐,无法下载付费音乐和 VIP 音乐

感想

学无止境,你有爬虫技术,别人就有防止你爬虫的技术,停滞不前就是退步!

爬虫也是学习不久,可能存在一些问题或者改进优化的地方,还请各位大佬不吝赐教,一起进步,嘻嘻。

参考文献

  • 面向智能耳机的音乐服务平台的设计与实现(北京交通大学·刘新韵)
  • 基于网络爬虫技术的多源下载系统的设计与实现(北京邮电大学·李蕊)
  • 面向智能耳机的音乐服务平台的设计与实现(北京交通大学·刘新韵)
  • 基于用户偏好的个性化音乐推荐系统应用与研究(东北石油大学·王曲歌)
  • 基于音乐基因的混合音乐推荐系统的设计与实现(安徽大学·钟伟)
  • 大连宫臣共享音乐网站的设计与实现(大连理工大学·宫臣)
  • 在线音乐电子商务平台的设计与实现(电子科技大学·张丽)
  • 个性化音乐推荐系统的设计与实现(华中科技大学·余梦琴)
  • 社会化智能音乐发现系统设计与实现(复旦大学·丛洋洋)
  • 社会化智能音乐发现系统设计与实现(复旦大学·丛洋洋)
  • 基于排序学习的音乐推荐系统设计与实现(重庆大学·魏斌)
  • 基于联想云存储智能企业网盘的设计与实现(北京交通大学·王圆圆)
  • 面向智能耳机的音乐服务平台的设计与实现(北京交通大学·刘新韵)
  • 在线音乐管理系统设计与实现(华中科技大学·白爱)
  • 基于用户行为的音乐推荐系统设计与实现(华中科技大学·郝陆风)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码客栈 ,原文地址:https://m.bishedaima.com/yuanma/35843.html

相关推荐

  • 基于Vue2.0实现简易豆瓣电影webApp

    基于Vue2,0实现简易豆瓣电影webApp 1,运行项目 clone项目到本地,进入项目文件夹,安装依赖 javascript git clone https://github
    2024年05月14日
    5 1 1
  • 基于Javaweb的地方旅游网站实现、java+ssh+mysql

    在当今数字化时代,互联网的普及已经改变了人们的生活方式,旅游行业也不例外,随着互联网技术的不断发展,越来越多的人选择在网上搜索旅游信息,规划自己的行程,基于此背景,本研究旨在利用Java+SSH框架与MySQL数据库
    2024年05月07日
    3 1 1
  • Python程序设计#2作业

    Python程序设计#2作业 作业题目 数据文件(test,txt)是一个全球温度年度异常历史数据,基于Sanic实现一个查询服务,服务包括: 按起始和结束年份查询历史数据
    2024年05月14日
    1 1 1
  • 基于Java的俄罗斯方块小游戏课程设计源码

    这是一个🔥🔥基于Java的俄罗斯方块小游戏课程设计🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 俄罗斯方块小游戏开发技术栈为Java项目,可以作为毕业设计课程设计作业基于Java+Swing是西安一个俄罗斯方块小游戏
    2024年05月23日
    8 1 2
  • 基于SpringBoot框架的人事管理系统

    这是一个采用Java语言开发的🔥🔥SpringBoot架构的人力资源管理系统源代码🔥🔥,项目中融入了Vue技术,开发工具为Idea或Eclipse,此系统适用于毕业设计或课程实践
    2024年05月23日
    4 1 1
  • 基于SpringBoot框架的论坛系统

    这是一套采用Java语言,基于SpringBoot框架构建的论坛系统源代码,项目中融入了Vue技术,开发工具为Idea或Eclipse,该论坛系统设计适用于毕业设计或课程设计任务
    2024年05月23日
    12 1 6
  • 基于SpringBoot框架的乐享田园系统

    这是一套采用🔥🔥SpringBoot为核心的田园风光管理系统源代码🔥🔥,主要编程语言为Java,并结合了SpringBoot及Vue,js技术栈,开发工具选择Idea或Eclipse
    2024年05月23日
    5 1 1
  • 基于Python实现的孤立词语音识别系统

    基于Python实现的孤立词语音识别系统 1 任务介绍 语音识别是通往真正的人工智能的不可缺少的技术,尽管能真正听懂人类说话的智能机器任然在未来不可捉摸的迷雾之中
    2024年05月14日
    2 1 1
  • 基于SSM框架的医院电子病历管理系统源代码

    随着医院规模的不断扩大,传统的纸质病历已显不适应日益增长的患者需求与医疗信息化的发展趋势,基于SSM框架的医院电子病历管理系统应运而生,旨在解决这一问题,该系统以减轻医生负担
    2024年05月07日
    27 1 5
  • Java+SSM实现类似京东的3C电子商城系统

    这是一个🔥🔥SSM实现类似京东的3C电子商城系统🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 3C电子商城系统开发技术栈为SSM项目,可以作为毕业设计课程设计作业基于Spring
    2024年05月23日
    2 1 1

发表回复

登录后才能评论