python实战:破解网易云音乐params及encSecKey加密参数实现歌单内任意歌曲下载(附参数分析过程)

本文详细解析了网易云音乐API的工作原理,包括如何解密请求参数以获取歌曲播放链接,以及如何利用requests-html库提取歌单信息,最终实现自动化下载歌曲。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**1、**首先我们打开歌单内的任意一首歌曲,在该页面下打开chrome的开发者工具后切换到Network后重新刷新页面,找到请求到该歌曲播放源的URL,如下图:
在这里插入图片描述
找到后切换到Headers,可以看到其为一个post请求,URL为:‘https://music.163.com/weapi/song/enhance/player/url?csrf_token=’ ,从上图可知这个URL返回的是json,里面包含的是歌曲的信息及其MP3播放链接,请求时携带的参数为params及encSecKey,为了找到该歌曲播放源的URL,我们需解密params及encSecKey。

**2、**以encSecKey为关键词进行全局搜索,找到加密该参数的文件,如下图:
在这里插入图片描述
接着找到该参数是如何生成的,从下图可以看到其与bYd2x有关,为了得到该encSecKey我们需知道bYd2x这个值是如何生成的,所以我们按下图的操作设置断点,然后重新刷新页面进行调试。
在这里插入图片描述
按上图操作后,我们可以看到bYd2x这个函数中有四个参数,其中i8a与我们的歌曲id有关,另外三个参数我们也需要找出来,通过多次调试后可以看到其返回的值其实都是固定值,调试结果如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过上面分析得知其需要的参数值后,我们需找到window.asrsea这个函数是如何执行的,这样才能从其返回值里得到encText(即params)和encSecKey。在调试模式下我们按下图将鼠标悬浮到这个函数上可知它其实就是d函数,因此我们需找到d函数的定义。
在这里插入图片描述
**3、**按上图将鼠标悬浮到这个函数上后我们点击悬浮框上的蓝色字体可以到达定义d函数的位置,如下图所示:
在这里插入图片描述
从上图可知d函数与a函数,b函数及c函数有关,且excText的值由b函数加密了两次,因此我们要分别找到这些函数的定义并写成python语言,同样的我们在var h={}这行打上断点后重新刷新页面。首先我们找到a函数,其定义如下图:
在这里插入图片描述
可以看到它其实是在一堆字符串中随机找出16个字符串,将其写成python为:

