目标

这次要爬取的是qq音乐网站【排行榜】中所有的歌曲(共100首)
网址:https://y.qq.com/n/yqq/toplist/4.html#stat=y_new.top.pop.logout

废话不多说,直接开始吧!

接口分析

点击排行榜页面中的任意一首歌,进入到播放界面。

打开开发者工具,重新刷新网页,寻找歌曲下载接口
找呀找,找呀找
发现许多media类型的,选择size最大的那条,点击进去。
果然,找到了歌曲下载的url:
http://124.232.155.149/amobile.music.tc.qq.com/C400101A9o5D1EWzyd.m4a?guid=5300073565&vkey=30F12E95C394B1C0550AAAC8E946191E757BB8190B983FA1E13E7C0EEF6CE49AC1C051CB2922C371F7EBA77B8C36DA7F0BB3D85819525C75&uin=0&fromtag=66

然后,分析下这个url的构造:
和其他的歌曲对比,只有m4a文件名和vkey这两个参数不一致
所以,我们要找的就是这两个参数。
那么到底从何而来呢?

又找啊找,找啊找
终于发现了!找到了vkey!

接着找m4a文件名
找啊找,找啊找
咦!好像有新发现!
purl中好像已经包含了m4a文件名和vkey!
没错,就是purl了!
实际上,歌曲下载的url就是 http://124.232.155.149/amobile.music.tc.qq.com/+purl

接下来,就是要分析purl是怎么来的了
分析请求的url:

还是老办法,和其他的歌曲对比。(此处省略复杂繁琐对比。。。)
发现只有songmid这个参数不一致
所以,要分析的就是songmid是从哪个接口过来的。
再次回到排行榜页面
找啊找 找了很久 终于发现了!

最后,再分析下songmid的请求url:
https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcg?tpl=3&page=detail&date=2018-12-14&topid=4&type=top&song_begin=0&song_num=30&g_tk=5381&jsonpCallback=MusicJsonCallbacktoplist&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0
song_num是指定请求多少条数据。
由于我们要下载所有的歌曲(共100首),所以要将song_num改成100

完整代码

#目标:下载qq音乐排行榜前100首
#思路:
#1.歌曲下载链接url1:http://124.232.144.154/amobile.music.tc.qq.com/C400101A9o5D1EWzyd.m4a?guid=5300073565&vkey=B1A12B2E4190CB21134F652893BEEF69AE405D39E060DEEACF358A6F729541E160F926F5EADD391C68047B2ED0156690A97CA50AC99DA40D&uin=0&fromtag=66
#2.寻找下载链接中的参数filname:C400101A9o5D1EWzyd.m4a    vkey
#3.filname与vkey的请求链接url2:https://u.y.qq.com/cgi-bin/musicu.fcg?callback=getplaysongvkey2904725697971273&g_tk=5381&jsonpCallback=getplaysongvkey2904725697971273&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0&data=%7B%22req%22%3A%7B%22module%22%3A%22CDN.SrfCdnDispatchServer%22%2C%22method%22%3A%22GetCdnDispatch%22%2C%22param%22%3A%7B%22guid%22%3A%225300073565%22%2C%22calltype%22%3A0%2C%22userip%22%3A%22%22%7D%7D%2C%22req_0%22%3A%7B%22module%22%3A%22vkey.GetVkeyServer%22%2C%22method%22%3A%22CgiGetVkey%22%2C%22param%22%3A%7B%22guid%22%3A%225300073565%22%2C%22songmid%22%3A%5B%22001A9o5D1EWzyd%22%5D%2C%22songtype%22%3A%5B0%5D%2C%22uin%22%3A%220%22%2C%22loginflag%22%3A1%2C%22platform%22%3A%2220%22%7D%7D%2C%22comm%22%3A%7B%22uin%22%3A0%2C%22format%22%3A%22json%22%2C%22ct%22%3A20%2C%22cv%22%3A0%7D%7D
#4.url2的构造:songmid
#5.寻找songmid:
# songmid请求的链接url3:https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcg?tpl=3&page=detail&date=2018-12-14&topid=4&type=top&song_begin=0&song_num=30&g_tk=5381&jsonpCallback=MusicJsonCallbacktoplist&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0import requests
import re
import json
from multiprocessing.dummy import Pool as ThreadPool#返回songmid和songname
def get_param():url = 'https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcg?tpl=3&page=detail&date=2018-12-14&topid=4&type=top&song_begin=0&song_num=100&g_tk=5381&jsonpCallback=MusicJsonCallbacktoplist&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0'response = requests.get(url).content.decode('utf-8')purl_data = re.findall(r'\w+\((.*)',response)[0]data_json = json.loads(purl_data)songlist = data_json['songlist']param_list = []for item in songlist:param_dict = {}songmid = item['data']['songmid']songname = item['data']['songname']param_dict['songmid'] = songmidparam_dict['songname'] = songnameparam_list.append(param_dict)return param_list#下载音乐
def download_music(param_dict):songmid = param_dict['songmid']songname = param_dict['songname']data =json.dumps({"req": {"module": "CDN.SrfCdnDispatchServer","method": "GetCdnDispatch","param": {"guid": "5300073565","calltype": 0,"userip": ""}},"req_0": {"module": "vkey.GetVkeyServer","method": "CgiGetVkey","param": {"guid": "5300073565","songmid": [songmid],"songtype": [0],"uin": "0","loginflag": 1,"platform": "20"}},"comm": {"uin": 0,"format": "json","ct": 20,"cv": 0}})url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?callback=getplaysongvkey2904725697971273&g_tk=5381&jsonpCallback=getplaysongvkey2904725697971273&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0&data={}'.format(data)response = requests.get(url).content.decode('utf-8')purl_data = re.findall(r'\w+\((.*)\)',response)[0]data_json = json.loads(purl_data)purl = data_json['req_0']['data']['midurlinfo'][0]['purl']download_url = 'http://124.232.144.154/amobile.music.tc.qq.com/{}'.format(purl)print("=======正在下载:{}=======".format(songname))music = requests.get(download_url)with open("F:\BaiduNetdiskDownload\QQmusic\music\{}.m4a".format(re.sub(r'[\s+|@<>:\\"/]','',songname)),"wb") as m:m.write(music.content)if __name__ == '__main__':param_list = get_param()pool = ThreadPool(5)pool.map(download_music,param_list)pool.close()pool.join()

运行效果

下载完的歌曲:

现在终于可以听歌了!
听着听着。。。发现有个别歌曲文件大小居然是0KB
原来,VIP音乐没下载下来。

python爬虫-批量下载qq音乐相关推荐

  1. 【爬虫实战项目】Python爬虫批量下载音乐飙升榜并保存本地(附源码)

    前言 今天给大家介绍的是Python爬虫批量下载音乐飙升榜并保存本地,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是 ...

  2. python爬虫批量下载“简谱”

    python讨论qq群:996113038 导语: 上次发过一篇关于"python打造电子琴"的文章,从阅读量来看,我们公众号的粉丝里面还是有很多对音乐感兴趣的朋友的.于是,今天我 ...

  3. 新一配:perl循环调用python爬虫批量下载喜马拉雅音频

    新一配:perl循环调用python爬虫批量下载喜马拉雅音频 手机下载喜马拉雅音频后,获得的音频文件虽然可以转成mp3格式,但其文件名却是一长串字符串,无法辨别是哪一集,网上找了各种工具,都有局限性, ...

  4. 【爬虫实战项目】Python爬虫批量下载评书音频并保存本地(附源码)

    前言 今天给大家介绍的是Python爬虫批量下载评书音频并保存本地,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这 ...

  5. python爬虫实战——运用requests批量下载qq音乐

    python -qq音乐爬取 在学习一段时间后,在视频的讲解下,觉得自己掌握的不错,就开始了这一次的qq音乐的爬取,在爬取的过程中发现了很多问题.知识点掌握的不够,知识点掌握的不熟,例如:正则表达式的 ...

  6. Python爬虫实战,QQ音乐爬取全部歌曲

    前景介绍 最近小伙伴们听歌的兴趣大涨,网抑云综合症已经遍布各地. 咱们再来抬高一波QQ音乐的热度吧. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里 ...

  7. python爬虫 批量下载高清大图

    文章目录 前言 下载免费高清大图 下载带水印的精选图 代码与总结 前言 在上一篇写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片!中,我们在未登录的情况下实现了图虫创意无水印高清小 ...

  8. 第二弹!python爬虫批量下载高清大图

    文章目录 前言 下载免费高清大图 下载带水印的精选图 代码与总结 前言 在上一篇写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片!中,我们在未登录的情况下实现了图虫创意无水印高清小 ...

  9. python爬虫批量下载图片

    使用python的urllib库和正则表达式爬取 学习地址(自行base64解密):aHR0cDovL3BpYy5uZXRiaWFuLmNvbQ== 网站图片,支持批量下载. (本文仅供学习交流,请勿 ...

  10. python爬虫爬取qq音乐热歌榜的歌曲到本地

    文章目录 项目目标 具体实现步骤 完整代码 运行结果 项目目标 爬取qq音乐热歌榜https://y.qq.com/n/yqq/toplist/26.html到本地文件夹 具体实现步骤 程序思路:用s ...

最新文章

  1. Android 应用程序集成Google 登录及二次封装
  2. java 报表导出_Java Excel报表导出Demo
  3. you need to build uWSGI with SSL support to use the websocket handshake api function !!!
  4. iOS使用AVCaptureSession自定义相机
  5. ActiveMQ集群
  6. leetcode 521. 最长特殊序列 Ⅰ(Java)
  7. hdu 1879 继续畅通工程 (最小生成树)
  8. 来及Java空间的传送门2
  9. transferwise怎么提现_收款工具transfer wise介绍(多币种、可收CJ联盟)
  10. cmake 学习笔记(四)
  11. Windows二进制文件合并工具
  12. SECS/GEM开发指导
  13. 自定义控件属性英文类别
  14. html中怎么做弹窗广告,基于JQuery实现页面定时弹出广告
  15. 北大计算机就业报告,北京大学信息科学技术学院解读和毕业生就业统计
  16. 医院管理系统数据库,课程设计,SQLserver,纯代码设计
  17. MySQL Join 优化
  18. 工作如何避免情绪内耗
  19. 注意力机制-多头注意力
  20. 小明左、右手中分别拿两张纸牌(比如:黑桃10和红桃8,数字10和8可通过键盘录入),要求编写代码交换小明手中的牌

热门文章

  1. Python入门基础篇 No.26 —— 列表_复制列表_排序_revered逆序_max_min_sum
  2. DAOS ARM64调测之旅
  3. Solr分组聚合查询之Facet
  4. 关键词推荐工具中的用户引导机制之三:相关搜索query技术
  5. python任务编排_基于DAG实现的任务编排框架平台
  6. 等了两年半!计算机专硕重大改革!不再只是电子信息了!
  7. 澳洲计算机专业几年,澳洲计算机硕士几年
  8. 对称算法与非对称算法
  9. java 将多个文件打包成压缩包下载
  10. android 4.4 录屏方法,android 4.4 录屏方法