Python爬取酷我音乐

news2024/11/18 21:46:25

🎈 博主:一只程序猿子

🎈 博客主页:一只程序猿子 博客主页

🎈 个人介绍:爱好(bushi)编程!

🎈 创作不易:喜欢的话麻烦您点个👍和

🎈 欢迎访问我的主页(点我直达)

🎈 除此之外您还可以通过个人名片联系我 👉👉👉👉👉👉

额滴名片儿

目录

1.介绍

2.步骤分析

(1)登录酷我音乐

(2)找到歌曲信息

(3)找到歌曲播放地址

3.代码实现

4.效果展示 


1.介绍

        本文将介绍Python爬虫如何实现爬取网页版酷我的榜单音乐并下载到本地!

2.步骤分析

(1)登录酷我音乐

        这一步的目的是获取cookie!

(2)找到歌曲信息

        找到榜单中歌曲的列表 ,获取歌曲的关键信息!

         这里我们只需要其中的三个值:

1.arltist: 歌手名

2.name: 歌曲名

3.rid: 歌曲id

歌手名和歌曲名用来给爬取到的.mp3文件命名,通过歌曲id获取歌曲的播放地址

(3)找到歌曲播放地址

        随便点击播放一首歌,就可以找到这个数据包!

        大致流程如下:

        由于CSDN的版权限制,有很多截图我都被迫删掉了,可能你暂时无法理解如何找到的请求地址和参数!但是在代码中你可以看到每个url的作用!

        现在我们已经找到了歌曲信息和歌曲的播放地址,就可以用python的requests构建请求了! 

3.代码实现

import time

import requests

# cookies,登录账号后很容易在请求头中找到自己的cookies
cookies = "换成你的"
# 构造请求头
headers = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    # 'Cookie': 'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1702174705; _ga=GA1.2.1391285853.1702174705; _gid=GA1.2.1100462848.1702174705; uname3=%u6C34%u661F.; t3kwid=460193919; userid=460193919; websid=1549266808; pic3="http://img4.kuwo.cn/star/userhead/19/42/1553316725038_460193919.jpg"; t3=qq; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1702174821; _ga_ETPBRPM9ML=GS1.2.1702174705.1.1.1702174820.49.0.0; Hm_Iuvt_cdb524f42f0cer9b268e4v7y735ewrq2324=rb5taJN4jXjZc7tSBEQkHNDJ2aRmMNxj',
    'Referer': 'https://kuwo.cn/rankList',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'Secret': 'f1b6c63024e699d98cd436c1b1e8527a9ce1cdb90f538ef8f2698760e9071b0503035497',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
}

# 获取歌曲的播放地址
def get_play_url(song_id):
    # 请求时需要的参数
    params = {
        'mid': song_id,
        'type': 'music',
        'httpsStatus': '1',
        # 'reqId': 'ff7eebd1-9706-11ee-bb7a-9939365fab80',
        'plat': 'web_www',
        'from': '',
    }
    # 设置最大尝试次数,因为有时候网络连接不稳定可能会请求不到数据,需要重试
    max_try = 3
    for i in range(max_try):
        try:
            response = requests.get('https://kuwo.cn/api/v1/www/music/playUrl',
                                    params=params, cookies=cookies, headers=headers)
            code = response.json()['code']
            break
        except:
            code = -1
            time.sleep(1)

    if code == 200:
        play_url = response.json()['data']['url']
    else:
        play_url = ""

    return play_url


# 获取歌曲的歌曲名,歌手名,歌曲id的信息
def get_song_info(page):
    # 请求时需要的参数
    params = {
        'bangId': '93',
        'pn': page,
        'rn': '20',
        'httpsStatus': '1',
        # 'reqId': 'e8516040-9702-11ee-bb7a-9939365fab80',
        'plat': 'web_www',
        'from': '',
    }

    response = requests.get('https://kuwo.cn/api/www/bang/bang/musicList',
                            params=params, cookies=cookies, headers=headers)

    music_list = response.json()['data']['musicList']
    for music in music_list:
        singer = music['artist']
        song_name = music['name']
        song_id = music['rid']
        play_url = get_play_url(song_id)
        # print(singer, song_name, song_id, play_url)
        # 判断播放地址是否不为空
        if play_url:
            song_content = requests.get(url=play_url, headers=headers,cookies=cookies).content
            # 保存歌曲的二进制数据,以"歌曲名称-歌手名"的命名方式保存
            with open(f'data/{song_name}-{singer}.mp3', 'wb') as f:
                f.write(song_content)
                print(f'已下载------{song_name}\n')
        else:
            # 播放地址为空时输出以下内容
            print(f'{song_name} 为付费内容,请下载酷我音乐客户端后付费收听!\n')

        time. Sleep(1)

4.效果展示 

缺点: 有些歌需要vip账号才能获取到播放地址,建议用vip账号的cookies爬取! 

优点: 凡是可以下载的歌都是完整版的,和某狗的一分钟试听不同!

注意:本教程仅供学习交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1302720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker入门指南:从基础到实践

在当今软件开发领域,Docker已经成为一种不可或缺的工具。通过将应用程序及其依赖项打包成轻量级的容器,Docker实现了开发、测试和部署的高度一致性。本文将深入研究Docker的基本概念,并通过详细的示例代码演示如何应用这些概念于实际场景中。…

【Qt开发流程】之UI风格、预览及QPalette使用

概述 一个优秀的应用程序不仅要有实用的功能,还要有一个漂亮美腻的外观,这样才能使应用程序更加友善、操作性良好,更加符合人体工程学。作为一个跨平台的UI开发框架,Qt提供了强大而且灵活的界面外观设计机制,能够帮助…

