【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