python初级爬虫实战:我是怎么用python下载音乐的

news2024/11/29 22:56:18

今天分享的内容是如何使用python下载歌曲和歌词信息,文章涉及内容主要为了帮助大家学习python技能,请大家合规合理使用。

如果你正在学习Python爬虫,但是找不到方向的话可以试试我这一份学习方法和籽料呀!点击 领取(不要米米)

首先,我们想要批量下载歌曲,那么需要找到下载源,我这里使用的是某钟音乐网,首页是这样的

在这里插入图片描述

我们去爬取数据,通常都是分为几个步骤:分析目标网站的特征–>获取里列表–>通过列表中的数据–>获取具体的内容。

  • 分析目标网站特征:

  • 1)歌手信息:

我们刷新首页,抓包的时候,看到这个接口是有返回接口数据的,但很快就会发现,这个接口只返回了18个歌手的信息,我们不能通过这个方式来得到歌手的信息;经过分析网站上的多个页面,我并没有找到现成的接口可以获取到。

在这里插入图片描述

既然没有现成的接口,那么我们能不能通过解析页面html源码来得到歌手信息呢?答案是可以的,我在页面的html源码中找到了歌手的标签。可以通过bs4这个第三方库来解析html源码得到。(这里不扩展,等后面有空了,再专门写一篇关于bs4的文章吧)

在这里插入图片描述

  • 2)获取歌手下的歌曲信息:

嘿嘿,这个接口妥妥的有现成的,我已经给大家找到了。我们只需要拼接接口地址,加上歌手名字就可以得到该歌手在该网站上的所有歌曲了。

在这里插入图片描述

  • 3)获取歌曲的下载地址:

这个也是有现成接口地址的,我们只需要将歌曲id替换成步骤2)中得到的歌曲id即可。

在这里插入图片描述

  • 4)获取歌词信息:

这个也是有现成接口地址的,我们只需要将歌曲id替换成步骤2)中得到的歌曲id即可。

在这里插入图片描述

  • 代码编写

好了,现在所需的准备工作我们已经做好了,接下来就是开始写代码了。

  • 1)根据歌手名字获取歌曲信息

# 获取张碧晨的所有歌曲信息
url = "https://music-api.tonzhon.com/songs_of_artist/张碧晨"

def get_music_info(url):
    music_url = get_url(url).json()
    songs_list = music_url['songs']
    music_info = {}
    if len(songs_list) > 0:
        for item in songs_list:
            name = item['name']
            id = item['newId']
            music_info[name] = id
    return music_info

music_info = get_music_info(url)

在这里插入图片描述

  • 2)使用歌曲id获取歌曲下载地址

base_url = "https://music-api.tonzhon.com/song_file/{}"
def get_music_download_url(music_info_list,base_url):
    for name,id in music_info_list.items():
        url = base_url.format(id)
        response = get_url(url).json()
        if response:
            try:
                download_url = response['data']
                print(f"歌曲: {name}\n下载地址:https:{download_url}")
            except Exception as e:
                print(f"歌曲【{name}】已下线,地址:{url}")

music_info_list = get_music_info(music_url)
get_music_download_url(music_info_list,base_url)

在这里插入图片描述

  • 3)封装下载文件的函数,后续放在步骤2)中调用

# 下载歌曲
def download_music(url,file_name):
    response = get_url(url)
    print(response)
    with open(file_name,'wb') as f:
        f.write(response.content)

  • 4)封装下载歌词文件的函数,然后再步骤2)中调用

# 下载歌词
def get_music_lyric(id,name):
    lrc_base_url = "https://music-api.tonzhon.com/lyrics/{}"
    lrc_url = lrc_base_url.format(id)
    response = get_url(lrc_url).json()
    try:
        lrc_content = response['data']
        lrc_name = "E:\\音乐下载\\"+name + '.lrc'
        with open(lrc_name,'w') as f:
            f.write(lrc_content)
        print(f"【{name}】的歌词下载完成")
    except Exception as e:
        print(e)
        print(f"【{name}】的歌词内容不存在,地址:{lrc_url}")
  • 5)将所有代码精简整合到一起

import time
import requests


def get_url(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
    }
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        return response
    except Exception as e:
        print(e)
        return None

# 根据歌手名字获取歌曲信息
def get_music_info(geshou_name):
    url = "https://music-api.tonzhon.com/songs_of_artist/{}".format(geshou_name)
    music_url = get_url(url).json()
    songs_list = music_url['songs']
    music_info = {}
    if len(songs_list) > 0:
        for item in songs_list:
            name = item['name']
            id = item['newId']
            music_info[name] = id
    return music_info