moviepy基本参数用法大全

阅读本文档的前置说明: 本文档用于讲解Python的moviepy库的自带函数的用法,主要目的是讲一下每个函数的每个参数的含义,无需一开始就全部掌握,粗略看一下就行,可以在后面自己开发过程,遇到不会用的函数再回…

[Linux基础知识]页表

文章目录 1.页表 环境变量2.进程 1.页表 环境变量 一个分页存储管理系统中,地址长度为 32 位,其中页号占 8 位,则页表长度是 页号即页表项的序号,总共占8个二进制位,意味着页表项的个数就是2^8 在CPU和物理内存之间进行…

Axure官方软件安装、汉化保姆级教程(带官方资源下载)

1.下载汉化包 百度云链接:https://pan.baidu.com/s/1lluobjjBZvitASMt8e0A_w?pwdjqxn 提取码: jqxn 2.解压压缩包 3.安装Axure 进行安装 点击next 打勾,然后next, 默认是c盘,修改成自己的文件夹(不要什么都放c盘里…

STM32MP157D-DK1开发板固件烧录

本篇介绍STM32MP157D-DK1开发板如何烧录官方固件。 1 开发板基础硬件介绍 1.1 常用接口 板子上的各种接口功如下,本篇固件烧录,主要用的接口包括: CN6:供电接口B2:复位按键CN11:ST-LINK USB&#xff08…

STM32F407-14.1.0-01高级定时器简介

TIM1 和 TIM8 简介 高级控制定时器(TIM1 和 TIM8)包含一个 16 位自动重载计数器,该计数器由可编程预分频器驱动。 此类定时器可用于各种用途,包括测量输入信号的脉冲宽度(输入捕获),或者生成输出…

WooCommerce商城个人微信支付网关 适合个人微信收款

点击获取WooCommerce商城个人微信支付网关 适合个人微信收款原文https://gplwp.eastfu.com/product/woocommerce-ge-ren-wei-xin-zhi-fu-wang-guan-shi-he-ge-ren/ 个人微信支付网关接口,无需提现,100%资金安全,官方清算,金额无限…

外包干了2年,技术退步明显...

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

Linux系统---基于Pipe实现一个简单Client-Server system

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、题目要求 Server是一个服务器进程,只能进行整数平方运算。Client要计算一个整数的平方的平方的平方,即…

【MATLAB】基于CEEMD分解的信号去噪算法(基础版)

代码的使用说明 【MATLAB】基于CEEMD分解的信号去噪算法(基础版) 代码流程图 代码效果图 获取代码请关注MATLAB科研小白的个人公众号(即文章下方二维码),并回复CEEMD去噪 本公众号致力于解决找代码难,写代…

简单实现Spring容器(六) 实现AOP机制

阶段5: // 1.编写自己的Spring容器,实现扫描包,得到bean的class对象. // 2.扫描将 bean 信息封装到 BeanDefinition对象,并放入到Map. // 3.初始化单例池并完成getBean() createBean()方法 // 4.完成依赖注入(如果创建某个Bean对象,存在依赖注入,需要进行bean组装操作) // 5.b…

12.11QSS优化界面——对话框

完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面 如果账号和密码不匹配&#xf…

c语言为什么要引入变量

大家好,今天给大家介绍c语言为什么要引入变量,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 C语言引入变量的原因主要是为了存储数据并且方便后续的操作和计算。 变…

深入解析C++中的虚函数和虚继承:实现多态性与继承关系的高级特性

这里写目录标题 虚函数虚函数实现动态绑定虚继承抽象类 虚函数 虚函数是在C中用于实现多态性的一种特殊函数。它通过使用关键字"virtual"进行声明,在基类中定义,可在派生类中进行重写。虚函数允许在运行时根据对象的实际类型来调用相应的函数…

FTR223限时回归?经典三花再加金翅膀,CL500特别款亮相

FTR223可以说是非常经典的一款本田小攀爬车型了,之前我还有幸玩过一段时间,最近本田在泰国车展上展出了CL500的特别版,其中FTR223纪念版的版画让人眼前一亮,经典的白、红、蓝三色搭配让人眼前一亮。 CL500这台车在国内今年刚上市&…

开关量防抖滤波器(梯形图和SCL源代码)

模拟量防抖超限报警功能块请查看下面文章链接: https://rxxw-control.blog.csdn.net/article/details/133969425https://rxxw-control.blog.csdn.net/article/details/133969425 1、开关量防抖滤波器 2、防抖滤波 3、梯形图代码

设计模式(二)-创建者模式(5)-建造者模式

一、为何需要建造者模式(Builder)? 在软件系统中,会存在一个复杂的对象,复杂在于该对象包含了很多不同的功能模块。该对象里的各个部分都是按照一定的算法组合起来的。 为了要使得复杂对象里的各个部分的独立性,以及…

透析跳跃游戏

关卡名 理解与贪心有关的高频问题 我会了✔️ 内容 1.理解跳跃游戏问题如何判断是否能到达终点 ✔️ 2.如果能到终点,如何确定最少跳跃次数 ✔️ 1. 跳跃游戏 leetCode 55 给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表…

轻松构建超市管理小程序

随着科技的发展,越来越多的超市开始使用管理系统来提高效率、提升顾客体验和管理库存。如果你也想要为自己的超市打造一个便捷、高效的小程序,下面将为你提供一些帮助。 首先,你需要打开乔拓云第三方平台。在这个平台上,你可以轻松…