python爬虫:爬取酷狗音乐榜单中的音乐信息并存储到MySQL(附源码)

目录

  • 具体思路
  • 代码部分
    • 获取歌曲名称和歌手
    • 获取歌曲播放页的url
    • 获取音乐下载地址
    • 将获取到的音乐信息添加到MySQL中
  • 完整代码

获取酷狗音乐榜单中的音乐信息,这里我以“网络红歌榜”为例

在这里插入图片描述
获取榜单中的 “音乐名称”,“歌手”,“音乐下载地址”,并将这些信息存储到MySQL数据库中,最后完成的效果图如下:
在这里插入图片描述
在这里插入图片描述

具体思路

查看榜单的源代码,我们可以得到歌曲播放页的url,歌曲名称和歌手
在这里插入图片描述
获取歌曲名称和歌手

所以我们可以直接在源代码中将歌曲名称和歌手提取出来

获取歌曲下载地址

进入到音乐播放页,F12查看一下
在这里插入图片描述
进入到播放页查看源代码竟然能够看到歌曲的下载地址,这样一来,事情就变得简单了,直接使用播放页的url进行爬取但就是获取不到这个地址,原本以为是哪里出了问题,结果右键查看源代码,源代码中压根就没有这个url

所以要注意的是,虽然这里能够看到音乐的下载地址,但是当你右键查看源代码时是看不到的,因为这里的下载地址是动态添加进去的不是事先写进去的,看来还是想的太过简单了

既然在这里获取下载地址不行,那我们就换一种途径,在网页的全部文件中搜索下载地址的部分关键字,我们可以得到这个文件
在这里插入图片描述
在这里插入图片描述
展开这个文件我们可以得到音乐的下载地址
在这里插入图片描述
既然可以从这个文件中获取到歌曲的下载地址,那我们接下来就可以对这个文件的url进行分析
在这里插入图片描述
乍一看似乎没有什么规律,但是我们可以对其进行缩减,只保留最关键的部分,经过反复的测试,文件的url可以缩减为这三个部分的组成
在这里插入图片描述
这个文件的url可以写成:

https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash=???&album_id=???

那我们现在要获取的就是每首歌曲的hash值和album_id值

再次查看榜单的源代码,在最后我们可以看到一条重要数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这条数据中就包含了榜单中每首歌曲的hash值和album_id值,所以我们可以通过这条数据将我们需要的值提取出来,然后将其组合成url,如图:
在这里插入图片描述
在这里插入图片描述
访问我们合成的url就可以获取到歌曲的下载地址了

代码部分

获取歌曲名称和歌手

# 榜单网页url
music_list_url = "https://www.kugou.com/yy/rank/home/1-23784.html?from=rank"
# 榜单网页源代码
music_list_html = requests.get(music_list_url).text# 获取歌手和歌曲名
def get_music_name():element = etree.HTML(music_list_html)# @title是提取li标签中title属性的内容  获取歌曲名称和歌手music_list_name_info = element.xpath('//div[@class="pc_temp_songlist "]/ul/li/@title')return music_list_name_info

获取歌曲播放页的url

# 榜单网页url
music_list_url = "https://www.kugou.com/yy/rank/home/1-23784.html?from=rank"
# 榜单网页源代码
music_list_html = requests.get(music_list_url).text# 获取存储音乐信息的网页url 存储到列表中 返回值为列表
def get_music_info_url():soup = BeautifulSoup(music_list_html,features="lxml")script = soup.find_all('script')[-1]# print(script)# print(type(script))# 查找符合正则表达式的字符串 此时script变量为bs4格式 我们需要将其转化为字符串格式info = re.findall(r'\[.*\]',str(script))[1]# print(info)# 替换符合正则表达式的字符串info = re.sub(r'\[|\]',"",info)# print(type(info))# 分割符合正则表达式的字符串info = re.split(r'\},\{',info)# print(info)for i in range(len(info)):# 获取hash属性值hash = re.findall(r'H.*?,',info[i])[0].split('"')[2]# 获取album_id属性值album_id = re.findall(r'album_id.*?,',info[i])[0].split(":")[1].replace(",","")# print(album_id)if len(hash) > 0 and len(album_id) > 0:music_info_url = "https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash=" + hash + "&album_id=" + album_idelse:print(str(i) + "  " + "为空")# 将音乐信息网页地址存储到列表中music_info_url_list.append(music_info_url)return music_info_url_list

