python爬取QQ音乐歌手歌单
1.实验内容:从QQ音乐中获取某个你喜欢的歌手的歌手清单。
详细内容:输出QQ音乐的歌曲清单,从QQ音乐中取得某个你喜欢的歌手的歌手清单。
例如:小红莓的歌曲清单。
目标是获取QQ音乐某位歌手的单曲清单,主要涉及到的库有:requests、json.(为什么用到json后续进行解答。)
2.实验步骤:
2.1.首先要了解QQ音乐网站的robots协议(安全)
发现只是禁止了播放列表,所以项目获取歌单可操作。
2.2.打开QQ音乐网页,查看页面详情,了解页面。
进入QQ音乐主页并输入任意的歌手。例如:搜索林俊杰。打开审查元素(快捷键为Ctrl+Shift+I),界面操作为:更多工具-->开发者工具
2.3.分析网页源代码Elements
发现无歌曲信息,无法使用BeautifulSoup,显示结果为空。为json类型需要引入json库进行获取内容。点击Network,查看数据是否在XHR,分析Name,查看Preview.发现数据在XHR中,查看Preview发现信息如下:
2.4.点击Headers,拿到相关的参数。
2.5.根据实际情况编写合适的代码进行实验操作
引用json库,添加fake_useragent包,基本实现指定歌手的查询,并将歌手的歌曲呈现出来。从网页源代码中获取重要信息如下:
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=10&w={}'
headers = {
'User-Agent': ua.random,
'cookie':'RK=LdWlHMsQ+b; ptcz=42785168e679b66b7913e09a4387fc94c5ad2d81419840eb33a502abc14ae6c6; pgv_pvid=4366402929; fqm_pvqid=ed1a5c76-5778-4d72-aa4f-389d94cd126e; ts_uid=886687551; fqm_sessionid=2b4a4a2f-b921-4e70-861d-54a608695f10; pgv_info=ssid=s5047316408; ts_refer=www.so.com/link; _qpsvr_localtk=0.49574447171587144; login_type=1; wxopenid=; tmeLoginType=2; psrf_qqaccess_token=D40E8A445E33FC38FB47291B44C03E96; qqmusic_key=Q_H_L_5Opuh_YbF8NbIlG-FqC_2ns2gXyWSTh_cplWyZPhEpyIWDVtQUGLwQQ; psrf_access_token_expiresAt=1656146941; psrf_qqunionid=93ABF9072A8734C330E108787CC182AE; uin=2363310076; wxunionid=; qm_keyst=Q_H_L_5Opuh_YbF8NbIlG-FqC_2ns2gXyWSTh_cplWyZPhEpyIWDVtQUGLwQQ; psrf_musickey_createtime=1648370941; qm_keyst=Q_H_L_5Opuh_YbF8NbIlG-FqC_2ns2gXyWSTh_cplWyZPhEpyIWDVtQUGLwQQ; psrf_qqopenid=900C2C2A46F36818FEB00C24A5EEC6B0; wxrefresh_token=; psrf_qqrefresh_token=8289BF671C8907272471F03D564F5A69; euin=owosoio5oenl7c**; ts_last=y.qq.com/n/ryqq/search',
'referer':'https://y.qq.com/'
}
简易版本以CSV形式呈现爬取结果,完整代码如下:
import requests # 请求 from fake_useragent import UserAgent import json print("请输入您想要爬取清单的歌手名:") name = input() ua = UserAgent() headers = { 'User-Agent': ua.random, 'cookie':'RK=LdWlHMsQ+b; ptcz=42785168e679b66b7913e09a4387fc94c5ad2d81419840eb33a502abc14ae6c6; pgv_pvid=4366402929; fqm_pvqid=ed1a5c76-5778-4d72-aa4f-389d94cd126e; ts_uid=886687551; fqm_sessionid=2b4a4a2f-b921-4e70-861d-54a608695f10; pgv_info=ssid=s5047316408; ts_refer=www.so.com/link; _qpsvr_localtk=0.49574447171587144; login_type=1; wxopenid=; tmeLoginType=2; psrf_qqaccess_token=D40E8A445E33FC38FB47291B44C03E96; qqmusic_key=Q_H_L_5Opuh_YbF8NbIlG-FqC_2ns2gXyWSTh_cplWyZPhEpyIWDVtQUGLwQQ; psrf_access_token_expiresAt=1656146941; psrf_qqunionid=93ABF9072A8734C330E108787CC182AE; uin=2363310076; wxunionid=; qm_keyst=Q_H_L_5Opuh_YbF8NbIlG-FqC_2ns2gXyWSTh_cplWyZPhEpyIWDVtQUGLwQQ; psrf_musickey_createtime=1648370941; qm_keyst=Q_H_L_5Opuh_YbF8NbIlG-FqC_2ns2gXyWSTh_cplWyZPhEpyIWDVtQUGLwQQ; psrf_qqopenid=900C2C2A46F36818FEB00C24A5EEC6B0; wxrefresh_token=; psrf_qqrefresh_token=8289BF671C8907272471F03D564F5A69; euin=owosoio5oenl7c**; ts_last=y.qq.com/n/ryqq/search', 'referer':'https://y.qq.com/' } url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=10&w={}' resp = requests.get(url.format(name), headers=headers) json_str = resp.text json_str = json_str[9:-1] json_dict = json.loads(json_str) songlist = json_dict['data']['song']['list'] f = open("list.csv", mode="w", encoding="utf-8") for song in songlist: print(song['albumname']) f.write(song['albumname']) f.write('\n')
2.6.通过代码进行演示运行结果
以周深为例:
3.实验分析:
(1)实验前要明确目标,本次是获取QQ音乐的某位歌手的歌单。熟悉网页->分析目标(策略:url格式(范围)、数据格式、网页编码)->编写代码->执行代码。
(2)网页的源码中,所有歌曲信息都在类名为mod_songlist的div浮层里面,类名为songlist_list的无序列表ul下,每个子元素li展示一个单曲,类名为songlist__album下的a标签,包含单曲的链接,名称和时长等。
(3)url链接管理器,采用集合数据结构来保存单曲链接,使用集合是因为多个单曲可能来自同一专辑(专辑网址一样),这样可以减少请求次数。这也是结果中歌曲呈现有重复,原因是来自于同一专辑,显示重复的其实是来自的专辑名称。
(4)json的理解:json 是用字符串的样式书写的列表或数组(也可以是列表和数组的嵌套)。json 是另一种组织数据的格式,长得和 Python 中的列表 / 字典非常相像。它和 html 一样,常用来做网络数据传输。它用字符串(文本)的方式上传字典/列表,是所有的语言都可以识别的最朴素的数据类型。因此json 数据就能实现,跨平台,跨语言工作。
在json格式下找到想要的内容。需要把它转化回列表/字典类型,然应用字典的键,列表的下标来找内容。在requests库的官方文档中,找到requests库中解决json的方法。将json解析之后,可以按照对列表和字典的操作完成数据的读取。
(5)user-agent(用户代理):使用爬虫爬取内容时,如果不修改user-agent,其会默认为python,会被很多服务器识别出来,可能会造成无法爬取的结果,而对于爬取某些特定信息,也要求你注明请求的来源,即referer 的内容。处理这些的方法需要将这些内容封装到一个字典里。
(6)由于网页限制显示只有十首歌曲,上面爬取到的只有十首歌曲的歌名或专辑名。
4.遇到的困难和解决点:
(i)实验前一定要对网页要足够熟悉,不熟悉无法进行细致的工作开展。
(ii)user-agent(用户代理)的认识与使用,需要找寻大量资料进行总结和应用。
(iii)网页源代码的熟悉,对各类查询操作熟悉的掌握和应用。
(iiii)URL以及Headers的准确查找和编程书写。json库的正确应用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)