Python爬虫:逆向分析酷我音乐请求参数(支持SQ超品音质)
发布日期:2021-05-24 14:34:53 浏览次数:18 分类:精选文章

本文共 2345 字,大约阅读时间需要 7 分钟。

前言

本篇博文旨在分享学习逆向分析过程中对酷我音乐请求参数的实践感悟,内容仅供学习与交流,请勿用于非法用途。版权声明:未经本人授权,禁止转载。

在对和其他音乐爬虫项目有所经验的基础上,本文将从参数分析的角度剖析酷我音乐的爬取实现方式,目标是通过输入歌名或歌手名,获取对应音乐信息并下载到本地指定目录。以下是本次案例选取的歌曲——《下辈子不一定还能遇见你》。

1. 请求分析

音乐URL参数的分析相对直接。通过Postman等工具观察可以发现,音乐链接通常包含在一个JSON响应体内,通过该链接即可下载对应音乐。请求方式为GET,参数主要有两个:

  • rid:表示歌曲ID,用于唯一标识音乐文件。
  • br:表示音乐的比特率,音质越高,比特率越大,具体对应的音质等级为:128k(流畅音质)、192k(高品音质)和320k(超品音质)。

经实验发现,通过修改br参数的值,可以直接下载到不同音质的音乐文件。这一发现颇感兴奋,稍加语音信号处理技术即可实现!


2. 获取参数

接下来的关键在于确定参数的获取方式。首先需分析音乐的URL请求,确定参数的作用和意义。对于搜索功能而言,基础的GET请求已经包含了必备的参数,如搜索关键词(key)、每页的结果数(pn)等。

通过进一步观察发现,搜索页面的URL结构较为友好,检索结果也较为全面。为获取单曲信息,可以直接获取歌曲ID并将其替换至音乐下载链接中。例如:

http://www.kuwo.cn/url?rid=12345&br=320k


3. 完整代码

结合以上分析,以下是一个实现音乐爬取的Python脚本:

import requestsimport jsonimport refrom urllib import parseclass KuWoMusic:    def __init__(self):        self.base_url = 'http://www.kuwo.cn'        self.headers = {            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',            'Referer': 'http://www.kuwo.cn/search/list'        }    def get_song_info(self, rid):        url = f'{self.base_url}/url?rid={rid}&br=192k'        response = requests.get(url, headers=self.headers)        response.raise_for_status()        return json.loads(response.text)    def download_song(self, song_url, download_path):        response = requests.get(song_url, headers=self.headers)        file_name = os.path.join(download_path, song_info['name'] + '.mp3')        with open(file_name, 'wb') as f:            f.write(response.content)            print(f"下载完成:{song_info['name']}")def main():    search_key = input("请输入歌名或歌手名字: ")    search_key = parse.quote(search_key)    search_url = f'{self.base_url}/api/www/search/searchMusicBykeyWord?key={search_key}&rn=30'    response = requests.get(search_url, headers=self.headers)    search_result = json.loads(response.text)['data']['list']        while True:        input_index = eval(input("请输入要下载的序号(输入-1退出):"))        if input_index == -1:            break        song_info = search_result[input_index]        rid = song_info['rid']        song_url = f'{self.base_url}/url?rid={rid}&br=320k'        download_path = './downloads'        os.makedirs(download_path)        self.download_song(song_url, download_path)

结束语

虽然酷我音乐对爬虫机制有一定防护,但通过简单的参数改装就能轻松获取不同音质的音乐文件。话说回来,爬虫技术以防止破坏网站正常运行为前提,合理使用请谨慎!

上一篇:Linux入门学习
下一篇:常用排序算法比较

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年04月30日 14时31分59秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

基于Arduino的ESP32-S3 + 1.3寸OLED(4pin) 2023-01-23
基于Arduino的ESP32-S3连接OneNET云平台实战指南(二)——Token生成 2023-01-23
基于Arduino的ESP32-S3连接OneNET云平台实战指南(四)——ESP32-S3连接OneNET云平台的订阅主题与发布主题、消息(数据流) 2023-01-23
基于Arduino的ESP32-S3 + HCSR04(4pin)超声波传感器 2023-01-23
基于Arduino的ESP32-S3 +DS18B20(3pin) 2023-01-23
基于任意单片机的继电器模块应用全解析 2023-01-23
基于Arduino的ESP32-S3 + 水浊度传感器 2023-01-23
基于Arduino的ESP32-S3连接OneNET云平台实战指南(三)——OneNET云平台的订阅主题与发布主题、消息的格式(数据流) 2023-01-23
基于Arduino的ESP32-S3连接OneNET云平台实战指南(一)——数据流模型的设计与参数配置 2023-01-23
《街机厅里的printf大冒险:当像素小人与格式化字符串共舞》 2023-01-23
Git 常用命令清单(整理且详细) 2023-01-23
Servlet 简介 2023-01-23
乒乓球问题 2023-01-23
线程、多线程和线程池面试专题 2023-01-23
Trae国内版发布,中国首款AI 原生IDE 正式上线,配置Doubao-1.5-pro,支持切换满血版DeepSeek 模型 2023-01-23
java定时器,留着用 2023-01-23
多线程,高并发 2023-01-23
linux(CENTOS)系统各个目录的作用详解 2023-01-23
科技前沿:React 组件之间通信的新模式与实践 2023-01-23
程序员的出路:超强引流与职业发展的新时代 2023-01-23