admin管理员组文章数量:1794759
python爬虫轻松下载某易云音乐
文章目录
- section1: 声明
- section2 :下载链接分析
- section3:代码编写
- 1、导包
- 2、构建请求头
- 3、创建文件夹
- 4、实现页面无可视化
- 5、构建获取音乐ID的函数
- 6、构建获取音乐name的函数
- 7、构建获取歌手name的函数
- 8、构建下载音乐的函数
- 9、构建主函数
- 10、完整代码
- section4:参考博文及学习链接
- 1、chromedriver与chrome版本映射表及下载地址
- 2、selenium安装
- 3、Selenium的视频讲解
- 4、思路参考
- section5:代码不足(说明)
- section6:代码完善:基于section5的不足(完善时间:2021.02.08)
- section7:代码完善(基于代码的规范性)(完善时间:2021.02.09)
1、只支持能在某易云音乐平台在线播放的音乐!!! 对于音乐人,我们要支持他们,支持正版版权!!! 2、因为是学习笔记,所以只下载搜到的歌曲列表的第一首音乐,需要下载更多的,可以自行修改一下代码。 3、本文如有侵权,请联系我删除文章!!!
section2 :下载链接分析某易云在线播放每首歌曲时,都有一个外链地址,这是不会变的,跟每首歌的唯一一个id绑定在一起,而每首歌audio文件的URL如下:
url = 'music.163/song/media/outer/url?id=' + 歌曲的id值 + '.mp3'那么id是什么呢?id应该怎么获取呢? 其实很简单,当你在网易云打开一个音乐时,就能很明显地发现:(本文以《小酒窝》为例) Q:那怎么获取不同音乐的id呢? A:换首歌即可呀。 Q:那获取每首歌的这个页面有什么规律可循嘛? A:当然! 请看: 这是根据歌曲名搜索得到的页面,我们搜几首不同的歌,看看变化。 《小酒窝》 《用心良苦》 《Scarborough Fair》 通过这三个例子,我们就能提取出一个通用的URL模板:
url='music.163/#/search/m/?s= ' + 歌曲的名字 + ' &type=1'这样,我们就可以通过一个歌曲的名字获取到一个页面,在这个页面能获取歌曲的ID,然后通过ID和之前的一个URL模板组合起来,就能得到一个全新的URL。 以《小酒窝》为例,得到一个URL:
music.163/song/media/outer/url?id=26305541.mp3访问这个URL,出现这个页面,就是我们想要得到的外链 接着对这个页面进行分析 这里面的内容就是我们想要得到的,最终的下载链接!
section3:代码编写 1、导包 import requests import os import bs4 from selenium import webdriver from time import sleep from selenium.webdriver.chrome.options import Options 2、构建请求头 headers = { 'user - agent': 'Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 80.0.3987.116Safari / 537.36' } 3、创建文件夹 #创建文件夹 if not os.path.exists('D:/网易云音乐'): os.mkdir('D:/网易云音乐') 4、实现页面无可视化 # 实现无可视化界面(固定写法) chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') 5、构建获取音乐ID的函数 #获取音乐id def get_music_ids(url): # 初始化browser对象 browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) # 访问该url browser.get(url=url) # 由于网页中有iframe框架,进行切换 browser.switch_to.frame('g_iframe') # 等待0.5秒 sleep(0.5) # 抓取到页面信 page_text = browser.execute_script("return document.documentElement.outerHTML") # 退出浏览器 browser.quit() # 提取音乐的id,名字,歌手名 soup = bs4.BeautifulSoup(page_text, 'html.parser') music_ids = soup.select("div[class='td w0'] a") # 音乐id music_id = music_ids[0].get("href") music_id = music_id.split('=')[-1] return music_id 6、构建获取音乐name的函数 #获取音乐名称 def get_music_names(url): browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) browser.get(url=url) browser.switch_to.frame('g_iframe') sleep(0.5) page_text = browser.execute_script("return document.documentElement.outerHTML") browser.quit() soup = bs4.BeautifulSoup(page_text, 'html.parser') music_names = soup.select("div[class='td w0'] a b") # 音乐名字 music_name=music_names[0].get("title") return music_name 7、构建获取歌手name的函数 #获取歌手名称 def get_music_singers(url): browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) browser.get(url=url) browser.switch_to.frame('g_iframe') sleep(0.5) page_text = browser.execute_script("return document.documentElement.outerHTML") browser.quit() soup = bs4.BeautifulSoup(page_text, 'html.parser') music_singers = soup.select("div[class='td w1'] a") music_singer=music_singers[0].string return music_singer 8、构建下载音乐的函数 #下载音乐 def download_music(url,name,singer): response=requests.get(url=url,headers=headers) music_data=response.content music_path_name='{}_{}.mp3'.format(name,singer) music_path='D:/网易云音乐/'+music_path_name with open(music_path,'wb') as f: f.write(music_data) print(music_path_name,'下载成功') 9、构建主函数 #主函数 def main(): name = input('请输入歌名:') url = 'music.163/#/search/m/?s=' + name + '&type=1' music_name=get_music_names(url) musice_singer=get_music_singers(url) music_id=get_music_ids(url) music_url= 'music.163/song/media/outer/url?id=' + music_id + '.mp3' browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) browser.get(url=music_url) sleep(0.5) page_text = browser.execute_script("return document.documentElement.outerHTML") browser.quit() soup = bs4.BeautifulSoup(page_text, 'html.parser') music_source=soup.select("video source") source_url=music_source[0].get('src') download_music(source_url,music_name,musice_singer) 10、完整代码 import requests import os import bs4 from selenium import webdriver from time import sleep from selenium.webdriver.chrome.options import Options headers = { 'user - agent': 'Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 80.0.3987.116Safari / 537.36' } #创建文件夹 if not os.path.exists('D:/网易云音乐'): os.mkdir('D:/网易云音乐') # 实现无可视化界面(固定写法) chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') #获取音乐id def get_music_ids(url): # 初始化browser对象 browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) # 访问该url browser.get(url=url) # 由于网页中有iframe框架,进行切换 browser.switch_to.frame('g_iframe') # 等待0.5秒 sleep(0.5) # 抓取到页面信 page_text = browser.execute_script("return document.documentElement.outerHTML") # 退出浏览器 browser.quit() # 提取音乐的id,名字,歌手名 soup = bs4.BeautifulSoup(page_text, 'html.parser') music_ids = soup.select("div[class='td w0'] a") # 音乐id music_id = music_ids[0].get("href") music_id = music_id.split('=')[-1] return music_id #获取音乐名称 def get_music_names(url): browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) browser.get(url=url) browser.switch_to.frame('g_iframe') sleep(0.5) page_text = browser.execute_script("return document.documentElement.outerHTML") browser.quit() soup = bs4.BeautifulSoup(page_text, 'html.parser') music_names = soup.select("div[class='td w0'] a b") # 音乐名字 music_name=music_names[0].get("title") return music_name #获取歌手名称 def get_music_singers(url): browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) browser.get(url=url) browser.switch_to.frame('g_iframe') sleep(0.5) page_text = browser.execute_script("return document.documentElement.outerHTML") browser.quit() soup = bs4.BeautifulSoup(page_text, 'html.parser') music_singers = soup.select("div[class='td w1'] a") music_singer=music_singers[0].string return music_singer #下载音乐 def download_music(url,name,singer): response=requests.get(url=url,headers=headers) music_data=response.content music_path_name='{}_{}.mp3'.format(name,singer) music_path='D:/网易云音乐/'+music_path_name with open(music_path,'wb') as f: f.write(music_data) print(music_path_name,'下载成功') #主函数 def main(): name = input('请输入歌名:') url = 'music.163/#/search/m/?s=' + name + '&type=1' music_name=get_music_names(url) musice_singer=get_music_singers(url) music_id=get_music_ids(url) music_url= 'music.163/song/media/outer/url?id=' + music_id + '.mp3' browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) browser.get(url=music_url) sleep(0.5) page_text = browser.execute_script("return document.documentElement.outerHTML") browser.quit() soup = bs4.BeautifulSoup(page_text, 'html.parser') music_source=soup.select("video source") source_url=music_source[0].get('src') download_music(source_url,music_name,musice_singer) if __name__ =='__main__' : main() section4:参考博文及学习链接 1、chromedriver与chrome版本映射表及下载地址参考博文1:点击此处获取
2、selenium安装参考博文2:点击此处获取
3、Selenium的视频讲解参考B站视频:点击此处获取
4、思路参考参考博文3:点击此处获取 (我是看了这个博主的文章,才有的明确思路)
section5:代码不足(说明)因为是学习笔记的原因,我并没有准备爬取太多,但仍然存在一点小问题。因为打开音乐外链时,音乐会自动播放,所以使用selenium打开音乐外链,也会有这个问题。因此,在下载音乐的过程中,会听到音乐声。 而以我现在的能力,我能想到的是,使用
browser.find_element_by_xpath('这里填暂停播放按钮的xpath').click()但是这种方法我没试过,想尝试的小伙伴可以试一下。
section6:代码完善:基于section5的不足(完善时间:2021.02.08)今天有个博主告诉我,找到外链之后可以直接用requests下载。 但是这个方法我尝试过,下载下来的文件是107kb的文件,根本不是想要的音乐文件! 然后又出现了转折,那个博主成功下载了音乐文件,就用我写的代码(你说气不气),但是改动了一个地方----请求头。 下面是两个请求头的比较:
#这是我的请求头 headers = {'user - agent': 'Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 80.0.3987.116Safari / 537.36'} #这是那个博主的请求头 headers= {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER'}我也尝试过把“LBBROWSER”这个我不知道是啥的东西,加到自己的请求头后面,结果依然不尽我意。 随后,我又对外链的网页进行分析,发现了这个情况: 对于304我第一次碰到,没有处理经验,大家可以自己去搜一下解决方案,我这里给大家分享一个我能看懂的文章(我用了文章里面那个处理过的请求头成功了):传送门 那我把完善后的全部代码发一下吧,其实就改动了主函数那里一点点地方,但是解决了后台音乐声音问题。
import requests import os import bs4 from selenium import webdriver from time import sleep from selenium.webdriver.chrome.options import Options #一个博主给的headers,不知道为啥他的就行,自己的就不行(被注释掉的是自己的) # headers = { # 'user - agent': 'Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 80.0.3987.116Safari / 537.36' # } headers= {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER'} #创建文件夹 if not os.path.exists('D:/网易云音乐'): os.mkdir('D:/网易云音乐') # 实现无可视化界面(固定写法) chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') #获取音乐id def get_music_ids(url): # 初始化browser对象 browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) # 访问该url browser.get(url=url) # 由于网页中有iframe框架,进行切换 browser.switch_to.frame('g_iframe') # 等待0.5秒 sleep(0.5) # 抓取到页面信 page_text = browser.execute_script("return document.documentElement.outerHTML") # 退出浏览器 browser.quit() # 提取音乐的id,名字,歌手名 soup = bs4.BeautifulSoup(page_text, 'html.parser') music_ids = soup.select("div[class='td w0'] a") # 音乐id music_id = music_ids[0].get("href") music_id = music_id.split('=')[-1] return music_id #获取音乐名称 def get_music_names(url): browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) browser.get(url=url) browser.switch_to.frame('g_iframe') sleep(0.5) page_text = browser.execute_script("return document.documentElement.outerHTML") browser.quit() soup = bs4.BeautifulSoup(page_text, 'html.parser') music_names = soup.select("div[class='td w0'] a b") # 音乐名字 music_name=music_names[0].get("title") return music_name #获取歌手名称 def get_music_singers(url): browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) browser.get(url=url) browser.switch_to.frame('g_iframe') sleep(0.5) page_text = browser.execute_script("return document.documentElement.outerHTML") browser.quit() soup = bs4.BeautifulSoup(page_text, 'html.parser') music_singers = soup.select("div[class='td w1'] a") music_singer=music_singers[0].string return music_singer #下载音乐 def download_music(url,name,singer): response=requests.get(url=url,headers=headers) music_data=response.content music_path_name='{}_{}.mp3'.format(name,singer) music_path='D:/网易云音乐/'+music_path_name with open(music_path,'wb') as f: f.write(music_data) print(music_path_name,'下载成功') #主函数 def main(): name = input('请输入歌名:') url = 'music.163/#/search/m/?s=' + name + '&type=1' music_name=get_music_names(url) musice_singer=get_music_singers(url) music_id=get_music_ids(url) music_url= 'music.163/song/media/outer/url?id=' + music_id + '.mp3' download_music(music_url,music_name,musice_singer) if __name__ =='__main__' : main() section7:代码完善(基于代码的规范性)(完善时间:2021.02.09)基于PEP8规则和一些语句可以复用,完善代码如下: (注意:这里的请求头部分仍不满足PEP8规则)
import requests import os import bs4 from selenium import webdriver from time import sleep from selenium.webdriver.chrome.options import Options headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER' } # 创建保存音乐的文件夹 path = os.path.join('D:/网易云音乐') if not os.path.exists(path): os.mkdir(path) # 输入音乐名 name = input('请输入歌名:') # 实现无可视化界面(固定写法) chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') # 初始化browser对象 browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) # 获取音乐的id、名字,歌手名 def get_id_name_singer(url): browser.get(url=url) browser.switch_to.frame('g_iframe') sleep(0.5) page_text = browser.execute_script("return document.documentElement.outerHTML") soup = bs4.BeautifulSoup(page_text, 'html.parser') music_ids = soup.select("div[class='td w0'] a") # 音乐id music_id = music_ids[0].get("href") music_id = music_id.split('=')[-1] music_names = soup.select("div[class='td w0'] a b") # 音乐名字 music_name = music_names[0].get("title") music_singers = soup.select("div[class='td w1'] a") # 歌手名 music_singer = music_singers[0].string return music_id, music_name, music_singer # 下载音乐 def download_music(url, song_name, singer): response = requests.get(url=url, headers=headers) music_data = response.content music_path_name = '{}_{}.mp3'.format(song_name, singer) music_path = path + music_path_name with open(music_path, 'wb') as f: f.write(music_data) print(music_path_name, '下载成功') # 主函数 def main(): url = 'music.163/#/search/m/?s=' + name + '&type=1' music_id, music_name, music_singer = get_id_name_singer(url) music_url = 'music.163/song/media/outer/url?id=' + music_id + '.mp3' download_music(music_url, music_name, music_singer) if __name__ == '__main__': main() browser.quit()版权声明:本文标题:python爬虫轻松下载某易云音乐 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686911906a117407.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论