需求分析: 利用爬虫获取网易云音乐歌曲的歌词,效果如下:
分析:通过官方的歌词API获取歌词,例如:访问https://music.163.com/#/song?id=1417093533 则会跳转到关于这首歌的详情页,界面如下
这里需要调用一个获取歌词的接口
链接:http://music.163.com/api/song/media?id= 注:id后跟歌曲的ID
如:获取上面Godzilla歌曲的歌词,它歌曲的ID是:1417093533
我们把这串数字,当作关键字传入歌词接口,也就是访问网站http://music.163.com/api/song/media?id=1417093533 会出现下面的内容
我们仔细看下这个网站的结构,其实它是JSON格式的数据(可以理解为Python中的字典),具体内容为:
- "songStatus":1 # 这个应该是表示歌曲的状态
- "lyricVersion":222 # 这个应该是表示歌词的版本
- "lyric": # 这个包含的内容就是歌词部分
- "code":200 # 这个表示获取歌词的状态码
那么我们只需要获取 "lyric" 部分就可以(纯音乐没有歌词,可以忽略!)
准备部分:
用pip安装requests库(不会的可以百度一下)
代码:
import requests
def requests_html(url):
# 我们增加一个headers,如果不加,网易云会认为我们是爬虫程序,从而拒绝我们的请求
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE',
}
# 利用requests模块请求网易云的歌词页面
demo = requests.get(url, headers=headers)
# 如果正确获取到网页则返回文本内容
if demo.status_code == 200:
return demo.text
else:
print(url,"请求失败")
def parser_html(txt):
# 这里我就不异常处理了,直接获取内容,eval函数把文本内容转换为字典
dic = eval(text)
print("文本当前的数据类型是:",type(dic))
# 字典是键值对类型的,获取歌词部分
lyric = dic['lyric']
# 通过观察文本内容发现,文本每行以 '\n'字符结束,用文本的split切割\n字符获取每行的歌词内容
for line in lyric.split('\n'):
print(line)
# url中的信息就是歌词链接,可以试试你自己的链接,更改ID即可
url = 'http://music.163.com/api/song/media?id=1417093533'
# text里就是网页的内容了
text = requests_html(url)
# 把text里的内容交给parser_html函数解析
parser_html(text)