get_i=execjs.compile(r"""
    function a(a) {
        var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = 
<think>嗯,用户想用Python爬取网易云音乐的URL,我需要仔细想想怎么一步步教他。首先,得确认用户的目标是抓取歌曲的URL,可能涉及到网页分析、请求处理和解析数据。根据提供的引用,用户已经有一些参考资料,但可能需要更具体的指导。 首先,我应该考虑网易云音乐的网页结构。网易云音乐歌单歌曲信息可能加载方式不同,有些可能是动态加载的,特别是如果用户需要付费音乐的话。这时候可能需要用到Selenium或者分析XHR请求。不过根据引用[2]和[3],用户提到使用requests和Selenium,可能需要处理iframe或者动态内容。 然后,用户需要获取歌单或歌手页面的ID。根据引用[5],歌手ID可以通过官网搜索得到,歌单ID可能类似。比如,用户需要先确定要爬取的页面,比如某个歌单的URL,其中包含id参数。例如,歌单的URL结构是https://music.163.com/playlist?id=123456,这里的123456就是歌单ID。 接下来,爬虫的步骤可能包括发送HTTP请求,处理响应,解析页面内容。但网易云音乐的反爬措施可能比较严格,比如检查User-Agent,或者使用加密参数。这时候需要设置请求头,模拟浏览器访问。引用[2]提到使用requests和Selenium,可能需要处理JavaScript渲染的内容,或者直接找到数据接口。 另外,引用[3]和[4]中的代码示例显示,有些情况下需要用到Selenium,特别是当数据在iframe里或者通过AJAX加载时。例如,网易云音乐歌单页面可能将主要内容放在一个iframe中,这时候用普通的requests.get可能无法获取到数据,需要先定位到iframe的src或者使用Selenium来操作浏览器。 还有,解析部分可能需要用到BeautifulSoup或者Scrapy。例如,在获取到页面后,提取歌曲列表,每个歌曲的ID,然后构造歌曲的URL。或者,如果直接能获取到音频文件的URL,可能需要进一步处理,但通常网易云音乐的音频URL是加密的,直接爬取可能比较困难,这时候可能需要调用其内部API,或者使用第三方库。 此外,需要注意法律问题,引用[2]提到如果有侵权问题需要删除,所以用户需要确保遵守网易云音乐的服务条款,不要未经授权下载受版权保护的内容。 总结步骤可能是:1. 确定目标URL(歌单或歌手页面);2. 发送请求并处理反爬机制;3. 解析页面获取歌曲ID;4. 构造歌曲URL或调用API获取真实播放地址;5. 下载或保存URL。 可能还需要处理加密参数,比如引用[4]中的例子,可能需要处理加密的ID,或者通过API获取加密后的音乐文件地址。这时候可能需要分析网易云音乐的接口,找到如何生成参数,比如使用post请求,携带特定的参数,如paramsencSecKey,这可能需要逆向工程其JavaScript代码,但这比较复杂。 对于新手来说,可能更简单的方式是使用Selenium模拟浏览器操作,获取渲染后的页面内容,然后用BeautifulSoup解析。或者,找到网易云音乐公开的API接口,直接发送请求获取JSON数据,这样更高效。 比如,打开浏览器的开发者工具,在Network选项卡中查看XHR请求,找到返回歌曲数据的API接口,然后模拟这个请求。例如,歌单的接口可能是https://music.163.com/api/playlist/detail?id=歌单ID,返回JSON数据,里面包含歌曲列表,每个歌曲的ID,然后构造歌曲的URL为https://music.163.com/song?id=歌曲ID。 但实际中,网易云音乐的API可能有加密参数,需要处理。或者,可能需要带特定的headers,比如Referer和User-Agent,以及处理Cookies。 综上,给出一个可行的步骤:使用requests库,设置合适的headers,访问歌单页面,解析歌曲列表,提取歌曲ID,生成歌曲URL。可能需要处理iframe,或者直接使用API接口。同时注意反爬,比如频率限制,可能需要使用代理或延迟。</think>以下是根据引用内容整理的Python爬取网易云音乐URL实现方法: ### 一、实现步骤 1. **获取目标页面ID** - 歌单ID示例:`https://music.163.com/playlist?id=19xxxxx7`[^3][^5] - 歌手ID示例:`/artist?id=6452`[^5] 2. **配置爬虫环境** ```python import requests from bs4 import BeautifulSoup from selenium import webdriver # 动态页面需要 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } ``` 3. **处理动态内容(关键步骤)** ```python # 使用Selenium获取渲染后页面 driver = webdriver.Chrome() driver.get("https://music.163.com/playlist?id=歌单ID") driver.switch_to.frame('g_iframe') # 切入核心内容框架[^2] html = driver.page_source ``` 4. **解析歌曲数据** ```python soup = BeautifulSoup(html, 'lxml') songs = soup.select('.f-hide li a') for song in songs: song_name = song.text song_id = song['href'].split('=')[-1] song_url = f'https://music.163.com/song?id={song_id}' print(f'{song_name}: {song_url}') ``` ### 二、注意事项 1. **反爬机制处理** - 需要设置合法User-Agent - 控制请求频率(建议间隔2-3秒) - 动态页面必须使用Selenium切换iframe框架 2. **付费音乐限制** - 付费歌曲需要登录态Cookie - 真实音频地址需调用加密接口[^4] ### 三、完整代码示例 ```python import requests from bs4 import BeautifulSoup from selenium import webdriver def get_music_urls(playlist_id): driver = webdriver.Chrome() driver.get(f"https://music.163.com/playlist?id={playlist_id}") driver.switch_to.frame('g_iframe') soup = BeautifulSoup(driver.page_source, 'lxml') songs = [] for item in soup.select('.f-hide li a'): songs.append({ 'name': item.text, 'url': f"https://music.163.com/song?id={item['href'].split('=')[-1]}" }) driver.quit() return songs # 使用示例 print(get_music_urls("歌单ID")) # 替换实际歌单ID ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值