文章目录

  • 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)

section1: 声明

1、只支持能在某易云音乐平台在线播放的音乐!!!
对于音乐人,我们要支持他们,支持正版版权!!!
2、因为是学习笔记,所以只下载搜到的歌曲列表的第一首音乐,需要下载更多的,可以自行修改一下代码。
3、本文如有侵权,请联系我删除文章!!!

section2 :下载链接分析

某易云在线播放每首歌曲时,都有一个外链地址,这是不会变的,跟每首歌的唯一一个id绑定在一起,而每首歌audio文件的URL如下:

url = 'http://music.163.com/song/media/outer/url?id=' + 歌曲的id+ '.mp3'

那么id是什么呢?id应该怎么获取呢?
其实很简单,当你在网易云打开一个音乐时,就能很明显地发现:(本文以《小酒窝》为例)

Q:那怎么获取不同音乐的id呢?
A:换首歌即可呀。
Q:那获取每首歌的这个页面有什么规律可循嘛?
A:当然!
请看:

这是根据歌曲名搜索得到的页面,我们搜几首不同的歌,看看变化。
《小酒窝》

《用心良苦》

《Scarborough Fair》

通过这三个例子,我们就能提取出一个通用的URL模板:

url='https://music.163.com/#/search/m/?s= ' + 歌曲的名字 + ' &type=1'

这样,我们就可以通过一个歌曲的名字获取到一个页面,在这个页面能获取歌曲的ID,然后通过ID和之前的一个URL模板组合起来,就能得到一个全新的URL。
以《小酒窝》为例,得到一个URL:

http://music.163.com/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)# 访问该urlbrowser.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")  # 音乐idmusic_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].stringreturn music_singer

8、构建下载音乐的函数

#下载音乐
def download_music(url,name,singer):response=requests.get(url=url,headers=headers)music_data=response.contentmusic_path_name='{}_{}.mp3'.format(name,singer)music_path='D:/网易云音乐/'+music_path_namewith open(music_path,'wb') as f:f.write(music_data)print(music_path_name,'下载成功')

9、构建主函数

#主函数
def main():name = input('请输入歌名:')url = 'https://music.163.com/#/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= 'http://music.163.com/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 Optionsheaders = {'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)# 访问该urlbrowser.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")  # 音乐idmusic_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].stringreturn music_singer#下载音乐
def download_music(url,name,singer):response=requests.get(url=url,headers=headers)music_data=response.contentmusic_path_name='{}_{}.mp3'.format(name,singer)music_path='D:/网易云音乐/'+music_path_namewith open(music_path,'wb') as f:f.write(music_data)print(music_path_name,'下载成功')#主函数
def main():name = input('请输入歌名:')url = 'https://music.163.com/#/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= 'http://music.163.com/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)# 访问该urlbrowser.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")  # 音乐idmusic_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].stringreturn music_singer#下载音乐
def download_music(url,name,singer):response=requests.get(url=url,headers=headers)music_data=response.contentmusic_path_name='{}_{}.mp3'.format(name,singer)music_path='D:/网易云音乐/'+music_path_namewith open(music_path,'wb') as f:f.write(music_data)print(music_path_name,'下载成功')#主函数
def main():name = input('请输入歌名:')url = 'https://music.163.com/#/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= 'http://music.163.com/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 Optionsheaders = {'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")  # 音乐idmusic_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].stringreturn music_id, music_name, music_singer# 下载音乐
def download_music(url, song_name, singer):response = requests.get(url=url, headers=headers)music_data = response.contentmusic_path_name = '{}_{}.mp3'.format(song_name, singer)music_path = path + music_path_namewith open(music_path, 'wb') as f:f.write(music_data)print(music_path_name, '下载成功')# 主函数
def main():url = 'https://music.163.com/#/search/m/?s=' + name + '&type=1'music_id, music_name, music_singer = get_id_name_singer(url)music_url = 'http://music.163.com/song/media/outer/url?id=' + music_id + '.mp3'download_music(music_url, music_name, music_singer)if __name__ == '__main__':main()browser.quit()

