python3爬取qq音乐并下载

本文参考Python 爬取qqmusic音乐url并批量下载

同学找我爬取一下qq音乐播放链接,包括歌词等信息打包成json,试了一下可以爬取。

一、找到qq音乐播放的url

1.找到搜索页面返回的数据包

歌曲最终的播放链接时经过多次拼接的,首先找到qq音乐搜索歌曲界面,https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%E5%91%A8%E6%9D%B0%E4%BC%A6

右键-检查-刷新-点击Network,ctrl+f,在控制台右面搜索第一首歌就会出现这个界面返回的json包

这个请求的链接是:

url1:https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=64791389917821519&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&jsonpCallback=MusicJsonCallback4053122785448291&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0

这个链接中有两个关键字,n和w,分别是请求返回的歌曲条数和请求的歌曲名或歌手名,这是第一个链接。(w是unicode字符,我感觉直接中文也可以)

2.获得返回的数据包后开始解析

url1返回的数据包把头部 MusicJsonCallback4053122785448291 去掉后如下格式:

从返回的数据包中提取mid和strMediaMid,然后组合到第二个url中

url2:

‘https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?&jsonpCallback=MusicJsonCallback&cid=205361747&songmid=‘ + mid + ‘&filename=C400‘ + strMediaMid + ‘.m4a&guid=6612300644‘

这个链接如果在浏览器打开会下载一个文件 fcg_music_express_mobile3.fcg 打开之后可以看到vkey:

{"code":0,"cid":205361747,"userip":"183.197.0.92","data":{"expiration":80400,"items":[{"subcode":0,"songmid":"002eTq6539AsfN","filename":"C400001GuWCx14Gng9.m4a","vkey":"1F051B9378DC2CD04C0B6D2257E40D0F03E6FA042D076E462FEFF6534EFA4B579A47F084811B4BE893006805A9439224D286200FDE1598D0"}]}}

3.将url2获取的 vkey 和 strMediaMids 一起组合成最终的url

url3:  http://dl.stream.qqmusic.qq.com/C400‘ + strMediaMids[n] + ‘.m4a?vkey=‘ + vkey + ‘&guid=6612300644&uin=0&fromtag=66

最终url(可以打开):http://dl.stream.qqmusic.qq.com/C400001GuWCx14Gng9.m4a?vkey=1F051B9378DC2CD04C0B6D2257E40D0F03E6FA042D076E462FEFF6534EFA4B579A47F084811B4BE893006805A9439224D286200FDE1598D0&guid=6612300644&uin=0&fromtag=66

二、下载歌曲

有了url下载就很简单了,用urllib.request.urlretrieve()下载。

urllib.request.urlretrieve(url, ‘F:\music\\‘+data[key][‘歌名‘]+‘.m4a‘)

源码

