Python爬虫——分析酷我音乐网站,并爬取歌曲

前言:
爬取数据,我们都先必须了解开发者工具的使用和网页的源代码,即Python导入第三方库的步骤。
开发者工具使用步骤:
使用F12或者Ctrl+Shirt+i打开开发者工具
说明:
1)先检查HTML的结构是不是对的,再检查样式有没有问题
2)Ctrl+滚轮,可以放大开发者工具代码大小
3)左边是HTML元素结构,右边是CSS样式
4)右边CSS样式可以改动数值和颜色查看更改后效果;
在这里插入图片描述
点击Network
在这里插入图片描述

分析酷我音乐网站

第一步:先播放音频文件
在这里插入图片描述
第二步获取到一首歌的URL播放地址
**Request URL ** 代表着要请求网址的URL
Request Method代表着网址的请求方式,通常的请求方式为(GET请求、POST请求)
Status Code:代表着请求网站的状态码
状态码解释地址
在这里插入图片描述
写入一首歌的教程

# -*- coding: utf-8 -*- 
# @Time : 2019/12/23 13:00
# @Author : 大数据小J 
# @File : 测试数据.py 
# @Software: PyCharm


# 导入第三库  pip install requests
import requests

# 爬取一首歌的步骤
with open('酷我音乐/我是如此相信.mp3','wb')as f:
    url = 'https://eb-sycdn.kuwo.cn/5a767c337ce097f62967b2ac0f8d5b78/5e005045/resource/n3/25/23/2765484690.mp3'
    music = requests.get(url)
    f.write(music.content)
    f.close()

那么需求来了

  • 如果我想要获取歌手的第一页的所有歌曲怎么办
  • 如果我想获取歌手的所有的歌曲怎么办
  • 我不仅要获取歌手的歌曲,还要获取歌手的歌曲名字,该怎么办?

进入正题,开始分析
在网站中每一首歌都会有着网站标识的id值,这个id值相当于人的身份证,每个人都有着自己的身份标识。

第一步:先分析第一首歌有没有什么内容

在这里插入图片描述
第二步:大家会发现最后一个网站会包含着歌曲的数据
在这里插入图片描述

该URL对应着rid值是怎么来的
在这里插入图片描述

第三步:我们可以查找该对应的歌曲名字会发现相对应的数值
在这里插入图片描述
会发现该歌曲rid值,在一个URL链接中存放着

在这里插入图片描述
所以得出以下结论:

该网站存放对应第一页URL数据
http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key=%E5%91%A8%E6%9D%B0%E4%BC%A6&pn=1&rn=30&reqId=f4ad9b80-2549-11ea-92dc-b1e779c8d1d6

每一首歌有对应的着rid存放数据的URL
http://www.kuwo.cn/url?format=mp3&rid=83728113&response=url&type=convert_url3&br=128kmp3&from=web&t=1577081015618&reqId=f4af2221-2549-11ea-92dc-b1e779c8d1d6

开始撸代码

# -*- coding: utf-8 -*- 
# @Time : 2019/12/23 13:54 
# @Author : 大数据小J 
# @File : 酷我音乐完整版.py 
# @Software: PyCharm

import requests
from urllib import parse
import json

# 该网站有反爬机制,要模拟浏览器来进行伪装。
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
    'Referer': 'http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
    'csrf': 'RUJ53PGJ4ZD',
    'Cookie': 'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1577029678,1577034191,1577034210,1577076651; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1577080777; kw_token=RUJ53PGJ4ZD'
}


# 该函数功能最终要获取歌曲相对应的id值和歌曲的名字
def get_music_url():
    # 把数据存放到列表中
    music_list = []

    # 歌手的名字
    singer = str(input('请输入要下载歌手:'))

    # 歌曲的页数
    number = int(input('请输入要下载的页数:'))

    for i in range(1, number + 1):
        parameters = {
            'key': singer,
            'pn': i,
            'rn': 30,
            'reqId': 'f4ad9b80-2549-11ea-92dc-b1e779c8d1d6'
        }
        data = 'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?'

        url_data = parse.urlencode(parameters)

        url = data + url_data

        music_list.append(url)

    return music_list


# 该函数获取对应的rid值和名字
def get_music_data(url):
    list_data = []
    response = requests.get(url, headers=headers)
    html = response.text
    result = json.loads(html)
    data = result['data']['list']
    for i in data:
        rid = i['rid']
        name = i['name']
        list_data.append((rid, name))

    return list_data


# 该函数获取歌曲的mp3文件
def get_music_mp3(rid):
    list_data = []
    url = 'http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3&br=128kmp3&from=web&t=1577081015618&reqId=f4af2221-2549-11ea-92dc-b1e779c8d1d6'.format(
        rid)
    response = requests.get(url, headers=headers)
    html = response.text
    result = json.loads(html)
    music_url = result['url']
    list_data.append(music_url)
    return list_data


# 该函数来存放该执行的代码块
def main():
    for url in get_music_url():
        for i in get_music_data(url):
            # 歌曲的rid
            rid = i[0]
            name = i[1]
            for music_url in get_music_mp3(rid):
                try:
                    with open('酷我音乐/{}.mp3'.format(name), 'wb')as f:
                        print('正在下载{}'.format(name), end='')
                        music = requests.get(music_url)
                        f.write(music.content)
                        f.close()
                        print('\t下载完成')
                except:
                    print('出现错误')


# 在当前模块运行该代码程序
if __name__ == '__main__':
    main()

运行结果:
在这里插入图片描述
在这里插入图片描述

发布了54 篇原创文章 · 获赞 26 · 访问量 6179

猜你喜欢

转载自blog.csdn.net/qq_37662827/article/details/103663577