Python爬取酷狗音乐歌手信息

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

我们先来到酷狗音乐的首页
Python爬取酷狗音乐歌手信息_第1张图片
我们来到歌手界面,其中我们要的数据都在这里
Python爬取酷狗音乐歌手信息_第2张图片
以上我歌手界面,通过对超链接的点击和url的变化,我们得到以下的对应规则
Python爬取酷狗音乐歌手信息_第3张图片
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爬取酷狗音乐歌手信息_第4张图片
Python爬取酷狗音乐歌手信息_第5张图片
可以看到,每个字母开头的第一页的信息上一部分歌手是有图片信息的,它的结构与没有图片信息的歌手不一样,我们要分开讨论
打开检查,看到带有图片信息的html源码
Python爬取酷狗音乐歌手信息_第6张图片
它们的信息都保存在ul标签的li子标签下,带有图片的歌手信息的ul的id是list_head
Python爬取酷狗音乐歌手信息_第7张图片
没有图片的歌手信息的保存在id为list1的div标签的ul标签下

Python爬取酷狗音乐歌手信息_第8张图片
在里面的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爬取酷狗音乐歌手信息_第9张图片
用excel打开文件后如下所示
Python爬取酷狗音乐歌手信息_第10张图片

你可能感兴趣的:(爬虫,python)