30行代码爬取网易云歌词

需求分析: 利用爬虫获取网易云音乐歌曲的歌词,效果如下:

30行代码爬取网易云歌词

分析:通过官方的歌词API获取歌词,例如:访问https://music.163.com/#/song?id=1417093533 则会跳转到关于这首歌的详情页,界面如下

30行代码爬取网易云歌词

这里需要调用一个获取歌词的接口

链接:http://music.163.com/api/song/media?id= 注:id后跟歌曲的ID

如:获取上面Godzilla歌曲的歌词,它歌曲的ID是:1417093533

30行代码爬取网易云歌词

我们把这串数字,当作关键字传入歌词接口,也就是访问网站http://music.163.com/api/song/media?id=1417093533 会出现下面的内容

30行代码爬取网易云歌词

我们仔细看下这个网站的结构,其实它是JSON格式的数据(可以理解为Python中的字典),具体内容为:
  1. "songStatus":1 # 这个应该是表示歌曲的状态
  2. "lyricVersion":222 # 这个应该是表示歌词的版本
  3. "lyric": # 这个包含的内容就是歌词部分
  4. "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)
代码我就不详细说明了,重要的部分我已经注释,如果还有疑问请留言,欢迎交流,相互学习!
上一篇:《人月神话》读书笔记二


下一篇:QQ音乐