前面我们说过用python爬取网易云音乐的歌手信息,Python爬取网易云音乐歌手信息 今天我们来爬取一下酷狗音乐的歌手信息(歌手id和歌手名),如果环境没有安装好,可以参照前面爬网易云环境配置作为参考,这里不再叙述

我们先来到酷狗音乐的首页

python 爬取酷狗音乐 python爬取酷狗音乐歌手图片_python


我们来到歌手界面,其中我们要的数据都在这里

python 爬取酷狗音乐 python爬取酷狗音乐歌手图片_html_02


以上我歌手界面,通过对超链接的点击和url的变化,我们得到以下的对应规则

python 爬取酷狗音乐 python爬取酷狗音乐歌手图片_超链接_03


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,接下来我们来分析网页信息

python 爬取酷狗音乐 python爬取酷狗音乐歌手图片_a标签_04


python 爬取酷狗音乐 python爬取酷狗音乐歌手图片_html_05


可以看到,每个字母开头的第一页的信息上一部分歌手是有图片信息的,它的结构与没有图片信息的歌手不一样,我们要分开讨论

打开检查,看到带有图片信息的html源码

python 爬取酷狗音乐 python爬取酷狗音乐歌手图片_a标签_06


它们的信息都保存在ul标签的li子标签下,带有图片的歌手信息的ul的id是list_head

python 爬取酷狗音乐 python爬取酷狗音乐歌手图片_a标签_07


没有图片的歌手信息的保存在id为list1的div标签的ul标签下

python 爬取酷狗音乐 python爬取酷狗音乐歌手图片_html_08


在里面的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()

它会自动在当前.py文件的同一个目录下创建.csv文件,如下所示

python 爬取酷狗音乐 python爬取酷狗音乐歌手图片_a标签_09


用excel打开文件后如下所示

python 爬取酷狗音乐 python爬取酷狗音乐歌手图片_python_10