# 下载歌曲
def download_music(url,file_name):
    response = get_url(url)
    with open(file_name,'wb') as f:
        f.write(response.content)
# 下载歌词
def get_music_lyric(id,name):
    lrc_base_url = "https://music-api.tonzhon.com/lyrics/{}"
    lrc_url = lrc_base_url.format(id)
    response = get_url(lrc_url).json()
    try:
        lrc_content = response['data']
        lrc_name = "E:\\音乐下载\\"+name + '.lrc'
        with open(lrc_name,'w') as f:
            f.write(lrc_content)
        print(f"【{name}】的歌词下载完成")
    except Exception as e:
        print(e)
        print(f"【{name}】的歌词内容不存在,地址:{lrc_url}")

def get_music_main(music_info_dict):
    for name,id in music_info_dict.items():
        # 先下载歌曲
        song_base_url = "https://music-api.tonzhon.com/song_file/{}"
        url = song_base_url.format(id)
        response = get_url(url).json()
        if response:
            try:
                download_url = "https:"+response['data']
                print(f"歌曲: {name}\n下载地址:{download_url}")
                file_name = "E:\\音乐下载\\"+name + '.mp3'
                download_music(download_url,file_name)
                print(f"【{name}】的歌曲文件下载完成")
            except Exception as e:
                print(f"【{name}】歌曲不存在,地址:{url}")

        # 再下载歌词文件
        get_music_lyric(id,name)

if __name__ == '__main__':
    # 根据歌手名字获取歌曲信息,存放入字典
    music_info_dict = get_music_info("张碧晨")
    # 根据歌曲信息下载歌曲和歌词
    get_music_main(music_info_dict)

执行效果如下:

在这里插入图片描述

在这里插入图片描述

欢迎感兴趣的小伙伴长期关注、点赞、转发

最后 如果你对Python感兴趣的话,可以试试我整理的这份Python全套学习资料,【点击这里】领取!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
Python所有方向的学习路线图,清楚各个方向要学什么东西
100多节Python课程视频,涵盖必备基础、爬虫和数据分析
100多个Python实战案例,学习不再是只会理论
华为出品独家Python漫画教程,手机也能学习
历年互联网企业Python面试真题,复习时非常方便******

在这里插入图片描述

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

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

相关文章

北斗对我们普通人的生活有什么影响?

自北斗卫星导航系统(BDS)全面覆盖全球以来,北斗导航在我们日常生活中的重要性与日俱增。本文将详细探讨北斗导航系统如何从方方面面改变我们普通人的生活。 1. 精准定位:现代生活的基石北斗系统最显而易见的影响体现在精准定位和导…

Linux:进程的概念,进程相关函数

一、进程的概念 1.进程 进程是系统进行资源分配和调度的一个独立单元,它是操作系统结构的基础。进程是程序的一次执行过程,包含了程序代码、当前活动、系统资源(如CPU、内存、文件等)的使用情况等信息。每个进程都有自己独立的内…

2024最强CSS基础知识大全(含代码)

CSS 什么是 CSS CSS(Cascading Style Sheets) 指层叠样式表,样式定义如何显示 HTML 的样式,样式通常存储在样式表中,把样式添加到 HTML5 中,是为了解决内容与表现分离的问题,外部样式表可以极大提高工作效率&#xf…

三勾点餐系统|支持多端发布,方便二次开发

版本号1.7更新日志 新增:腾讯地图key设置(更新后请设置key) 新增:支付宝小程序登录和支付 新增:前端点餐时选择门店 新增:前端点餐页面优惠活动显示 新增:H5修改手机号 新增:H…

conda不是内部或外部命令

conda不是内部或外部命令 是anaconda环境变量没有添加到系统环境变量 解决办法 找到anaconda安装目录,添加以下系统环境变量 注意事项 pycharm在选择anaconda创建虚拟环境时,使用的是_conda.exe

2000-2023年逐年最大NDVI数据集(500m)

植被指数(NDVI, Normalized Difference Vegetation Index)可以准确反映地表植被覆盖状况。目前,NDVI时序数据已经在各尺度区域的植被动态变化监测、土地利用/覆被变化检测、宏观植被覆盖分类和净初级生产力估算等研究中得到了广泛的应用。 中…

YOLO入门教程(二)——OpenVINO™部署YOLO模型与异步推理实现150FPS+实时检测【含教程源码 + 环境配置】