源码中加入了保存json文件,方便调用读取。

  1 import json
  2 import requests
  3 import re
  4 import urllib
  5 import time
  6
  7 def parse(keyword,num):
  8     #keyword:要搜索的歌名或者歌手名,num:搜索结果的条数
  9     url = ‘https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song‘  10           ‘&searchid=57124856116396257&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&‘  11           ‘n=‘+str(num)+‘&w=‘+str(keyword)+‘&g_tk=5381&jsonpCallback=MusicJsonCallback3695372008103126‘  12           ‘&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0‘
 13     print(url)
 14     #添加user-agent
 15     head = {‘user-agent‘:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36‘}
 16
 17     #第一次返回:MusicJsonCallback3695372008103126包
 18     response = requests.get(url, headers=head)
 19     response = response.text.strip("MusicJsonCallback3695372008103126()[]")
 20
 21     #解析json
 22     json_data = json.loads(response)
 23     print(json_data)
 24
 25     json_data = json_data[‘data‘][‘song‘][‘list‘]
 26     print(json_data)
 27     strMediaMids = []
 28     songmids = []
 29     srcs = {}
 30     songnames = []
 31     singers = []
 32     albumns = []
 33     songid = []
 34     #遍历所获取的列表,找到歌曲信息存储在list中
 35     for data in json_data:
 36         try:
 37             strMediaMids.append(data[‘file‘][‘strMediaMid‘])
 38             songmids.append(data[‘mid‘])
 39             songnames.append(data[‘name‘])
 40             singers.append(data[‘singer‘][0][‘name‘])
 41             albumns.append(data[‘album‘][‘name‘])
 42             songid.append(data[‘id‘])
 43         except:
 44             print(‘wrong‘)
 45
 46     #将获取到的信息二次组装成url
 47     for n in range(0,len(strMediaMids)):
 48
 49         #将strMediaMids和songmids重新组合到url中
 50         url2 = ‘https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?&jsonpCallback=MusicJsonCallback&cid=205361747&songmid=‘ + songmids[n] + ‘&filename=C400‘ + strMediaMids[n] + ‘.m4a&guid=6612300644‘
 51         #获取返回文件并解析得到vkey
 52         response2 = requests.get(url2)
 53         json_data2 = json.loads(response2.text)
 54         vkey = json_data2[‘data‘][‘items‘][0][‘vkey‘]
 55         #这是最终的歌曲url
 56         song_url = ‘http://dl.stream.qqmusic.qq.com/C400‘ + strMediaMids[n] + ‘.m4a?vkey=‘ + vkey + ‘&guid=6612300644&uin=0&fromtag=66‘
 57
 58         # 获取歌词文本
 59         refer = ‘https://y.qq.com/n/yqq/song/‘ + songmids[n] + ‘.html‘
 60         head = {
 61             ‘user-agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36‘,
 62             ‘Referer‘: refer}
 63         lyric_url = ‘https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric.fcg?nobase64=1&musicid=‘  64                     + str(songid[n]) + ‘&callback=jsonp1&g_tk=5381&jsonpCallback=jsonp1&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0‘
 65         response3 = requests.get(lyric_url, headers=head).text
 66         json_data3 = response3.strip(‘ jsonp1()[]‘)
 67         print(json_data3)
 68         jsonp1 = json.loads(json_data3)
 69         try:
 70             lyric = jsonp1[‘lyric‘]
 71         except:
 72             print(‘wrong‘)
 73         # print(lyric)
 74
 75         # result = re.findall(r‘[\u4e00-\u9fa5]+‘, lyric)
 76         # lyric = ‘ ‘.join(result)
 77         data = {}
 78         data[‘歌手‘] = singers[n]
 79         data[‘歌名‘] = songnames[n]
 80         data[‘专辑‘] = albumns[n]
 81         data[‘url‘] = song_url
 82         data[‘lyric‘] = lyric
 83         data[‘songmid‘] = songmids[n]
 84         data[‘strMediaMids‘] = strMediaMids[n]
 85         data[‘songid‘] = songid[n]
 86         srcs[n] = data
 87     with open(str(keyword)+‘.json‘, ‘w‘,encoding=‘utf-8‘) as f:
 88         json.dump(srcs, f)
 89
 90
 91
 92 def download(keyword):
 93     with open(keyword+‘.json‘,‘r‘) as f:
 94         data = json.load(f)
 95     # print(data)
 96     for key in data:
 97         time.sleep(1)
 98         url = data[key][‘url‘]
 99         # print(url)
100         print(‘正在下载:‘,data[key][‘歌名‘],‘......‘)
101         try:
102             urllib.request.urlretrieve(url, ‘F:\music\\‘+data[key][‘歌名‘]+‘.m4a‘)
103             # with open(str(data[key][‘歌名‘])+‘-‘+str(data[key][‘歌手‘])+‘.m4a‘,‘w‘) as f:
104             #     f.write(requests.get(url).content)
105         except:
106             print(‘下载‘+data[key][‘歌名‘]+‘失败‘)
107     print(‘下载完成!‘)
108
109
110 keyword = ‘周杰伦‘
111 num = 1
112 parse(keyword, num)
113 download(keyword)

有错误欢迎指正!

原文地址:https://www.cnblogs.com/szj22233060/p/10041335.html