获取音乐下载地址

# 获取音乐下载地址
def get_music_download_url():# 使用请求头 不然获取不到音乐信息headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36","cookie": "kg_mid=5177dda4cc5327932ceb0652b3abbdf4; kg_dfid=2AveiS1FiBds3dWdin1RsaQ6; kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e; Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1611227172; Hm_lpvt_aedee6983d4cfc62f509129360d6bb3d=1611237914"}# 循环得到的存储音乐信息的网页urlfor music_info_url in music_info_url_list:music_info_html = requests.get(music_info_url,headers=headers).text# print(music_info_url)# print(music_info_html)# 获取音乐下载地址music_download_url = re.findall(r'play_url.*?\.mp3',music_info_html)[0].split('"')[-1].replace("\\","")# print(music_download_url)# 将播放地址添加到列表中music_download_url_list.append(music_download_url)return music_download_url_list

将获取到的音乐信息添加到MySQL中

# 将获取到的数据添加到数据库中
def put_info_to_mysql():# 连接数据库db = pymysql.connect("localhost","root","root","musicsystem")# 创建指针cursor = db.cursor()for i in range(len(music_download_url_list)):# print(music_name_list)# 歌曲名称name = music_name_list[i].split(" - ")[1]# 歌手singer = music_name_list[i].split(" - ")[0]# 播放地址url = music_download_url_list[i]print(name + "  " + singer + "  " + url)# SQL语句sql = """insert into musicsystem_info(Name,Singer,Time,Url) values ('{}','{}','{}','{}')""".format(name,singer,"2020.1.22",url)try:# 执行SQL语句cursor.execute(sql)# 提交db.commit()print("执行成功")except:# 添加失败时回滚db.rollback()print("执行失败")# 关闭数据库连接db.close()

命令解释:

连接数据库		db = pymysql.connect("数据库地址(本地就是localhost)", "用户名", "密码", "数据库名称")
获取游标对象		cursor = db.cursor()
所要执行的SQL语句		sql = """INSERT INTO 表名(列名,列名)VALUES ("插入的数据","插入的数据")"""
执行SQL语句		cursor.execute(sql语句)
提交到数据库执行		db.commit()
关闭数据库连接		db.close()

完整代码

import requests
# 导入xpath模块
from lxml import etree
import re
from bs4 import BeautifulSoup
# 连接数据库的模块
import pymysqlmusic_info_url_list = []
music_download_url_list = []# 榜单网页url
music_list_url = "https://www.kugou.com/yy/rank/home/1-23784.html?from=rank"
# 榜单网页源代码
music_list_html = requests.get(music_list_url).text# 获取歌手和歌曲名
def get_music_name():element = etree.HTML(music_list_html)# @title是提取li标签中title属性的内容  获取歌曲名称和歌手music_list_name_info = element.xpath('//div[@class="pc_temp_songlist "]/ul/li/@title')return music_list_name_info# 将音乐名称和歌手 存储到列表中
music_name_list = get_music_name()# 获取存储音乐信息的网页url 存储到列表中 返回值为列表
def get_music_info_url():soup = BeautifulSoup(music_list_html,features="lxml")script = soup.find_all('script')[-1]# print(script)# print(type(script))# 查找符合正则表达式的字符串 此时script变量为bs4格式 我们需要将其转化为字符串格式info = re.findall(r'\[.*\]',str(script))[1]# print(info)# 替换符合正则表达式的字符串info = re.sub(r'\[|\]',"",info)# print(type(info))# 分割符合正则表达式的字符串info = re.split(r'\},\{',info)# print(info)for i in range(len(info)):# 获取hash属性值hash = re.findall(r'H.*?,',info[i])[0].split('"')[2]# 获取album_id属性值album_id = re.findall(r'album_id.*?,',info[i])[0].split(":")[1].replace(",","")# print(album_id)if len(hash) > 0 and len(album_id) > 0:music_info_url = "https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash=" + hash + "&album_id=" + album_idelse:print(str(i) + "  " + "为空")# 将音乐信息网页地址存储到列表中music_info_url_list.append(music_info_url)return music_info_url_list# 获取音乐下载地址
def get_music_download_url():# 使用请求头 不然获取不到音乐信息headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36","cookie": "kg_mid=5177dda4cc5327932ceb0652b3abbdf4; kg_dfid=2AveiS1FiBds3dWdin1RsaQ6; kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e; Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1611227172; Hm_lpvt_aedee6983d4cfc62f509129360d6bb3d=1611237914"}# 循环得到的存储音乐信息的网页urlfor music_info_url in music_info_url_list:music_info_html = requests.get(music_info_url,headers=headers).text# print(music_info_url)# print(music_info_html)# 获取音乐下载地址music_download_url = re.findall(r'play_url.*?\.mp3',music_info_html)[0].split('"')[-1].replace("\\","")# print(music_download_url)# 将播放地址添加到列表中music_download_url_list.append(music_download_url)return music_download_url_list# 将获取到的数据添加到数据库中
def put_info_to_mysql():# 连接数据库db = pymysql.connect("localhost","root","root","musicsystem")# 创建指针cursor = db.cursor()for i in range(len(music_download_url_list)):# print(music_name_list)# 歌曲名称name = music_name_list[i].split(" - ")[1]# 歌手singer = music_name_list[i].split(" - ")[0]# 播放地址url = music_download_url_list[i]print(name + "  " + singer + "  " + url)# 执行的SQL语句sql = """insert into musicsystem_info(Name,Singer,Time,Url) values ('{}','{}','{}','{}')""".format(name,singer,"2020.1.22",url)try:# 执行SQL语句cursor.execute(sql)# 提交db.commit()print("执行成功")except:# 添加失败时回滚db.rollback()print("执行失败")# 关闭数据库连接db.close()# 主函数
def main():get_music_info_url()get_music_download_url()put_info_to_mysql()if __name__ == '__main__':main()

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

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

