python爬取qq音乐免费歌曲 2020.7.26
目标分析
做一个音乐爬虫。输入关键词,获取音乐列表与音乐下载连接
获取音乐列表
1.浏览器网络请求追踪
要做爬虫,必须要学会追踪网络请求,我用的是新版edge浏览器。打开qq音乐搜索界面右击空白处,选择检查。右边会出现开发者工具栏,先把缓存禁用了。
第一步点击红圈旁边的清除按钮,把刚刚的请求记录都清除了,刷新一遍网页,开发者栏出现了众多的请求,我们需要的任何信息都在里面
2.寻找音乐列表
找这种东西我没什么办法,一个个点开从预览中看看,
从这次的经验来看,
media类型获取音乐,视频;
script :js脚本
xhr:传递数据
我们要找的列表就是xhr类型
点击clien_search*****这个请求,预览中我们可以看到搜索到的歌曲的相关信息。因为你们已经知道了,所以你们可以直接在筛选器里面输入client_search查找这个请求,不必一个个找。
这个请求里的数据有什么用,后面会用到。
我们看看这个请求的标头,请求url为
[https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=61540511995365928&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=%E7%A5%9E%E8%AF%9D&g_tk_new_20200303=2012260984&g_tk=2012260984&loginUin=2925549673&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0]
这是编码过的url,我们需要解码一下,网上有许多url在线解码网站,我随便找了个
http://tool.chinaz.com/tools/urlencode.aspx
解码后是这样的
https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=61540511995365928&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=神话&g_tk_new_20200303=2012260984&g_tk=2012260984&loginUin=2925549673&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0
https是协议
c.y.qq.com是主机
soso/fcgi-bin/client_search_cp是路径
?后面全是参数
&表示与的关系,用&分割的参数不分先后顺序
这些组成了一个合格的url
请求的参数解析
w=搜索关键词
loginuin=qq号
format=返回数据的格式
p=是否分页
n=请求数量
参数有些是必须的,有些是可选的,哪些可选你们可以自己试试
用这个url可以得到音乐列表的json格式,我们可以用python导入json包来解析数据。也可以使用json在线解析网站,随便找了个
https://www.bejson.com/explore/index_new/
解析qq音乐
接下来是获取下载链接,打开歌曲播放页面,刷新,追踪网络请求,选择查看meidia类型的请求
这是我用新版edge浏览器分析的截图,很明显3.4m大小的那个请求一定包含了歌曲下载链接
1.下载连接组成
打开上边的请求,
url(解码后)为
https://ws.stream.qqmusic.qq.com/C400000k9jj51TOfNy.m4a?guid=659244375&vkey=71F5A262A9FB4DBCC2762A18AB1A5BE40951EE2D94FBDF5C0F66DA77BF24DD2B64D5170E9761C2159C5D514DC99C0AA05EBFDE9171BD7223&uin=0&fromtag=66
问题来了
这个url经我测试
它的路径,参数都是不一样的
主机 | ws.stream.qqmusic.qq.com | 大部分歌曲都是,少部分不是 |
---|---|---|
路径 | C400000k9jj51TOfNy.m4a | 每首歌都不一样,文件名 |
guid | 659244375 | 疑似不固定,在我的pc上一直都是这个 |
vkey | 71F5A262A9FB***** | 非常长,每首歌一个 |
uin | 0 | 非必要 |
fromtag | 66 | 固定 |
所以说至少我们需要获取
vkey与路径才能得到下载链接
2.获取vkey
在筛选栏里输入vkey
找到了获取vkey的请求
同时在返回的数据里还包括了路径名,主机,guid。也就是说通过这个请求,我们可以拼出下载链接
而这个请求需要什么参数呢?
https://u.y.qq.com/cgi-bin/musics.fcg?-=getplaysongvkey5121797630605007&g_tk=2012260984&sign=zza2bkkmehc578lfnfhfbe4b20a449f79fe6ba709c01e6a1b11&loginUin=2925549673&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0&data={“req”:{“module”:“CDN.SrfCdnDispatchServer”,“method”:“GetCdnDispatch”,“param”:{“guid”:“659244375”,“calltype”:0,“userip”:""}},“req_0”:{“module”:“vkey.GetVkeyServer”,“method”:“CgiGetVkey”,“param”:{“guid”:“659244375”,“songmid”:[“004Vl6HS0IKK6a”],“songtype”:[0],“uin”:“2925549673”,“loginflag”:1,“platform”:“20”}},“comm”:{“uin”:2925549673,“format”:“json”,“ct”:24,“cv”:0}}
这里面需要设置的参数只有两个:sign与data{}
在data{}里面需要设置guid(固定的),songmid,uin
其中uin是qq号,songmid在音乐列表里可以找到(获取音乐列表->寻找音乐列表)
最后的问题就只有一个 如何获取sign参数
3.获取sign参数
凭我的烂文笔与知识水平讲不明白,给你们个链接自己看
https://blog.csdn.net/weixin_44159306/article/details/106292092
总的来说就是要调用一下js脚本得出sign参数
如何调用js脚本
https://blog.csdn.net/IKNOWNU/article/details/83784146
关系图
python代码
https://download.csdn.net/download/riverfisher2000/12663387
上传源码被说是,‘版权投诉’等等看把