前面我们说过用python爬取网易云音乐的歌手信息,Python爬取网易云音乐歌手信息
今天我们来爬取一下酷狗音乐的歌手信息(歌手id和歌手名),如果环境没有安装好,可以参照前面爬网易云环境配置作为参考,这里不再叙述
我们先来到酷狗音乐的首页
我们来到歌手界面,其中我们要的数据都在这里
以上我歌手界面,通过对超链接的点击和url的变化,我们得到以下的对应规则
https://www.kugou.com/yy/singer/index/1-a-2.html
上面是华语男歌手以a开头的第一页的URL示例信息
每个界面上只有html的文件名不一样
第一个数字对应的页数,一般每一个字母开头的歌手信息有5页
第二个是歌手名开头字母,比如这里的a就是以a开头的歌手信息,其中有[A-Z]以及null,null对应其他的信息
第三个数字是对应的华语男歌手,华语女歌手等信息,其对应关系如下所示
数字 | 对应关系 |
---|---|
2 | 华语男歌手 |
3 | 华语女歌 手 |
4 | 华语组合 |
5 | 日韩男歌手 |
6 | 日韩女歌手 |
7 | 日韩组合 |
8 | 欧美男歌手 |
9 | 欧美女歌手 |
10 | 欧美组合 |
11 | 其他 |
根据以上的分析,我们就可以得到每一个界面的URL,接下来我们来分析网页信息
可以看到,每个字母开头的第一页的信息上一部分歌手是有图片信息的,它的结构与没有图片信息的歌手不一样,我们要分开讨论
打开检查,看到带有图片信息的html源码
它们的信息都保存在ul标签的li子标签下,带有图片的歌手信息的ul的id是list_head
没有图片的歌手信息的保存在id为list1的div标签的ul标签下
在里面的a标签中,title属性是歌手的名字,href属性值包含了该歌手的id,只要得到该a标签,我们就得到了歌手的信息
通过歌手的id我们就可以跳转到对应的歌手具体界面来爬取更多的信息了
具体的Python代码如下所示
import requests
from bs4 import BeautifulSoup
import csv
page_index = {1, 2, 3, 4, 5}
ids = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
words = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'null']
name = ['华语男歌手', "华语女歌手" ,"华语组合", "日韩男歌手", "日韩女歌手", "日韩组合", "欧美男歌手", "欧美女歌手", "欧美组合", "其他"]
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
initial_url = "http://www.kugou.com/yy/singer/index/{}-{}-{}.html"
url = initial_url.format(2, 'a', 2)
#最外层循环是对应的华语男歌手,女歌手等信息
#第二层对应的是A-Z加上其他等信息
#第三层是A-Z加其他里面的5页信息
for id in ids:
with open(file=r'{}.csv'.format(name[id - 2]), encoding="utf-8", mode="a") as f:
writer = csv.writer(f, lineterminator='\n')
writer.writerow(["歌手ID", "歌手姓名"])
f.close()
for word in words:
for page in page_index:
url = initial_url.format(page, word, id)
print(url)
response = requests.get(url, headers = headers)
soup = BeautifulSoup(response.text, "html.parser")
with open(file=r'{}.csv'.format(name[id - 2]), encoding="utf-8", mode="a") as f:
# 如果为1的话说明当前界面有一部分歌手的信息带图片,分为list_head和list1两个部分
if page == 1:
list_header = soup.find("ul", id="list_head")
lis = list_header.find_all("li")
for li in lis:
singer_id = li.a['href'].split("home/")[1].split(".")[0]
singer_name = li.a['title']
writer = csv.writer(f, lineterminator='\n')
writer.writerow((singer_id, singer_name))
print(singer_name + " " + singer_id)
list1 = soup.find("div", id = "list1")
for ul in list1.find_all("ul"):
for li in ul.find_all('li'):
singer_id = li.a['href'].split("home/")[1].split(".")[0]
singer_name = li.a['title']
writer = csv.writer(f, lineterminator='\n')
writer.writerow((singer_id, singer_name))
print(singer_name + " " + singer_id)
#否则歌手信息显示的只有超链接没有图片,这种简单一点
else:
list1 = soup.find("div", id = "list1")
for ul in list1.find_all("ul"):
for li in ul.find_all('li'):
singer_id = li.a['href'].split("home/")[1].split(".")[0]
singer_name = li.a['title']
writer = csv.writer(f, lineterminator='\n')
writer.writerow((singer_id, singer_name))
print(singer_name + " " + singer_id)
f.close()