目录
3.访问刚刚获取到的五大分类里面的链接,进入到每类歌手的界面
网易云音乐的网址:https://music.163.com/
1.首页访问
我们的需求是要爬取网易云音乐的所有歌手,点击歌手,
得到接口:https://music.163.com/discover/artist
这里有个问题需要注意一下,我们注意到当我们在网页上点击歌手之后,网址是https://music.163.com/#/discover/artist
但是我们写好代码请求这个页面的时候是获取不到的,所以我们请求的接口应该把中间的那个#去掉,写成:https://music.163.com/discover/artist
# 首页访问
url = 'https://music.163.com/discover/artist'
headers = {
'user-agent': "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36"}
response = requests.get(url=url, headers=headers)
content = response.content.decode('utf-8')
with open('wangyiyun.html', 'w', encoding='utf-8') as fp:
fp.write(content)
2.解析各类歌手url
首先我们看到歌手先有五种分类:华语,欧美,日本,韩国,其他
在前端页面都被写在class="blk"的div标签里面
先把这几类下面的每种链接都获取出来
我们可以看到链接到放到每一个div>ul>li>a:href
但是a标签href里面的标签不完整,需要拼接一下
链接格式应该是:‘https://music.163.com’+‘/discover/artist/cat?id=1001’
代码实现如下所示:
# 解析各类歌手url
tree = etree.HTML(content)
group_list = tree.xpath('//div[@class="blk"]')
print(len(group_list))
for group in group_list:
# 歌手分类
group_name = group.xpath('.//a/text()')
# print(group_name)
# 链接
group_link = group.xpath('.//a/@href')
# print(group_link)
for i, j in zip(group_name, group_link):
# 歌手地址
link = 'https://music.163.com' + j
3.访问刚刚获取到的五大分类里面的链接,进入到每类歌手的界面
在这里我们以华语男歌手为例,可以看到页面上展示出来的歌手肯定不全,上面有一栏写着热门,A.B.C.D........
我们把A.B.C.D......这些都遍历出来,就可以完整的爬取到歌手了
打开F12分析一下界面
(1)可以看到A.B.C.D.....对应的是class="n-ltlst f-cb"的ul标签下面的li元素
但是我们不需要获取热门里面的内容,所以要把第一个li去掉
这里有两种方法:pop(0) ; xpath的位谓语position()>1进行限制
(2)获取每个字母下面的链接:
很容易看见是在上面找的li元素的a标签的href属性里面
链接地址同样也需要拼接
代码实现如下:
singer_content = requests.get(link).content.decode('utf-8')
tree = etree.HTML(singer_content)
singer_url = tree.xpath('//ul[@class="n-ltlst f-cb"]/li[position()>1]/a/@href')
print(singer_url)
for url in singer_url:
full_url = 'https://music.163.com' + url
print(full_url)
4.请求每个字母的链接,获取到对应的歌手列表,获取歌手信息
每一个歌手的信息都写在class="m-sgerlist"的div标签的ul>li标签
歌手的名字都在div>ul>li>p>a>text()
代码实现:
singer_info = requests.get(full_url).content.decode('utf-8')
tree = etree.HTML(singer_info)
li_list = tree.xpath('//div[@class="m-sgerlist"]/ul/li/a/text()')
for li in li_list:
print(li)