40行代码用python实现酷我音乐爬虫

不多说直接上代码:

import requests, os


class Spider:
    def __init__(self):
        self.singer_name = input('请输入要爬取的歌手名:')
        self.pages = int(input('请输入爬取页数(一页30首歌):'))
        os.mkdir('{}'.format(self.singer_name))
        self.headers = {'Accept': ',application/json, text/plain, */*',#请求头信息
                        'Accept-Encoding': 'gzip, deflate',
                        'Accept-Language': 'zh-CN,zh;q=0.9',
                        'Connection': 'keep-alive',
                        'Cookie': '_ga=GA1.2.1637941648.1616934252; uname3=qq1616934321; t3kwid=131286315; websid=1488073791; pic3=""; t3=qq; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1617949101,1618127723,1618579672,1619099581; _gid=GA1.2.1505163314.1619099581; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1619100738; _gat=1; kw_token=XM5GXCP8M5',
                        'csrf': 'XM5GXCP8M5',
                        'Host': 'www.kuwo.cn',
                        'Referer': 'http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
                        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400'}

    def main(self):
        for page in range(self.pages):
            print('正在爬取第{}页的歌曲!'.format(page + 1))#不断改变爬取的页数
            url = 'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key={}&pn={}&rn=30&httpsStatus=1&reqId=b4274401-a377-11eb-a99d-ef0323beeee3'.format(
                self.singer_name, page + 1)
            response = requests.get(url, headers=self.headers)
            json = response.json()#得到储存歌曲信息的json文件,下面是层层解析获取name和rid
            data = json['data']
            song_list = data['list']
            for song in song_list:
                song_name = song['name']
                song_rid = song['rid']
                song_json_url = 'http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3&br=128kmp3&from=web&t=1619102008389&httpsStatus=1&reqId=b4280751-a377-11eb-a99d-ef0323beeee3'.format(
                    song_rid)#不断改变rid以获取不同歌取的mp3地址
                print('正在爬取{}。。。'.format(song_name))
                song_url = requests.get(song_json_url, headers=self.headers).json()['url']#请求歌曲的mp3地址,将响应以二进制文件储存到本地
                with open('{}/{}.mp3'.format(self.singer_name, song_name), 'wb') as wstream:
                    wstream.write(requests.get(song_url).content)
                print('爬取成功!')
if __name__ == '__main__':
    music=Spider()
    music.main()
    os.system('pause')

首先去到酷我音乐官网:http://www.kuwo.cn/

在搜索栏里输入要爬取歌手的名字:

 来到这个页面右键检查:

 按下图方式顺序点击:

 可以看到这里的响应response里存的是一个json格式的文件,接下来我们来解析一下这个json

把这个response响应copy到一个json文件里进行格式化,再依次展开:

发现在这个’list’里存了这一页的全部歌曲信息,再继续展开其中的一首歌曲 :

 这里可以找到歌曲的rid和歌曲name,这两个信息是有用的,rid是用来帮我们定位到歌曲所在的mp3文件,name用与下载歌曲时对歌曲进行命名。

再回到刚才的页面:

发现这个url获取的响应中存着歌曲的播放地址(也就是mp3文件的url),可以直接把这歌url复制到地址栏请求,会去到一首歌曲的播放界面:

那么改变不同的rid自然就得到不同的歌曲的url,然后我们直接请求这些url,获取到的响应就是这个mp3文件,用二进制的方式储存到本地就可以用任意播放器打开并播放,你也可以把你的程序打包成exe文件,发给你的小伙伴使用哦。

这里我们总共请求了三种url:

一:存储当前页面歌曲信息(rid和name等)的

二:存储某一rid对应歌曲url播放地址的

三:歌曲自身的

我们请求时一定要加上请求头不然是获取不到信息的:

将这里的request headers用一个字典保存在代码里(如果怕麻烦的话用笔者的也是可以的)。

下面的key对应你搜索的关键字,pn代表页数,rn是每页的歌曲数,我们可以自主修改来获取不同歌手的歌曲和歌曲数量:

总体的思路还是比较清晰的:请求存放歌曲信息的url(这个url可以改变搜索的关键字和页数来获取不同歌手的歌曲和数量),请求存放歌曲播放地址的url(这个url通过改变rid的值来获取不同的歌曲播放地址),请求歌曲mp3文件的地址(获得二进制响应并保存到本地)。

需要掌握如下技能:python基础语法及基本数据类型,request库的简单使用。

这是笔者第一次发文,希望对于学习了一些python基础的小伙伴有一定的帮助,可以作为迈向爬虫领域的第一个小项目。有疑问的小伙伴欢迎在评论区留言,希望大家支持!

                                                                                       如有错误纰漏,感谢联系指正。

                                                                                       如有侵权,联系删除。

猜你喜欢

转载自blog.csdn.net/m0_52726759/article/details/119145600