使用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

相关推荐

发表回复

登录后才能评论