前言

网易云音乐相信很多小伙伴都用过,是一个非常不错的音乐播放器。

但是越来越多的歌曲开始加入VIP的行列,甚至听都不能听。这类歌曲我们是很难下载的。

而有些歌曲,虽然可以听,但是下载是需要收费的。这类歌曲可以通过本案例轻松下载。即只要能听,就能下载。

所用到的工具:selenium。需要配置一个谷歌selenium的chromedriver。参见教程:selenium配置谷歌浏览器,chromedriver放置的文件夹

Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

本案例中的应用程序界面使用的是python自带的tkinter,它比较简单,容易上手。

思路

所使用的接口:
http://music.163.com/song/media/outer/url?id=1345848098.mp3
只要更改其歌曲id,就能下载对应的歌曲了。

所以本程序主要就是通过selenium模拟用户操作浏览器,获取到歌曲的 id,有了歌曲id,就配合该接口解析出歌曲,最后通过urlretrieve下载保存。

该案例的逻辑一目了然,毫无疑问,它的本质,它的核心,就是获取歌曲的 id。

核心代码

获取歌曲 id:

   url = 'https://music.163.com/#/search/m/?s={}&type=1'.format(name)driver = webdriver.Chrome() #这是不隐藏浏览器的driver.get(url=url)driver.switch_to.frame('g_iframe') #有: frame  id  name indexreq = driver.find_element_by_id('m-search')# 获取歌曲id,通过xpath语法快速定位那个dom元素a_id = req.find_element_by_xpath('.//div[@class="item f-cb h-flag  "]/div[2]//a').get_attribute('href')print(a_id) #https://music.163.com/song?id=1345848098song_id = a_id.split('=')[1]



全部代码

from tkinter import *
from selenium import webdriver
# from urllib.parse import quote
import requests
import os# 功能
# https://music.163.com/#/search/m/?s=%E7%BB%BF%E8%89%B2&type=1 (搜索)
# http://music.163.com/song/media/outer/url?id=1345848098.mp3(下载)
headers = {'User-Agent': 'Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1'}# 获取歌曲下载链接,直接下载
def song_load(item):song_id = item['song_id']song_msg = item['song_msg']song_url = 'http://music.163.com/song/media/outer/url?id={}.mp3'.format(song_id)# 创建一个文件夹os.makedirs('music',exist_ok=True) #如果该文件夹已经存在,则不创建path = 'music\{}.mp3'.format(song_msg)# 提示性消息(日志)listbox.insert(END,'歌曲:{},正在下载...'.format(song_msg))# 消息文本框滚动listbox.see(END)# 更新listbox.update()# 下载song_data = requests.get(song_url,headers=headers).contenttry:with open(path, 'wb') as file:file.write(song_data)print('%s 下载成功' % song_msg)except Exception as e:print(e)# 下载完毕listbox.insert(END, '恭喜你,{} 下载完毕,快去试着听一听吧'.format(song_msg))# 消息文本框滚动listbox.see(END)# 更新listbox.update()# 获取歌曲ID
def get_music_id():name = entry.get()#获取用户在输入框中输入的内容# 利用quote函数进行URL编码,将汉字转为Unicode# name = quote(name) 我们把它注释掉,原因是利用selenium去请求是不需要url编码的,而使用requests就必须添加这行代码url = 'https://music.163.com/#/search/m/?s={}&type=1'.format(name)print(url)# 隐藏浏览器option = webdriver.ChromeOptions()option.add_argument('--headless')driver = webdriver.Chrome(chrome_options=option)# driver = webdriver.Chrome() #这是不隐藏浏览器的driver.get(url=url)driver.switch_to.frame('g_iframe') # frame  id  name indexreq = driver.find_element_by_id('m-search')# 获取歌曲ida_id = req.find_element_by_xpath('.//div[@class="item f-cb h-flag  "]/div[2]//a').get_attribute('href')print(a_id) #https://music.163.com/song?id=1345848098song_id = a_id.split('=')[1]print(song_id)# 获取歌曲名称song_name = req.find_element_by_xpath('.//div[@class="item f-cb h-flag  "]/div[2]//b').get_attribute('title')print(song_name)# 获取歌手名字singer_name = req.find_element_by_xpath('.//div[@class="item f-cb h-flag  "]/div[4]//a').textprint(singer_name)# 退出浏览器driver.quit()# 构建一个字典 id=?   msg =?item = {}item['song_id'] = song_iditem['song_msg'] = f'{song_name}-{singer_name}'song_load(item)#下载# 界面 (tkinter)
#1.创建一张画布(界面)
root = Tk()
#2.添加标题
root.title("网易云音乐下载器")
#3.设置窗口大小
root.geometry('560x450+400+200')
#4.标签控件
label = Label(root,text="请输入歌曲名称:",font=("华文行楷",20))
#5.定位,表格布局,添加控件
label.grid() #默认放置在第一个格子里
#6.输入框
entry = Entry(root,font=("隶书",20))
#7.定位
entry.grid(row=0,column=1)
#8.列表框
listbox = Listbox(root,font=('隶书',16),width=50,height=15)
#9.定位
listbox.grid(row=1,columnspan=2)# columnspan横跨两列
#10.下载按钮
downloadBtn = Button(root,text='开始下载',font=('隶书',15),command=get_music_id)#command=
downloadBtn.grid(row=2,column=0)
#11.退出程序按钮
exitBtn = Button(root,text='退出程序',font=('隶书',15),command=root.quit)
#quit后面一定不要加括号,不加括号意味着该函数在事件触发后才执行
exitBtn.grid(row=2,column=1)
#设置窗口不可拖拽
root.resizable(width=False,height=False)
#消息循环,让界面显示(放在后面写)
root.mainloop()