相关文章

KeePass CVE-2023-32784:进程内存转储检测

KeePass CVE-2023-32784:进程内存转储检测 KeePass 是一种流行的开源密码管理器,可以在 Windows、Mac 或 Linux 上运行。该漏洞允许从正在运行的进程的内存中以明文形式提取主密钥。主密钥将允许攻击者访问所有存储的凭据 强烈建议更新到KeePass 2.54以…

Python爬虫之爬取酷狗音乐歌曲

Python爬虫之爬取酷狗音乐歌曲 1.安装第三方库 在Python的语言库中, 分为Python标准库和Python的第三方库. Python标准库是在你安装Python的时候已经包含在了安装目录下, 而Python第三方库需要使用Python的包管理pip来安装. 在本次代码中, 我们需要用到request库. requests翻…

(统计学习方法|李航)第四章 朴素贝叶斯算法——贝叶斯估计

贝叶斯估计方法: 计算男女时只有两个值,所以K2 贝叶斯估计就是拉普拉斯平滑 估计方法:为什么叫做贝叶斯估计呢? 例题: 重新回顾以下朴素贝叶斯: 对他求导,求出最大值 得到了色i他的估计值&…

数据归一化:优化数据处理的必备技巧

文章目录 🍀引言🍀数据归一化的概念🍀数据归一化的应用🍀数据归一化的注意事项与实践建议🍀代码演示🍀在sklearn中使用归一化🍀结语 🍀引言 在当今数据驱动的时代,数据的…

制造业为什么要建设数字化供应链

数字化让越来越多的人走向了线上的世界,让那些拥有线上产品或提供线上服务的企业提供了更多流量。 但与此同时,传统制造业遭受了沉重的打击,考虑到防疫要求,很多工厂长期处于人手不足的状态,生产制造效率大幅降低&…

架构设计第八讲:架构 - 理解架构的模式2 (重点)

架构设计第八讲:架构 - 理解架构的模式2 (重点) 本文是架构设计第8讲:架构 - 理解架构的模式2,整理自朱晔的互联网架构实践心得, 他是结合了 微软给出的云架构的一些模式的基础上加入他自己的理解来总结互联网架构中具体的一些模式。我在此基…

设计师常用的几个资源网站,你都知道吗?

如果你是一名设计师,你的电脑上可能存储了很多的设计网站,但是碎玉一些新手小白来说,刚接触设计的时候应该怎样进行绘制呢?难道要自己去一笔一笔的进行绘制吗?下面给大家分享几个设计网站,一起来看看吧&…

设计师常用的几个资源网站分享,再也不用为没有素材发愁