目录 引言前期准备Step1 pt格式转onnx格式Step2 创建工程文件并安装NuGet PackageStep3 预处理API部署YOLO模型Step4 前处理推理后处理Step5 异步推理参考博客 引言 YOLO(You Only Look Once)作为一个目标检测算法,其调用的接口为Python语言…

架空防静电地板的贴面面层有哪些

很多机房装修都会用到架空防静电地板,架空防静电地板由贴面、基材、支架横梁系统组成,那么架空防静电地板的贴面都有哪些呢?一起来看看~ 防静电地板常用贴面面层有3种: 1、PVC防静电贴面面层;2、HPL防静电贴面面层;3、瓷砖防静电贴面面层 1、…

《治疗前磁共振成像显示的结直肠癌患者的结外扩展及其预后价值》| 文献速递-基于深度学习的癌症风险预测与疾病预后应用

Title 题目 Extranodal Extension at Pretreatment MRI and the Prognostic Value for Patients with Rectal Cancer 《治疗前磁共振成像显示的结直肠癌患者的结外扩展及其预后价值》 Background 背景 Detection of extranodal extension (ENE) at pathology is a poor pr…

什么是ERP,ERP系统主要包括哪些功能?

ERP的定义 ERP,全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统,它通过信息技术手段,将企业的各个业务流程和资源管理进行整合,以提高企业的运营效率和管理水平。 ERP的核心价值在于“开源节流”…

linux 中docker git 容器磁盘占满如何解决

1.问题描述 git之前还使用ok,突然出现访问500 错误,懵圈了 2.问题排查 1. 服务器查看,服务正常,没有异常出现。 2. 查找资料,需要查看是否磁盘已经满了果然使用df-h 后显示磁盘已经满了,且容器和本地都…

Java异常捕获与处理:深入理解与实践

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

ATGM332D-F8S:高集成度单北斗多频车载航位推算模块规格书

车载航位 推算 模块 描述 : 是一种在车载导航系统中广泛应用的自主导航算法模块,主要用于弥补GPS或GNSS(全球导航卫星系统)在信号遮蔽环境下的定位不足。 车载航位推算模块通过收集来自车辆上各种传感器(如陀螺仪传感器…

【JAVA入门】Day24 - 排序算法

【JAVA入门】Day24 - 排序算法 文章目录 【JAVA入门】Day24 - 排序算法一、冒泡排序二、选择排序三、插入排序四、快速排序4.1 递归4.2 快速排序 排序,是把混乱的数据排成从小到大或从大到小。 排序一共有十种左右,它们是:冒泡排序、…

Salesforce 发布开源大模型 xGen-MM

xGen-MM 论文 在当今 AI 技术飞速发展的时代,一个新的多模态 AI 模型悄然崛起,引起了业界的广泛关注。这个由 Salesforce 推出的开源模型—— xGen-MM,正以其惊人的全能特性和独特优势,在 AI 领域掀起一阵旋风。那么,x…

书生大模型(第3期)基础岛第5关--XTuner 微调个人小助手认知

XTuner微调前置基础 1 基本概念 在进行微调之前,我们需要了解一些基本概念。 1.1 Finetune简介 微调(fine-tuning)是一种基于预训练模型,通过少量的调整(fine-tune)来适应新的任务或数据的方法。 微调…

VUE3 无法修改 el-dialog 样式

用下面这种方式修改 el-dialog 组件样式一点作用都没有,正常用这种方式修改 el 的el-button、tab等都是百试不爽的。最后找到解决办法和原因。在el-dialog外面套一层div /deep/ .el-dialog { background: url(https://lanhu-oss.lanhuapp.com/7cbd761cd26f7b255086…

Cesium for Unreal——第四节 Transition Between Locations on the Globe 在两个位置间平稳飞行

文章目录 1. 创建或打开上次的项目2. 蓝图3. 构建一个新的关卡 Globel Level,添加墨尔本地形数据4. 选择蓝图文章参考与Cesium官网 Transition Between Locations on the Globe 1. 创建或打开上次的项目 学习之前,需要先安装——创建项目——运行 UE ,点击跳转 2. 蓝图 蓝图…

AI工具集合

AI工具集官网 | 1000 AI工具集合,国内外AI工具集导航大全

QT下显示自己派生的QWidget界面(提升为)

在实际开发过程中,我们可能有这样的需求,自己绘制一个仪表盘界面,然后将其贴到主界面上方。 这个时候就会用到“提升为”这个功能,该功能目的是将QWidget提升为自己派生的QWdiget子类,具体操作为,在主界面…