python爬取付费⾳乐包_python爬⾍如何下载QQ⾳乐付费歌曲
2020最新版
最近想写⼀个QQ⾳乐的API接⼝,为了省事先到⽹上查了资料,发现很多都是不能⽤的,估计官⽅进⾏了升级,算了,还是⾃⼰来吧。
1. 如何下载付费歌曲
打开QQ⾳乐,任意搜索⼀⾸歌曲,发现歌曲需要收费:
但我们可是优秀的爬⾍⼯程师,要看底层的东
西。
打开⽹页版QQ⾳乐,搜索该歌曲会显⽰如下页⾯:
点击第⼀⾸:
这样就来到了播放页⾯,然后打开开发者选项,在network选项卡中按ctrl+R展⽰所有的交互⽂件。然后第⼀步当然是检查⽹页源代码啦,因为歌曲URL通常会包含在源代码中,如图
所⽰在源代码中查URL可能⽐较繁琐,但只
要细⼼就能发现⼀些蛛丝马迹,如图:
网页版音乐播放器这个节点中包含了⼀串m4a⽂件的URL,实际上QQ⾳乐下载的⽂件⼤多数是m4a格式的,当我们打开这个URL之后,果然就是歌曲⽂件:
那么我们只要得到任意歌曲的URL就能通过请求库直接下载了。但是在那之前我们需要取得播放页⾯的URL,因为歌曲URL是包含在播放页⾯的源代码中的,我们可以看到播放页⾯URL为:
其中ADTAG是固定参数,需要注意的是songmid,它指定每⾸歌曲的唯⼀id,如果要寻songmid,我们可能要前往搜索页⾯,因为这个参数很可能包含在我们按下搜索键后服务器的返回值中。
但遗憾的是,我们并没有在搜索页⾯源代码中发现任何歌曲信息,这说明歌曲信息很可能是以XHR格式传输的,这也很符合⽹站设计的规范。
终于在⼀个XHR⽂档中我们发现了搜索结果:
list中的每个值都是⼀个搜索结果,展开之后就能看到歌曲的mid:
然后再看看页⾯的URL:
其中有很多参数,但是我经过多次验证发现,只有w参数是必须的,如图:
这其实给我们提供了很多⽅便。
那么我们先梳理⼀下流程,我们需要传递⼀个w歌曲名参数到搜索页⾯中,在搜索结果中到歌曲mid,
获得歌曲页⾯源代码,在源码的audio节点中到歌曲URL,最后下载保存到⽂件中。
import requests
from urllib.parse import unquote, quote
from pyquery import PyQuery as pq
class Music():
def __init__(self):
self.headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Mobile Safari/537.36'
}
def download_music(self, sone_name):
'''定义下载⽂件⽅法'''
<_sonmid(sone_name)
def get_sonmid(self, sone_name):
'''获取⽂件ID'''
url = 'c.y.qq/soso/fcgi-bin/client_search_cp?
ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1 {0}&g_tk_new_20200303=5381&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-
8¬ice=0&platform=yqq.json&needNewCode=0'.format(quote(sone_name))
#搜索页⾯URL
resp = (url, headers=self.headers)
#返回搜索列表
resp_dic = resp.json()
<_songloc(resp_dic['data']['song']['list'][0]['mid'])
#获得结果中第⼀⾸歌曲ID
def get_songloc(self, mid):
'''获得歌曲⽂件链接并下载'''
url = 'i.y.qq/v8/playsong.html?ADTAG=newyqq.song&songmid={0}'.format(mid)
#通过mid构建播放页⾯URL
resp = (url, headers=self.headers)
#返回HRML⽂档树
doc = )
audio = doc('audio')
#获得audio节点
medio_url = audio.attr('src')
#获得歌曲⽂件URL
print(medio_url)
resp = (medio_url, headers=self.headers)
with open('music.m4a', 'wb+') as f:
f.t)#保存⼆进制⽂件
if __name__ == '__main__':
music = Music()
song_name = input('请输⼊歌曲名:')
music.download_music(song_name)
运⾏以上代码后,在控制台输⼊“⼗年”,我们可以看到控制台成功输出了歌曲⽂件的URL:
同时在本⽬录下将歌曲保存了下来:
⽤QQ⾳乐播放器打开后:成功
播放!
但是该⽅法只能下载⼤部分的付费歌曲和免费歌曲,还有少部分的试听歌曲会解析失败,因为官⽅重构了这部分歌曲的播放页⾯,需要登陆并且传递⽤户信息。在此记录⼀下,解决个问题之后再重新发张帖⼦。
如果你觉得⽂章对你有帮助,可以关注“机器图腾”,⾥⾯有免费的⽹络爬⾍教程以及python学习资源,每周不定时更新⼀些有趣的python⼩项⽬。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论