爬取QQ音乐资源
- 分析QQ音乐
- 那么分析一下音乐的地址在哪里,我们最主要的就是资源地址
分析QQ音乐
首先打开相关音乐栏目页面,我们可以看到页面中失去了选择下一页了,被腾讯屏蔽了,强制要求下载,但是我们是爬虫工程师呀,怎么可能会被拦阻
请认真对待,你是一个爬虫工程师,要这些表面的干什么,你要的是内在的,你要有内涵的
那么分析一下音乐的地址在哪里,我们最主要的就是资源地址
这是我们找到的2条资源地址,这个地址,我们看看有什么规律
http://isure.stream.qqmusic.qq/C4000026JiCu2LASHc.m4a?guid=7107896008vkey=76C1EFA596C08CFB7934D51F0B3567629FFCFA00064C8E3FAE093A0B923E26A7540DDF5E9A538E4CCF2F6DD21EE81F82D635C294DCB05E4&uin=264&fromtag=66
http://isure.stream.qqmusic.qq/C400003kyC5M3AOStX.m4a?guid=7107896008vkey=FDB3D896A7FFF5B337CBB133DBA7D961D3D14413DD3324A9FDDB1F6EDE8AB2DD8D16369046E9D32E5F16FF244BCCDEE43087B830252D05B&uin=264&fromtag=66
如果用requests请求的话,那么这两首歌就可以直接爬下来了,那么我们就直接完成,哈哈开玩笑,进读条就知道还没完
/C4000026JiCu2LASHc.m4a?
guid=7107896008
vkey=76C1EFA596C08CFB7934D51F0B3567629FFCFA00064C8E3FAE093A0B923E26A7540DDF5E9A538E4CCF2F6DD21EE81F82D635C294DCB05E4
&uin=264
&fromtag=66
/C400003kyC5M3AOStX.m4a?
guid=7107896008
vkey=FDB3D896A7FFF5B337CBB133DBA7D961D3D14413DD3324A9FDDB1F6EDE8AB2DD8D16369046E9D32E5F16FF244BCCDEE43087B830252D05B
&uin=264
&fromtag=66
通过对比知道 guid,uin, fromtag 都是不变的
/C400(这部分不一样).m4a?以及vkey也不一样,我们看看能不能找到这部分的值呢找出一个 :media_mid: “0026JiCu2LASHc” C4000026JiCu2LASHc = ‘C400’ + media_mid
还差vkey,这个有点难找,我再找一下看看规律
。。。。。。。。
。。。。。。。。
。。。。。。。。
30分钟后,终于找出来了
vkey在这里,现在我们筛选一下,把一些没用的参数去掉,反复分访问这个链接,同时删减参数,最后得到的url,其中最重要的参数songmin,guid,uin 这三个参数,后面两个guid,uin是登录后才可以获取,可以通过selenum自动获取,也可以手动自己去复制也可以,这里直接复制就好了
https://u.y.qq/cgi-bin/musicu.fcg?&data={“req”:{“param”:{“guid”:""}},“req_0”:{“module”:“vkey.GetVkeyServer”,“method”:“CgiGetVkey”,“param”:{“guid”:"",“songmid”:[“000IN0Mn3d37fv”],“uin”:""}},“comm”:{“uin”:}}
那么现在直接上代码
import requests
import json
class QQmusic:
def __init__(self):
self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}
self.sl = []
self.musicList = []
# 获取页面
def getPage(self,url,headers):
res = requests.get(url,headers = headers)
res.encoding = 'utf-8'
return res
# 获取音乐songmid
def getSongmid(self):
num = int(input('请输入获取条数:'))
# num = 20
name = input('请输入歌名或歌手:')
# name = '张学友'
url = 'https://c.y.qq/soso/fcgi-bin/client_search_cp?p=1&n=%d&w=%s'%(num,name)
# 搜索音乐
res = self.getPage(url,headers=self.headers)
html = res.text
html = html[9:]
html = html[:-1]
# 获取songmid
js = json.loads(html)
songlist = js['data']['song']['list']
for song in songlist:
print(song)
songmid = song['songmid']
name = song['songname']
self.sl.append((name,songmid))
print('获取成功songmid')
# 获取音乐资源,guid是登录后才能获取,nin也是
def getVkey(self):
guid = input('请输入guid:')
uin = input('请输入uin:')
for s in self.sl:
print('开始获取资源')
# 获取vkey,purl
name = s[0]
songmid = s[1]
keyUrl = 'https://u.y.qq/cgi-bin/musicu.fcg?&data={"req":{"param":{"guid":" %s"}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"%s","songmid":["%s"],"uin":"%s"}},"comm":{"uin":%s}}'%(guid,guid,songmid,uin,uin)
res = self.getPage(keyUrl,headers=self.headers)
html = res.text
keyjs = json.loads(html)
purl = keyjs['req_0']['data']['midurlinfo'][0]['purl']
# 拼凑资源url
url = 'http://dl.stream.qqmusic.qq/' + purl
self.musicList.append((name,url))
print('资源地址获取成功')
# 下载音乐
def downloadMusic(self):
for m in self.musicList:
url = m[1]
res = self.getPage(url,headers=self.headers)
music = res.content
name = m[0] + '.mp3'
with open(name, 'wb') as f:
f.write(music)
print('下载OK')
f.closed
QQ = QQmusic()
QQ.getSongmid()
QQ.getVkey()
QQ.downloadMusic()
更多推荐
最新爬取QQ音乐
发布评论