python爬虫轻松下载某易云音乐相关推荐

  1. python网易云_用python爬虫爬取网易云音乐

    标签: 使用python爬虫爬取网易云音乐 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页版找一下你想要听的歌曲点击进去.按键盘F12打开网页调试工具,点击Ne ...

  2. python爬虫----爬取网易云音乐

    使用python爬虫爬取网易云音乐 目录 使用python爬虫爬取网易云音乐 需要使用的模块 开始工作 运行结果 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页 ...

  3. python爬虫爬取网易云音乐歌曲_Python网易云音乐爬虫进阶篇

    image.png 年前写过一篇爬网易云音乐评论的文章,爬不了多久又回被封,所以爬下来那么点根本做不了什么分析,后面就再改了下,加入了多线程,一次性爬一个歌手最热门50首歌曲的评论,算是进阶版了- 思 ...

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

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

  5. Python爬虫实战:网易云音乐爬取!

    本次目标 爬取网易云音乐 https://music.163.com/ PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击即可加入 环境 ...

  6. Python爬虫—爬取网易云音乐【热歌榜】歌曲的精彩评论(写入txt文本文件或者MySQL数据库)

      最近在学Python爬虫,看了Blibili爬取网易云音乐评论的视频,视频中是将一首歌的评论存入json文件,我在此代码的基础上扩展了三点:     1.爬取热歌榜200首歌曲的精彩评论:     ...

  7. python爬虫api接口,网易云音乐python爬虫api接口

    抓包能力有限,分析了一下网易云音乐的一些api接口,但是关于它很多post请求都是加了密,没有弄太明白.之前在知乎看到过一个豆瓣工程师写的教程,但是被投诉删掉了,请问有网友fork了的吗?因为我觉得他 ...

  8. Python爬虫实战之“网易云音乐绝对互粉”

    2019独角兽企业重金招聘Python工程师标准>>> 这里是列表文本启动fiddler,打开网易晕音乐官网,进入个人中心粉丝模块 这里是列表文本查看在fiddler中抓到的包,进行 ...

  9. python爬虫爬取网易云音乐歌曲_如何用爬虫获取网易云音乐歌单中的歌曲?

    --------------------------------- 泻药,以我抓取了307835首网易云音乐的歌单歌曲的经验,讲一下这个问题. 喜欢用Github的可以直接看我的项目源码,代码简单.具 ...

  10. python爬虫-爬取网易云音乐歌曲评论

    本文借鉴了@平胸小仙女的知乎回复 https://www.zhihu.com/question/36081767 以及@lyrichu的博客 https://www.cnblogs.com/lyric ...

最新文章

  1. 如何从 Ubuntu 中彻底卸载 Google Chrome
  2. DeepMind开源AlphaFold,蛋白质预测模型登上《Nature》
  3. Oracle中日期Date类型格式的转化
  4. qt显示rgba8888 如何改 frame_Qt音视频开发2-vlc回调处理
  5. JAVA入门_多线程_邮局派发信件
  6. html5app大赛,Anyoffice -HTML5大赛 悦心(基于H5开发安卓音乐app)-项目总结
  7. 子集和问题 算法_子集问题 主要是去重算法
  8. html校园生活模板,学校生活日记模板集锦9篇
  9. CS231n Assiganment#1-KNN 代码解析
  10. OCCT示例学习笔记3--Modeling项目
  11. syzlang语法编写案例学习 —— Looking for Remote Code Execution bugs in the Linux kernel
  12. NC系统与一卡通集成解决方案(一)
  13. 【研报笔记】光大技术择时系列1:基于阻力支撑相对强度(RSRS)的市场择时
  14. 把中文目录名称修改成英文首字母大写或中文拼音目录
  15. 键盘输入一个长方形的两个边长,输出该长方形的周长、面积和对角线。要用到Math类提供的数学方法。
  16. Unity 实现游戏中多相机屏幕CutIn效果
  17. scrum立会报告+燃尽图(第三周第三次)
  18. 表单提交-form提交和ajax提交
  19. 应用案例 | 2014款宝马116i车偶尔冷车难起动
  20. C++ 中vector的使用方法

热门文章

  1. dcp 1519 linux驱动下载,dcp1519驱动
  2. 测试工程师/测试开发面试题整理
  3. 电视盒子线刷固件教程B860AV2.1-A-M-T版
  4. sierpinski三角形的维数_分形维数算法
  5. excel计算机快捷键大全,Excel使用教程 Excel表格快捷键与功能键大全
  6. flex布局及flex实现常见的前端布局
  7. 【基础学习】操作系统学习笔记 - 内存管理:内存使用与分段、内存分区与分页、多级页表、快表、段页式内存管理的实现、内存的换入换出
  8. Android热修复之Sophix初探
  9. 缺少计算机所需的介质程序,UEFI安装Win8提示缺少所需的介质驱动程序怎么办?...
  10. Insyde uefi 隐藏设置_固件级安全,微软安全工具新增UEFI扫描功能