时间: 2024-08-29 23:15:55

python3爬取qq音乐并下载的相关文章

python3 爬取qq音乐作者所有单曲 并且下载歌曲

1 import requests 2 import re 3 import json 4 import os 5 6 7 8 # 便于存放作者的姓名 9 zuozhe = [] 10 11 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'} 12 13 14 def ge

python 爬取QQ音乐

import requests import json import os import threading #发送请求获取信息 def get_response(url): headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' } response =

手把手教你使用Python抓取QQ音乐数据!

[一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐数据(第二弹)我们实现了获取 QQ 音乐指定歌曲的歌词和指定歌曲首页热评. 通过手把手教你使用Python抓取QQ音乐数据(第三弹)我们实现了获取更多评论并生成词云图. 此次我们将将三个项目封装在一起,通过菜单控制爬取不同数据. [二.需要的库] 主要涉及的库有:requests.openpyxl.

【个人】爬虫实践,利用xpath方式爬取数据之爬取虾米音乐排行榜

实验网站:虾米音乐排行榜 网站地址:http://www.xiami.com/chart 难度系数:★☆☆☆☆ 依赖库:request.lxml的etree (安装lxml:pip install lxml) IDEA开发工具:PyCharm_2017.3 Python版本:Python3 期望结果:爬取出排行版歌名以及对应歌手 运行效果图: 音乐排行榜: 爬取数据结果图: 像这种简单的爬取就没必要使用Scrapy框架进行处理,是在有点大材小用,不过如果你刚开始学Scrapy的话,拿这些简单的练

python3爬取女神图片,破解盗链问题

title: python3爬取女神图片,破解盗链问题 date: 2018-04-22 08:26:00 tags: [python3,美女,图片抓取,爬虫, 盗链] comments: true 前言 其实,抓取图片和抓取小说内容没有任何本质的区别,步骤都是一样的. 但是图片读取的时候,会遇到一个盗链问题.这个问题是花的解决时间最长的. 环境 语言: python3 操作系统: mac 10.12.16 自定义工具包:soup_tool 其依赖工具如下: from urllib import

python爬虫爬取QQ说说并且生成词云图,回忆满满!

Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务.它的语法非常简捷和清晰,与其它大多数程序设计语言不一样,它使用缩进来定义语句. Python支持命令式程序设计.面向对象程序设计.函数式编程.面向切面编程.泛型编程多种编程范式.与Scheme.Ruby.Perl.Tcl等动态语言一样,Python具备垃圾回收

Python3爬取今日头条有关《人民的名义》文章

Python3爬取今日头条有关<人民的名义>文章 最近一直在看Python的基础语法知识,五一假期手痒痒想练练,正好<人民的名义>刚结束,于是决定扒一下头条上面的人名的名义文章,试试技术同时可以集中看一下大家的脑洞也是极好的. 首先,我们先打开头条的网页版,在右上角搜索框输入关键词,通过chrome调试工具,我们定位到头条的search栏调用的的API为: http://www.toutiao.com/search_content/?offset=0&format=json

python3爬取网页

爬虫 python3爬取网页资源方式(1.最简单: import'http://www.baidu.com/'print2.通过request import'http://www.baidu.com'print1.import urllib.request 'wd''python''opt-webpage''on''ie''gbk'GET和POST请求的不同之处是POST请求通常有"副作用" 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)

Python爬虫:现学现用Xpath爬取豆瓣音乐

爬虫的抓取方式有好几种,正则表达式,Lxml(xpath)与Beautiful,我在网上查了一下资料,了解到三者之间的使用难度与性能 三种爬虫方式的对比. 抓取方式 性能 使用难度 正则表达式 快 困难 Lxml 快 简单 BeautifulSoup 慢 简单 这样一比较我我选择了Lxml(xpath)的方式了,虽然有三种方式,但肯定是要选择最好的方式来爬虫,这个道理大家都懂,另外有兴趣的朋友也可以去了解另外两种爬虫方式! 好了现在来讲讲xpath 由于Xpath属于lxml模块,所以首先需要安