运行截图


exe文件:
链接:https://pan.baidu.com/s/1Mo9vDChpUxzP0MTiCCcIMA
提取码:gtrt

python+selenium+tkinter打造网易云音乐下载器相关推荐

  1. python +tkinter 打造网易云音乐下载播放器

    先上图],本次爬取得是网易云音乐,因为接口很方便,还没试百度云音乐, 提供2种下载方式,单曲下载和url歌单链接批量下载,自动识别单曲或者是歌单链接,[正则表达式匹配] 由于搜索单曲,歌曲列表经过筛选 ...

  2. python爬取网易云歌单_详解python selenium 爬取网易云音乐歌单名

    目标网站: 首先获取第一页的数据,这里关键要切换到iframe里 打印一下 获取剩下的页数,这里在点击下一页之前需要设置一个延迟,不然会报错. 结果: 一共37页,爬取完毕后关闭浏览器 完整代码: u ...

  3. python爬虫爬取网易云音乐下载_Python爬虫实践-网易云音乐!没有版权又如何!照样爬取!...

    1.前言 最近,网易的音乐很多听不到了,刚好也看到很多教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊! 本文主要参考 python编写 ...

  4. 网易云音乐下载软件(下)

    网易云音乐下载软件 一. 面向对象设计与多线程 二. 打包为exe文件 三. 效果图 前面实现了一个网易云音乐下载器,我们继续进行改进 一. 面向对象设计与多线程 这里增加了一个输入框,与前面方法类似 ...

  5. python网易云音乐下载_GUI图形化界面

    效果展示 1,打包exe文件,window直接可以运行 2,输入歌曲名字可以直接下载 3,下载后的歌曲保存在netease.exe文件所在的同一个文件夹中,music_netease文件夹是程序自动创 ...

  6. python网易云音乐下载,可选择歌曲,下载路径

    效果图 代码中用到了Crypto模块,Windows安装时会报错,① 建议选择对应解释器的版本搜索安装依赖.whl后缀的依赖包文件,找到之后直接pip install XXX.whl就可以了,在文章后 ...

  7. python爬虫---网易云音乐下载

    python爬虫爬取网易云音乐 1.实现功能 2.具体实现 1.搜索部分 2.下载歌曲 1.再次获取信息 2.下载 3.结语 Github完整代码获取:https://github.com/Lian- ...

  8. python网易云音乐下载打包exe文件,Windows可运行

    下载原理: 通过官方的下载链接http://music.163.com/song/media/outer/url?id=歌曲id.mp3, 分析网页寻找歌曲id组装成song_url,urlretri ...

  9. Python爬虫之网易云音乐下载

    Python爬虫之网易云音乐下载 目标 用Python根据网易云音乐的ID,下载音乐,保存到本地MP3格式 可以下载歌曲的范围:所有能够听的歌曲 配置基础 Python 3.5 模块 pycrypto ...

  10. Selenium爬取网易云音乐评论

    Selenium爬取网易云音乐评论 一.爬取工具 1.1 selenium ​ selenium这是一个第三方库我们可以通过 pip install selenium来安装这个第三方库. ​ Sele ...

最新文章

  1. 百度bae mysql_微信公众号开发第二课 百度BAE搭建和数据库使用
  2. 南师大计算机语言学,南师大(语言学,文字学,文献学专业备考建议)
  3. P2839-[国家集训队]middle【主席树,二分】
  4. “npm ERR! code ELIFECYCLE npm ERR! errno 1”问题
  5. JS中的THIS处理及正则表达式 — 1、callapplyjson
  6. leetcode 21 合并两个有序链表 (python)
  7. Python金融系列第七篇:市场风险
  8. requests使用cookie模拟登陆豆瓣
  9. 连接服务器没有发挥作用,iPhone“连到系统上的设备没有发挥作用”原因分析及解决方法...
  10. 2015Astar百度之星初赛 1001 超级赛亚ACMer
  11. dbpedia知识图谱java_一种基于DBpedia的水务领域概念知识图谱构建方法与流程
  12. SpringBoot下载文件的正确方式~
  13. [WTL/ATL]_[Gdiplus]_[绘制虚线并设置破折号空格的宽度]
  14. 劈开迷雾,蘑菇街电商搜索架构及搜索排序实现
  15. IOS大牛的技术人生的经验与心得
  16. python画螺旋状图形教程_Python实现的绘制三维双螺旋线图形功能示例
  17. 自动控制原理笔记一(引论和拉普拉斯变换)
  18. C++ 解析PDF文件(含代码)
  19. 企业如何利用自动化设备管理软件做好商机管理?
  20. Excel求解运输问题——以福斯特公司问题为例

热门文章

  1. 信贷反欺诈场景中策略与模型的搭建|实操一大反欺诈模型
  2. STM32F107各种接口程序合集工程文件
  3. ubuntu命令行安装teamview
  4. 读书笔记 《TAOCP》 V1 S1.2
  5. A.B.C类地址的私有地址、局域网地址、保留地址
  6. 【过关斩将般的一步步实现】windows本机通过xftp/xshell连接Ubuntu虚拟机服务器
  7. JS简单实现分页显示
  8. 任玉刚:让你的职业迷茫从哪来回哪去
  9. 规划计算机网络的成本估算,传统的项目管理软件包括进度计划、成本控制、资源调度和( )等功能模块。...
  10. 美国飞机安全事件频发:背后黑手竟然是5G?