您的位置:首页 > 编程语言 > Python开发

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

2017-09-27 09:51 183 查看

上一篇已经介绍了如何获取一首歌的歌词,今天那就介绍一下如何通过一个歌手的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).text
soupObj = BeautifulSoup(r,'lxml')
song_ids = soupObj.find('textarea').text
print(song_ids)


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

[{"commentThreadId":"R_SO_4_65528","score":100.0,"copyrightId":7003,"mvid":303133,"transNames":
4000
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'])


运行结果(中间有省略)

65528
25906124
28563317
65766
65538
28481818
65800
65126
64886
28481103
64634
......
65487
437802725
36539010
66265
65078
65758
5251209
64706
25638273
67787
64625
493283125
65778


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

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

完整代码如下

import requests
import json
import re
from bs4 import BeautifulSoup

def 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 lrc

def 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歌之王
也不见得把爱情唱得完美
只能说我输了
也许是你怕了
我们的回忆没有皱褶
你却用离开烫下句点
只能说我认了
你的不安赢得你信任
我却得到你安慰的淘汰
......
作词 : 周博贤
乔迁那日打扫废物
家居仿似开战
无意发现当天
穿返学夏季衬衣
奇怪却是茄汁污垢
渗在这衬衣布章外边
极其大意
为何如此
想那日初次约会
心惊手震胆颤
忙里泄露各种的丑态像丧尸
而尴尬是快餐厅里
我误把浆汁四周乱溅
骇人场面相当讽刺
你及时递上餐纸
去为我清洗衬衣
刹那间身体的触碰大件事
今天看这段历史
像褪色午夜残片
笑话情节此刻变窝心故事
现时大了那种心跳难重演
极灿烂时光
一去难再遇上一次
怎努力都想不起
初恋怎会改变
情侣数字我屈指一算大概知
奇怪却是每恋一次
震撼总逐渐变得越浅
令人动心只得那次
有没捱坏了身子
会为哪位披嫁衣
你有否挂念当天这丑小子
今天看那段历史
像褪色午夜残片
笑话情节此刻变窝心故事
现时大了那种心跳难重演
极灿烂时光
一去难再遇上一次
在混乱杂物当中找到
失去的往事
但现在杂物与我
举家将会搬迁
让记念成历史
想想那旧时日子
像褪色午夜残片
任何情节今天多一种意义
现时大了那种心跳难重演
极爆裂场面
想再遇确实靠天意
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: