最近想写一个QQ音乐的API接口,为了省事先到网上查了资料,发现很多都是不能用的,估计官方进行了升级,算了,还是自己来吧。

1. 如何下载付费歌曲

打开QQ音乐,任意搜索一首歌曲,发现歌曲需要收费:但我们可是优秀的爬虫工程师,要看底层的东西。

打开网页版QQ音乐,搜索该歌曲会显示如下页面:点击第一首:这样就来到了播放页面,然后打开开发者选项,在network选项卡中按ctrl+R展示所有的交互文件。然后第一步当然是检查网页源代码啦,因为歌曲URL通常会包含在源代码中,如图所示在源代码中查找URL可能比较繁琐,但只要细心就能发现一些蛛丝马迹,如图:

这个节点中包含了一串m4a文件的URL,实际上QQ音乐下载的文件大多数是m4a格式的,当我们打开这个URL之后,果然就是歌曲文件:那么我们只要得到任意歌曲的URL就能通过请求库直接下载了。但是在那之前我们需要取得播放页面的URL,因为歌曲URL是包含在播放页面的源代码中的,我们可以看到播放页面URL为:

https://i.y.qq.com/v8/playsong.html?ADTAG=newyqq.song&songmid=001OyHbk2MSIi4

其中ADTAG是固定参数,需要注意的是songmid,它指定每首歌曲的唯一id,如果要寻找songmid,我们可能要前往搜索页面,因为这个参数很可能包含在我们按下搜索键后服务器的返回值中。

但遗憾的是,我们并没有在搜索页面源代码中发现任何歌曲信息,这说明歌曲信息很可能是以XHR格式传输的,这也很符合网站设计的规范。

终于在一个XHR文档中我们发现了搜索结果:list中的每个值都是一个搜索结果,展开之后就能看到歌曲的mid:然后再看看页面的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=64979681270102176&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=%E5%8D%81%E5%B9%B4&g_tk_new_20200303=5381&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0

其中有很多参数,但是我经过多次验证发现,只有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):

'''定义下载文件方法'''

self.get_sonmid(sone_name)

def get_sonmid(self, sone_name):

'''获取文件ID'''

url = 'https://c.y.qq.com/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&n=10&w={0}&g_tk_new_20200303=5381&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0'.format(quote(sone_name))

#搜索页面URL

resp = requests.get(url, headers=self.headers)

#返回搜索列表

resp_dic = resp.json()

self.get_songloc(resp_dic['data']['song']['list'][0]['mid'])

#获得结果中第一首歌曲ID

def get_songloc(self, mid):

'''获得歌曲文件链接并下载'''

url = 'https://i.y.qq.com/v8/playsong.html?ADTAG=newyqq.song&songmid={0}'.format(mid)

#通过mid构建播放页面URL

resp = requests.get(url, headers=self.headers)

#返回HRML文档树

doc = pq(resp.text)

audio = doc('audio')

#获得audio节点

medio_url = audio.attr('src')

#获得歌曲文件URL

print(medio_url)

resp = requests.get(medio_url, headers=self.headers)

with open('music.m4a', 'wb+') as f:

f.write(resp.content)#保存二进制文件

if __name__ == '__main__':

music = Music()

song_name = input('请输入歌曲名:')

music.download_music(song_name)

运行以上代码后,在控制台输入“十年”,我们可以看到控制台成功输出了歌曲文件的URL:

http://aqqmusic.tc.qq.com/amobile.music.tc.qq.com/C400002AIxAT3HZwiA.m4a?guid=7223831426&vkey=B2EF54EF4C8F2FA2B6544984A54B071B623702999E1DAE7DD355884D595CAACC79D4C54C4AA8890CB3BE98760092825D9E46CEF4139DDFB6&uin=0&fromtag=38

同时在本目录下将歌曲保存了下来:

用QQ音乐播放器打开后:成功播放!

但是该方法只能下载大部分的付费歌曲和免费歌曲,还有少部分的试听歌曲会解析失败,因为官方重构了这部分歌曲的播放页面,需要登陆并且传递用户信息。在此记录一下,解决个问题之后再重新发张帖子。

如果你觉得文章对你有帮助,可以关注微信公众号“机器图腾”,里面有免费的网络爬虫教程以及python学习资源,每周不定时更新一些有趣的python小项目。

python爬取付费音乐包_python爬虫如何下载QQ音乐付费歌曲2020最新版相关推荐

  1. python爬取数据的原理_Python爬虫原理

    前言 简单来说互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现我们眼前: 一.爬虫是什 ...

  2. python爬取虎扑评论_python爬虫系列Selenium定向爬取虎扑篮球图片详解

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  3. python爬取网页数据软件_python爬虫入门10分钟爬取一个网站

    一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...

  4. python爬取豆瓣电影信息_Python爬虫入门 | 爬取豆瓣电影信息

    这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬 ...

  5. python爬取京东手机参数_python爬虫——分页爬取京东商城商品信息(手机为例)...

    1.最近刚开始学习python   写了个爬虫练习,感觉主要是得会用F12查询网站结构代码.还涉及到反爬虫,每个网站都不一样,拿到的解析出的json数据格式也不同.得有些Web知识的基础才行. htt ...

  6. python爬取大众点评数据_python爬虫实例详细介绍之爬取大众点评的数据

    python 爬虫实例详细介绍之爬取大众点评的数据 一. Python作为一种语法简洁.面向对象的解释性语言,其便捷性.容易上手性受到众多程序员的青睐,基于python的包也越来越多,使得python ...

  7. python爬取新闻后提炼_Python爬虫开发的3大难题,别上了贼船才发现,水有多深...

    写爬虫,是一个非常考验综合实力的活儿.有时候,你轻而易举地就抓取到了想要的数据:有时候,你费尽心思却毫无所获. 好多Python爬虫的入门教程都是一行代码就把你骗上了"贼船",等上 ...

  8. python爬取多页数据_python爬虫实现爬取同一个网站的多页数据代码实例

    本篇文章小编给大家分享一下python爬虫实现爬取同一个网站的多页数据代码实例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 一.爬虫的目的 从网上获 ...

  9. python爬取网上租房信息_Python爬虫入门 | 5 爬取小猪短租租房信息

    小猪短租是一个租房网站,上面有很多优质的民宿出租信息,下面我们以成都地区的租房信息为例,来尝试爬取这些数据. 1.爬取租房标题 按照惯例,先来爬下标题试试水,找到标题,复制xpath. 多复制几个房屋 ...

  10. python爬取公交车站数据_Python爬虫实例_城市公交网络站点数据的爬取方法

    爬取的站点:http://beijing.8684.cn/ (1)环境配置,直接上代码: # -*- coding: utf-8 -*- import requests ##导入requests fr ...

最新文章

  1. CPU的自动调度矩阵乘法
  2. Activity(活动)之Intent(意图)(显式与隐式)的使用
  3. Cache占用过多内存导致Linux系统内存不足问题排查
  4. android闹钟实现原理
  5. C++类模板的三种特化类型
  6. java什么时候需要同步_JAVA中线程在什么时候需要同步和互斥
  7. SQL Server之 (四) ADO增删查改 登录demo 带参数的sql语句 插入自动返回行号
  8. CentOS cannot change locale UTF-8解决方法及设置中文支持
  9. ADO.NET常用命名空间
  10. C#实现文件拖放并打开文件
  11. Windows环境下JDK安装与环境变量配置详细的图文教程
  12. (06)Vivado约束基础
  13. MDK、keil复制中文注释乱码
  14. r求矩阵某一列的标准偏差_如何在R中找到标准偏差?
  15. 【转】Android 平台下使用 i2c-tools
  16. 油猴GM_download使用及下载扩展名flac,油猴脚本修改下载扩展名
  17. GIS应用技巧之制作土地利用转移矩阵表
  18. 试用Google Earth 5中文版(GPS方面)
  19. 《天长地久》写照真实生活为何被影迷埋没不被欣赏
  20. 微观经济学--第4章 供给与需求的市场力量

热门文章

  1. 点播系统加服务器加投影加音响,VOD视频点播系统的安装维护与使用
  2. 第一次使用CoolEdit Pro将歌曲音频做成伴奏
  3. 在Cocos2d-x中使用CocosBuilder
  4. 《算法导论》第四版 电子版 全网第一时间发布eBookhub
  5. 算法资料:算法导论_原书第3版(中文)(PDF带书签)
  6. APUE---chap3文件I/O---3.11原子操作
  7. Android 颜色表
  8. 学生简单个人博客网页DW模板 简单HTML静态网页设计个人主页制作 大学生个人网站模板下载 网页作业个人主页制作
  9. run rhadoop
  10. 史上最全常用正则表达式大全