python爬虫-批量下载qq音乐
目标
这次要爬取的是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¬ice=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¬ice=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¬ice=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¬ice=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¬ice=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音乐相关推荐
- 【爬虫实战项目】Python爬虫批量下载音乐飙升榜并保存本地(附源码)
前言 今天给大家介绍的是Python爬虫批量下载音乐飙升榜并保存本地,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是 ...
- python爬虫批量下载“简谱”
python讨论qq群:996113038 导语: 上次发过一篇关于"python打造电子琴"的文章,从阅读量来看,我们公众号的粉丝里面还是有很多对音乐感兴趣的朋友的.于是,今天我 ...
- 新一配:perl循环调用python爬虫批量下载喜马拉雅音频
新一配:perl循环调用python爬虫批量下载喜马拉雅音频 手机下载喜马拉雅音频后,获得的音频文件虽然可以转成mp3格式,但其文件名却是一长串字符串,无法辨别是哪一集,网上找了各种工具,都有局限性, ...
- 【爬虫实战项目】Python爬虫批量下载评书音频并保存本地(附源码)
前言 今天给大家介绍的是Python爬虫批量下载评书音频并保存本地,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这 ...
- python爬虫实战——运用requests批量下载qq音乐
python -qq音乐爬取 在学习一段时间后,在视频的讲解下,觉得自己掌握的不错,就开始了这一次的qq音乐的爬取,在爬取的过程中发现了很多问题.知识点掌握的不够,知识点掌握的不熟,例如:正则表达式的 ...
- Python爬虫实战,QQ音乐爬取全部歌曲
前景介绍 最近小伙伴们听歌的兴趣大涨,网抑云综合症已经遍布各地. 咱们再来抬高一波QQ音乐的热度吧. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里 ...
- python爬虫 批量下载高清大图
文章目录 前言 下载免费高清大图 下载带水印的精选图 代码与总结 前言 在上一篇写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片!中,我们在未登录的情况下实现了图虫创意无水印高清小 ...
- 第二弹!python爬虫批量下载高清大图
文章目录 前言 下载免费高清大图 下载带水印的精选图 代码与总结 前言 在上一篇写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片!中,我们在未登录的情况下实现了图虫创意无水印高清小 ...
- python爬虫批量下载图片
使用python的urllib库和正则表达式爬取 学习地址(自行base64解密):aHR0cDovL3BpYy5uZXRiaWFuLmNvbQ== 网站图片,支持批量下载. (本文仅供学习交流,请勿 ...
- python爬虫爬取qq音乐热歌榜的歌曲到本地
文章目录 项目目标 具体实现步骤 完整代码 运行结果 项目目标 爬取qq音乐热歌榜https://y.qq.com/n/yqq/toplist/26.html到本地文件夹 具体实现步骤 程序思路:用s ...
最新文章
- Android 应用程序集成Google 登录及二次封装
- java 报表导出_Java Excel报表导出Demo
- you need to build uWSGI with SSL support to use the websocket handshake api function !!!
- iOS使用AVCaptureSession自定义相机
- ActiveMQ集群
- leetcode 521. 最长特殊序列 Ⅰ(Java)
- hdu 1879 继续畅通工程 (最小生成树)
- 来及Java空间的传送门2
- transferwise怎么提现_收款工具transfer wise介绍(多币种、可收CJ联盟)
- cmake 学习笔记(四)
- Windows二进制文件合并工具
- SECS/GEM开发指导
- 自定义控件属性英文类别
- html中怎么做弹窗广告,基于JQuery实现页面定时弹出广告
- 北大计算机就业报告,北京大学信息科学技术学院解读和毕业生就业统计
- 医院管理系统数据库,课程设计,SQLserver,纯代码设计
- MySQL Join 优化
- 工作如何避免情绪内耗
- 注意力机制-多头注意力
- 小明左、右手中分别拿两张纸牌(比如:黑桃10和红桃8,数字10和8可通过键盘录入),要求编写代码交换小明手中的牌
热门文章
- Python入门基础篇 No.26 —— 列表_复制列表_排序_revered逆序_max_min_sum
- DAOS ARM64调测之旅
- Solr分组聚合查询之Facet
- 关键词推荐工具中的用户引导机制之三:相关搜索query技术
- python任务编排_基于DAG实现的任务编排框架平台
- 等了两年半!计算机专硕重大改革!不再只是电子信息了!
- 澳洲计算机专业几年,澳洲计算机硕士几年
- 对称算法与非对称算法
- java 将多个文件打包成压缩包下载
- android 4.4 录屏方法,android 4.4 录屏方法