Python 3爬虫网易云(九)—— 获取一个歌手的热门50首歌词

来源:互联网 发布:五五开德云色事件知乎 编辑:程序博客网 时间:2024/05/21 18:36

上一篇已经介绍了如何获取一首歌的歌词,今天那就介绍一下如何通过一个歌手的id获取他的热门50首的歌词吧。

1.找入口

要爬取一位歌手的歌曲,首先在网易云中要获得歌曲的id,在这推荐用火狐浏览器,其中的firebug插件对网页的解析很有帮助。
这里以爬取陈奕迅的热门50首为例。
我们会发现歌曲的id是包含在a标签中的href中的

这里写图片描述

那么可能大家有人会想直接把网页源码下载下来,然后用BeautifulSoup解析把歌曲id提取出来然后下载歌词。但是你会发现这个信息是通过js的后期渲染加进去的,进入网页响应,可以发现它是隐藏在textarea中,所以我们把textarea中的内容提取出来:

这里写图片描述

2.请求和返回

提取textarea字符内容

singer_url = 'http://music.163.com/artist?'+ 'id=2166'r = requests.get(singer_url).textsoupObj = BeautifulSoup(r,'lxml')song_ids = soupObj.find('textarea').textprint(song_ids)

运行结果(太长省略后半部分)

[{"commentThreadId":"R_SO_4_65528","score":100.0,"copyrightId":7003,"mvid":303133,"transNames":null,"name":"淘汰","id":65528,"type":0,"duration":285000,"no":2,"fee":8,"ftype":0,"status":3,"alias":[],"album":{"id":6434,"name":"认......

到这里后,我们的思路应该是

先用json库格式

然后在从里面依次把歌曲的id提取出来

那么代码改为

singer_url = 'http://music.163.com/artist?'+ 'id=2166'    r = requests.get(singer_url).text    soupObj = BeautifulSoup(r,'lxml')    song_ids = soupObj.find('textarea').text    jobj = json.loads(song_ids)    for item in jobj:        print(item['id'])

运行结果(中间有省略)

6552825906124285633176576665538284818186580065126648862848110364634......654874378027253653901066265650786575852512096470625638273677876462549328312565778

这里我们就把热门50首的id成功提取出来

然后把上一篇下载歌词的代码写入就可以下载好一位歌手的热门50首歌曲的全部歌词啦

完整代码如下

import requestsimport jsonimport refrom bs4 import BeautifulSoupdef download_by_music_id(music_id):    #根据歌词id下载    url = 'http://music.163.com/api/song/lyric?'+ 'id=' + str(music_id)+ '&lv=1&kv=1&tv=-1'    r = requests.get(url)    json_obj = r.text    j = json.loads(json_obj)    lrc = j['lrc']['lyric']    pat = re.compile(r'\[.*\]')  #这里几行代码是把歌词中的空格和符号之类的去掉    lrc = re.sub(pat,"",lrc)      lrc = lrc.strip()    return lrcdef get_music_ids_by_musican_id(singer_id): #通过一个歌手id下载这个歌手的所有歌词    singer_url = 'http://music.163.com/artist?'+ 'id='+str(singer_id)    r = requests.get(singer_url).text    soupObj = BeautifulSoup(r,'lxml')    song_ids = soupObj.find('textarea').text    jobj = json.loads(song_ids)    for item in jobj:        print(item['id'])        print(download_by_music_id(item['id']))get_music_ids_by_musican_id(2116) #括号内为歌手id

运行结果(中间有省略)

作曲 : 周杰伦 作词 : 周杰伦我说了所有的谎你全都相信简单的我爱你你却老不信你书里的剧情我不想上演因为我喜欢喜剧收尾我试过完美放弃的确很踏实醒来了 梦散了你我都走散了情歌歌词何必押韵就算我是K歌之王也不见得把爱情唱得完美只能说我输了也许是你怕了我们的回忆没有皱褶你却用离开烫下句点只能说我认了你的不安赢得你信任我却得到你安慰的淘汰......作词 : 周博贤乔迁那日打扫废物家居仿似开战无意发现当天穿返学夏季衬衣奇怪却是茄汁污垢渗在这衬衣布章外边极其大意为何如此想那日初次约会心惊手震胆颤忙里泄露各种的丑态像丧尸而尴尬是快餐厅里我误把浆汁四周乱溅骇人场面相当讽刺你及时递上餐纸去为我清洗衬衣刹那间身体的触碰大件事今天看这段历史像褪色午夜残片笑话情节此刻变窝心故事现时大了那种心跳难重演极灿烂时光一去难再遇上一次怎努力都想不起初恋怎会改变情侣数字我屈指一算大概知奇怪却是每恋一次震撼总逐渐变得越浅令人动心只得那次有没捱坏了身子会为哪位披嫁衣你有否挂念当天这丑小子今天看那段历史像褪色午夜残片笑话情节此刻变窝心故事现时大了那种心跳难重演极灿烂时光一去难再遇上一次在混乱杂物当中找到失去的往事但现在杂物与我举家将会搬迁让记念成历史想想那旧时日子像褪色午夜残片任何情节今天多一种意义现时大了那种心跳难重演极爆裂场面想再遇确实靠天意
阅读全文
0 0
原创粉丝点击