python爬虫之爬取网易云音乐的歌曲图片和歌词
0.目录
1.分析页面
2.获取歌曲的id
3.获取歌曲信息
4.获取歌曲图片url
5.获取歌词
6.总结
7.完整代码
1.分析页面
这一次我们来爬取网易云音乐,爬取歌单内的所有歌曲的图片和歌词,最终的结果是我们只要输入歌单的id,我们就可以直接下载歌单内所有歌曲的图片和歌词,并且以自己想要的命名格式统一命名。
上图是这次的演示歌单,id为973185551。每个歌曲也是有对应的id,通过右键检查第一首歌曲,可以发现这首歌的id为1370008169。
进入歌曲页面,检查图片,会发现图片的url与id是看不出有一点关系的,也就是我们只能进入到歌曲的页面才能获得图片的url。
2.获取歌曲的id
注意:想要爬取真正的页面信息,必须将原url中的 /# 删除,否则无法通过url得到正确的源代码。
原本的歌单url:https://music.163.com/#/playlist?id=973185551
更改后的url:https://music.163.com/playlist?id=973185551
# encoding: utf-8import requests
import re
import os
import json# 获取网页源代码
def get_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}response = requests.get(url, headers=headers)return response.text# 获得歌曲ID
def get_id(url_list):text = get_page(url_list)ids = re.findall(r'<li><a href=".*?id=(\d+)">.*?</a></li>', text, re.DOTALL)return idsdef main():url = 'https://music.163.com/playlist?id=973185551' # 歌单urlids = get_id(url)for id in ids:print(id)if __name__ == '__main__':main()
运行的部分结果:
我们可以发现,我们已经提取出了歌单里所有歌的id。
3.歌曲信息
同样的,我们想要得到网页源代码,就必须将 /# 去掉,变为:
view-source:https://music.163.com/song?id=1370008169
我们可以直接获取meta下的信息
<meta name="description" content="歌曲名《归寻》,由 等什么君 演唱,收录于《归寻》专辑中。《归寻》下载,《归寻》在线试听,更多相关歌曲推荐尽在网易云音乐" />
# 获取歌曲名
def get_name(url_song):text = get_page(url_song)song_name = re.findall(r'<meta name="description" content="歌曲名《(.*?)》,由 .*? 演唱.*?"/>', text, re.DOTALL)song_authors = re.findall(r'<meta name="description" content="歌曲名《.*?》,由 (.*?) 演唱.*?"/>', text, re.DOTALL)name = song_name[0] + ' - ' + song_authors[0]return name
运行的部分结果:
4.获取歌曲图片url
歌曲图片的url也在一个meta标签下
<meta property="og:image" content="http://p2.music.126.net/0Zh_vnKncMlY0So3LUxf7w==/109951164127088021.jpg" />
# 获得歌曲图
def get_img(url_song):text = get_page(url_song)url_img = re.findall(r'<meta property="og:image" content="(.*?)" />', text, re.DOTALL)[0]return url_img
运行的部分结果:
5.获取歌词
获取网易云音乐的歌词挺简单的,它们可以通过直接访问url获得。比如
http://music.163.com/api/song/lyric?id=1370008169&lv=1&kv=1&tv=-1
我们只需要改变id,就可以获得对应歌曲的歌词。
由于这一段信息是json格式,所以读取的时候可以使用json的方式直接获得歌词,并写入文件储存。
# 获取歌词
def get_lyric(id, name):url_lyric = "http://music.163.com/api/song/lyric?id=" + id + "&lv=1&kv=1&tv=-1"text = get_page(url_lyric)judge_lyric = re.findall(r'{"nolyric":true,.*?}', text, re.DOTALL)if judge_lyric:print(str(name) + '无歌词\n')else:# 用json获取歌词json_obj = json.loads(text)initial_lyric = json_obj['lrc']['lyric']root = "D://lyric//"path = root + name + '.lrc'try:if not os.path.exists(root):os.mkdir(root)if not os.path.exists(path):with open(path, 'w') as f:f.write(initial_lyric)f.close()except:return None
6.总结
当爬取网易云音乐的时候,网址出现的/#对我产生了很大的麻烦,白白浪费了三四个小时去修改我的访问方式,总在怀疑我是get用错了,又或者是headers写错了,对网页直接右键源代码也出现了问题。直到我去删除了网址中的/#,才正常的获得了源代码。使用正则去获取信息,主要是因为在获取简单的信息时,直接使用正则其实还是比较简单的,缺点是当歌曲变多后,使用正则会让程序执行速度变慢。
由于某些歌曲是无歌词的,所以我们需要添加判断是否有歌词的语句,否则会让程序在运行时报错。上图就是无歌词时,访问url的显示结果。偷懒一下,直接用正则匹配这一段,然后if判断时就会过,执行输出歌曲无歌词的提示,并让程序依旧正常运行。
7.完整代码
# encoding: utf-8import requests
import re
import os
import json# 获取网页源代码
def get_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}response = requests.get(url, headers=headers)return response.text# 获得歌曲ID
def get_id(url_list):text = get_page(url_list)ids = re.findall(r'<li><a href=".*?id=(\d+)">.*?</a></li>', text, re.DOTALL)return ids# 获取歌曲名
def get_name(url_song):text = get_page(url_song)song_name = re.findall(r'<meta name="description" content="歌曲名《(.*?)》.*?由 .*? 演唱.*?"/>', text, re.DOTALL)song_authors = re.findall(r'<meta name="description" content="歌曲名《.*?》.*?由 (.*?) 演唱.*?"/>', text, re.DOTALL)name = song_name[0] + ' - ' + song_authors[0]return name# 获得歌曲图
def get_img(url_song, name):text = get_page(url_song)url_img = re.findall(r'<meta property="og:image" content="(.*?)" />', text, re.DOTALL)[0]root = "D://pics//"path = root + name + '.jpg'try:if not os.path.exists(root):os.mkdir(root)if not os.path.exists(path):r = requests.get(url_img)with open(path, 'wb') as f:f.write(r.content)f.close()except:return None# 获取歌词
def get_lyric(id, name):url_lyric = "http://music.163.com/api/song/lyric?id=" + id + "&lv=1&kv=1&tv=-1"text = get_page(url_lyric)judge_lyric = re.findall(r'{"nolyric":true,.*?}', text, re.DOTALL)if judge_lyric:print(str(name) + '无歌词\n')else:# 用json获取歌词json_obj = json.loads(text)initial_lyric = json_obj['lrc']['lyric']root = "D://lyric//"path = root + name + '.lrc'try:if not os.path.exists(root):os.mkdir(root)if not os.path.exists(path):with open(path, 'w') as f:f.write(initial_lyric)f.close()except:return Nonedef main():url = 'https://music.163.com/playlist?id=391228182' # 歌单urlids = get_id(url)names = []fns_num = 1num = len(ids)for id in ids:url_song = 'https://music.163.com/song?id=%s' % idname = get_name(url_song)get_img(url_song, name)get_lyric(id, name)names.append(name)print("\r完成进度: {:.2f}%".format(fns_num * 100 / num), end="")fns_num += 1print('\n\n完成名单:')for i in names:print(i)print('\n\n查找到的数量:' + str(num))print('\n最终完成的数量:' + str(len(names)))if __name__ == '__main__':main()
运行的部分结果:
注:由于其中一首歌的名字出现“/”斜杠,导致文件无法储存,文件的命名格式是不能出现“/”。可以通过添加以下语句,将“/”转换成“、”。
s = "【贰婶/流浪的蛙蛙/HITA/冥月】世伪知贤 (用原创发声) - 贰婶、流浪的蛙蛙、HITA、冥月"
s = s.replace('/','、')
python爬虫之爬取网易云音乐的歌曲图片和歌词相关推荐
- python音乐相册_python爬虫之爬取网易云音乐的歌曲图片和歌词
0.目录 1.分析页面 2.获取歌曲的id 3.获取歌曲信息 4.获取歌曲图片url 5.获取歌词 6.总结 7.完整代码 1.分析页面 这一次我们来爬取网易云音乐,爬取歌单内的所有歌曲的图片和歌词, ...
- python爬虫爬取音乐_利用python爬虫实现爬取网易云音乐热歌榜
利用python爬虫实现爬取网易云音乐热歌榜 发布时间:2020-11-09 16:12:28 来源:亿速云 阅读:102 作者:Leah 本篇文章给大家分享的是有关利用python爬虫实现爬取网易云 ...
- 【Python爬虫】爬取网易云音乐,打造音乐下载器
目录 搭建窗口 爬虫实现下载音乐 歌曲搜索 下载歌曲 绑定命令 生成可执行文件 感想 在前一篇文章,正好总结过了Tkinter以及canvas画布的使用,学以致用,用Tkinter来创建一个窗口,在此 ...
- Python爬取网易云音乐歌手歌曲和歌单(爬虫)
Python爬取网易云音乐歌手歌曲和歌单 是 仅供学习参考 Python爬取网易云音乐网易云音乐歌手歌曲和歌单,并下载到本地 ①找到要下载歌手歌曲的链接,这里用的是: https://music.16 ...
- Python Scrapy 多线程爬取网易云音乐热门歌单信息(手把手教学)
下面我将向大家介绍使用 Scrapy 爬虫获取 网易云音乐 的热门歌单信息. 这里是网易云音乐的歌单页面,可以看到歌单信息非常得结构化,是非常适合爬虫来爬取的. URL:全部歌单 - 歌单 - 网易云 ...
- python听歌识曲爬虫_Python爬取网易云音乐热门评论的搜索结果-阿里云开发者社区...
网易云音乐评论爬虫(三):爬取歌曲的全部评论 用过网易云音乐听歌的朋友都知道,网易云音乐每首歌曲后面都有很多评论,热门歌曲的评论更是接近百万或者是超过百万条.现在我就来分享一下如何爬取网易云音乐歌曲的 ...
- Python爬虫——selenium爬取网易云评论并做词云
大家好!我是霖hero 到点了上号网易云,很多人喜欢到夜深人静的时候,在网易云听音乐发表评论,正所谓:自古评论出人才,千古绝句随口来,奈何本人没文化,一句卧槽行天下!评论区集结各路大神,今天我们来爬取 ...
- Python爬取网易云音乐辑的图片、专辑名和专辑出版时间
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 作者:阿里波特 来源:CSDN Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 h ...
- 来跟我学爬虫,爬取网易云音乐的邓紫棋歌单MP3,注意:VIP歌曲不可以爬取
@Author:Runsen 我又回来了写几个爬虫案例了,这次是写一个简单的爬虫,我来教你如何爬取网易云音乐的歌单MP3,正所谓下载一个mp3很麻烦,你们的女朋友想听歌,秀即使帮她爬取所有MP3,从此 ...
最新文章
- python语言的数据类型有哪些_Python语言有哪些数据类型
- 评估指标:ROC,AUC,Precision、Recall、F1-score
- ASP.NET获取客户端IP及MAC地址
- 为TIF、JPG图片添加地理坐标/平面直角坐标
- wxWidgets之wxGrid控件
- IA-32 Architecture: the function of segment regitster(CS DS SS ES)
- LeetCode 1560. 圆形赛道上经过次数最多的扇区
- 基于Consul的数据库高可用架构【转】
- django 1.8 官方文档翻译:13-3 日志
- Android UI:机智的远程动态更新策略
- 印刷(烫金)缺陷在线检测系统
- 计算机软件技术信息安全哪个好,国内哪个大学的计算机安全专业最好?
- 使用vue -cli脚手架构建项目组件的全局注册与本地注册
- JavaWeb在线聊天系统开发
- 乘业绩创新高的东风,董明珠续任格力董事长几无悬念
- 降噪滤波器的简单使用
- 利用IPv6看清晰流畅的网络电视
- Github年度百大框架排行榜
- shiro反序列化漏洞学习(工具+原理+复现)
- UE使用技巧之---去空格