如果你是一名设计师,你的电脑上可能存储了很多的设计网站,但是碎玉一些新手小白来说,刚接触设计的时候应该怎样进行绘制呢?难道要自己去一笔一笔的进行绘制吗?下面给大家分享几个设计网站,一起来看看吧&…

设计师常用的几个资源网站,你都知道几个呢?

如果你是一名设计师,你的电脑上可能存储了很多的设计网站,但是碎玉一些新手小白来说,刚接触设计的时候应该怎样进行绘制呢?难道要自己去一笔一笔的进行绘制吗?下面给大家分享几个设计网站,一起来看看吧&…

Windows下在线图片处理工具

图片处理工具Photopea Photopea是一个在线版的图片编辑器, 与Photoshop的界面非常相似, 经常被人们误以为是Photoshop的在线网页版, Photopea可以满足绝大多数图片修改需求, 更有趣的是, Photopea支持打开Sketch格式,对经常与Sketch打交道的设计师, 非常有诱惑力! 更多介绍 &…

这些开发好工具,你知道几个?

文章目录 这些超级好的软件,你知道吗?!文档类Microsoft OfficeWPS OfficeTyporanotepadsublime Text3或2 工具类截图工具:snipaste虚拟机:Oracle VM VirtualBox笔记类:Microsoft OneNote在线大纲&#xff1…

ubuntu虚拟机磁盘压缩:vmware-toolbox-cmd命令实现

压缩之前,虚拟机占用磁盘空间 虚拟机必须已经安装vmware-tool,运行如下命令,参看磁盘的挂载点 sudo /usr/bin/vmware-toolbox-cmd disk list $sudo /usr/bin/vmware-toolbox-cmd disk list [sudo] password for lkmao: Shrink disk is disab…

C++初阶之一篇文章教会你list(理解和使用)

list(理解和使用) 什么是list特点和优势基本操作示例用法与其他序列式容器(如 std::vector 和 std::deque)相比,std::list 显著的区别和优势成员类型 list构造函数1. default (1)2. fill (2)3.range (3)4. copy (4) li…

如何学习大数据

文章目录 每日一句正能量前言一、什么是大数据二、大数据的应用领域三、社会对大数据的人才需求四、大数据的学习路线后记 每日一句正能量 多数人认为,一旦达到某个目标,人们就会感到身心舒畅。但问题是你可能永远达不到目标。把快乐建立在还不曾拥有的事…

【雕爷学编程】Arduino动手做(54)---大按键微动按钮模块3

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

华为手机相册怎么镜像翻转_手机视频剪辑软件怎么制作电子相册_

2020年11月09日 10:25 作者:黄页 编辑:黄页 生活中我们经常会利用手机把身边的美好事物拍摄下来,用以记录生活中的点点滴滴。然而你是否想过将这些照片以动态的形式展示给身边的亲朋好友,让图片“动”起来呢?下面就教你手机视频剪…

华为堡垒机_浪潮无线分析,华为云堡垒机

预期结果步骤2在第6次输入错误用户名/密码时,页面无法正常打开,且被测设备有相关日志记录。测试结果口通过口部分通过口未通过口未测试备注4.2.16敏感数据泄密防护项目:Web攻击防护分项目:敏感数据泄密防护用例编号:版…

华为手机设置页面黑色_华为手机微信猫和老鼠主题皮肤怎么设置 ?超个性主题等你来设置!...

阅读本文前,请您先点击上面的蓝色字体,再点击“关注”,这样您就可以继续免费收到文章了。每天都有分享,完全是免费订阅,请放心关注。 …

华为手机大小尺寸一览_超实用!3招教你用华为手机玩转类型学摄影!

怎么样把照片发朋友圈最吸睛? 每个人都有展示图片的喜好和想法 但往往按照系列发一整组照片,容易收获更多点赞 ▼ 像这样我们常看到的系列图,有一个学名 叫做 “摄影类型学” 名字听起来有没有觉得很高级 但是操作起来却并不难 今天我们就来讲…

学以致用:python面向对象和PyEcharts的完美混合技

文章目录 学习目标数据案例分析数据内容需求分析参考代码data_define.pyfile_define.pymain.py 学习目标 使用面向对象思想完成数据读取和处理基于面向对象思想重新认知第三方库使用(PyEcharts) 数据案例分析 数据内容 1月份数据是普通文本,使用逗号分割数据记录&…