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

今天分享的内容是如何使用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] = idreturn music_infomusic_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 requestsdef 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 responseexcept 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] = idreturn 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.mzph.cn/bicheng/52133.shtml

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

相关文章

汽车IVI中控OS Linux driver开发实操(二十四):I2C设备驱动的编写

概述: 在Linux驱动中I2C系统中主要包含以下几个成员: I2C adapter(即I2C适配器,用来控制各种I2C从设备,其驱动需要完成对适配器的完整描述,最主要的工作是需要完成i2c_algorithm结构体。这个结构体包含了此I2C控制器的数据传输具体实现,以及对外上报此设备所支持的功…

0.91寸OLED迷你音频频谱

一、简介 音频频谱在最小0.91寸OLED 屏幕上显示,小巧玲珑 二、应用场景 本模块为音频频谱显示模块,用来获取声音频谱并展示频谱,跟随音乐声音律动 三、产品概述 基于主控芯片设计的将声音采集分析频谱,显示到0.91寸OLED的功能…

我们如何将数据输入到神经网络中?

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 下面我拿识别美女的例子来给大家介绍如何将美女的图片数据输入到神经网络中。 此例中,待输入的数据是一张图像。为了存储图像…

Java中String类的经典问题、错误认知以及归纳总结

在学习过程中对String类的理解反复刷新,以此文记之,做归纳总结,也适合新手避坑。 以实用性考虑,环境为Java 8 以及 之后版本。 String类相比其它类特殊的地方在于有一个字符串常量池(StringTable),里面存着字面量的引…

Hackademic.RTB1靶场实战【超详细】

靶机下载链接:https://download.vulnhub.com/hackademic/Hackademic.RTB1.zip 一、主机探测和端口扫描 nmap 192.168.121.0/24 ip:192.168.121.196 端口:22、80 二、访问80端口 发现target可点击 点击后跳转,页面提示目标是读取到 key.txt 文件 fin…

Enhancing Octree-Based Context Models for Point Cloud Geometry Compression 论文笔记

1. 论文基本信息 发布于: IEEE SPL 2024 2. 创新点 分析了基于 one-hot 编码的交叉熵损失函数为什么不能准确衡量标签与预测概率分布之间的差异。介绍了 ACNP 模块,该模块通过预测占用的子节点数量来增强上下文模型的表现。实验证明了ACNP模块在基于八…

【Java】 力扣 最大子数组和

目录 题目链接题目描述思路代码 题目链接 53.最大子数组和 题目描述 思路 动态规划解析: 状态定义: 设动态规划列表 dp ,dp[i] 代表以元素 nums[i] 为结尾的连续子数组最大和。 为何定义最大和 dp[i] 中必须包含元素 nums[i] :…

前端css动画缩放transform: scale()

transform: scale(2) scale等比例放大 大于1是放大 小于1是缩小 负值是倒着放大 scaleX scaleY 可以单独设置只在x轴y轴放大 改变中心点放大的位置 左上 left top 左下 left bottom 左中 left center 右上 …

Python之列表的基本使用

列表 一、什么是列表二、创建 Python 列表三、二维列表四、索引和切片五、运算符六、列表的函数(1)len(列表名)(2)min(列表名)(3)max(列表名)(4)s…

探索顶级PDF水印API:PDFBlocks(2024年更新)

引言 在一个敏感信息常常面临风险的时代,能够轻松高效地保护文档的能力至关重要。PDF水印已成为企业和个人寻求保护其知识产权、确保文件保密性的基本工具。 PDFBlocks 文字水印 API是什么? PDFBlocks API 提供了一个强大的解决方案,用于在…

如何使用博达网站群管理平台的树状导航

1 介绍 由于网站建设需要,需在首页的左边竖栏部分使用树状导航。我又过了一遍《网站群管理平台用户手册》,没发现如何在网站的首页设置树状导航组件。昨天,我之所以在创建树状导航上不知所措,是因为平台本身有一些误导&#xff0…

如何用Java SpringBoot+Vue搭建校内跑腿业务系统?实战教程解析

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

ASM实例的SPILE 存储在ASM的磁盘组上时,集群要如何去获取SPFILE并启动ASM实例?(1)

从11g R2 开始,ASM spfile 会自动存储在安装集群软件时创建的第一个磁盘组中,一般为OCR磁盘组。由于投票盘/OCR 存储在 ASM 上,因此需要在节点上启动 ASM。要启动 ASM,需要其 SPFILE 。但 SPFILE 仅位于 ASM 磁盘组上。集群是如何…

【html+css 绚丽Loading】 - 000009 五行逆流珠

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 &#x1f495…

[000-01-018].第3节:Linux环境下ElasticSearch环境搭建

我的后端学习笔记大纲 我的ElasticSearch学习大纲 1.Linux系统搭建ES环境: 1.1.单机版: a.安装ES-7.8版本 1.下载ES: 2.上传与解压:将下载的tar包上传到服务器software目录下,然后解压缩:tar -zxvf elasticsearch-7…

Excel求和方法之

一 SUM(),选择要相加的数,回车即可 二 上面的方法还不够快。用下面这个 就成功了 三 还有一种一样快的 选中之后,按下Alt键和键(即Alt)

深度学习------------------卷积神经网络(LeNet)

目录 LeNet网络手写的数字识别MNIST总结卷积神经网络(LeNet) 问题 LeNet网络 手写的数字识别 MNIST ①输入的是:3232的image ②放到一个55的卷积层里面(为什么是5?因为32-x128,∴x5)&#xff0c…

计算机毕业设计PySpark+Flask bilibili弹幕情感分析 B站视频数据可视化 B站爬虫 机器学习 深度学习 NLP自然语言处理 大数据毕业设计

### 开题报告:基于PySpark和Flask的B站弹幕情感分析系统 #### 一、研究背景 在网络视频平台的用户互动中,弹幕(Danmaku)作为一种实时评论的形式,已经成为观众表达观点和情感的重要方式。尤其是在B站(哔哩…

Go Roadmap-Basics中文笔记

Go Roadmap-Basics 地址:https://roadmap.sh/golang 简介:Github star No.6 学习路线 Go 中译版 Learn the Basics Go特点:静态类型,运行速度快,编译语言,编译速度快,自动垃圾回收&#xff…

【GH】【EXCEL】P4: Chart

文章目录 data and chartdonut chart (radial chart)Radial Chart bar chartBar Chart line chartLine Chart Scatter ChartScatter Chart Surface ChartSurface Chart Chart DecoratorsChart Decorators Chart GraphicsChart Graphics data and chart donut chart (radial cha…