侧边栏壁纸
  • 累计撰写 75 篇文章
  • 累计收到 224 条评论
    love love love

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

李哲
2023-06-12 / 212121 评论 / 491,835 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年08月05日,已超过267天没有更新,若内容或图片失效,请留言反馈。
importrequests,os


classSpider:
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 NT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/70.0.3538.25Safari/537.36Core/1.70.3861.400QQBrowser/10.7.4313.400'}

defmain(self):
forpageinrange(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']
forsonginsong_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地址,将响应以二进制文件储存到本地
withopen('{}/{}.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/

在搜索栏里输入要爬取歌手的名字:
mmexport1686559961021.jpg
来到这个页面右键检查:
mmexport1686567860292.jpg
按下图方式顺序点击:

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

把这个response响应copy到一个json文件里进行格式化,再依次展开:
mmexport1686567863310.jpg
mmexport1686567866364.jpg
发现在这个’list’里存了这一页的全部歌曲信息,再继续展开其中的一首歌曲 :
mmexport1686567870105.jpg
这里可以找到歌曲的rid和歌曲name,这两个信息是有用的,rid是用来帮我们定位到歌曲所在的mp3文件,name用与下载歌曲时对歌曲进行命名。

再回到刚才的页面:
mmexport1686567873260.jpg
发现这个url获取的响应中存着歌曲的播放地址(也就是mp3文件的url),可以直接把这歌url复制到地址栏请求,会去到一首歌曲的播放界面:
mmexport1686567876501.jpg
那么改变不同的rid自然就得到不同的歌曲的url,然后我们直接请求这些url,获取到的响应就是这个mp3文件,用二进制的方式储存到本地就可以用任意播放器打开并播放,你也可以把你的程序打包成exe文件,发给你的小伙伴使用哦。

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

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

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

三:歌曲自身的

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

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

下面的key对应你搜索的关键字,pn代表页数,rn是每页的歌曲数,我们可以自主修改来获取不同歌手的歌曲和歌曲数量:
mmexport1686567882141.jpg
总体的思路还是比较清晰的:请求存放歌曲信息的url(这个url可以改变搜索的关键字和页数来获取不同歌手的歌曲和数量),请求存放歌曲播放地址的url(这个url通过改变rid的值来获取不同的歌曲播放地址),请求歌曲mp3文件的地址(获得二进制响应并保存到本地)。

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

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

5,214

评论 (212121)

取消