Python爬虫下载QQ音乐网站歌曲

article/2025/9/14 5:28:23

Python爬虫下载QQ音乐网站歌曲

1.分析QQ音乐网站数据请求url

查询歌曲页面url请求分析

在QQ音乐搜索歌曲页面,通过浏览器调试工具,监测到向服务器发出的请求,获取到的json数据中list正好保存了对应于单页搜索结果的数据。查看请求header,得到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=62072551069125820&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E7%97%B4%E5%BF%83%E6%8D%A2%E6%83%85%E6%B7%B1&g_tk=5381&jsonpCallback=searchCallbacksong2143&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0

在这个url中其它参数可以暂不理会,关键之处在于“&w”这个参数,其后接的是是搜索歌曲名的UTF编码,如此我们便可以构建自己的url。

点击进入播放歌曲页面,继续打开调试工具分析,发现当前播放歌曲的url地址。

歌曲url

http://dl.stream.qqmusic.qq.com/C400004afGuZ2dqj8b.m4a?vkey=1DF82C55AACA1AB90AFC28540E545FF61B3BBC57E7CB196E251CC6F4CD76BAA6EF59478BA1147CBB3FB0CE1E7836415D9BB0C64F82F82E30&guid=2397748896&uin=0&fromtag=66

经过分析,发现这个url结构为http://dl.stream.qqmusic.qq.com/+[歌曲文件名]+.m4a?vkey=+[vkey]+&guid=2397748896&uin=0&fromtag=66

继续观察network请求,发现其中有个get请求会返回当前歌曲的文件名以及vkey字符串

歌曲文件名与vkey

再看看请求header

url请求头

https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=5381&jsonpCallback=MusicJsonCallback7574790907800089&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0&cid=205361747&callback=MusicJsonCallback7574790907800089&uin=0&songmid=003ySAW93jISYE&filename=C400004afGuZ2dqj8b.m4a&guid=2397748896

在这个url中主要看两个参数:songmid和filename

这时再回头看看之前在搜索页得到的json数据

json数据

正好对应上边两个参数中的内容,如此我们便理清了思路,接下来就可以上代码了。

2.编写python代码

Crawler.py文件封装了一些爬虫函数

# -*- coding: utf-8 -*-
#Crawler.py
import urllib
import urllib2
import itertools
import urlparse
import datetime
import cookielib
import time
import reclass Crawler:htmls=[]cookies=cookielib.CookieJar()def download(self,url,headers={'User-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64)'},num_retries=2):print 'Downloading:',url.decode('utf-8'),'\n'request=urllib2.Request(url,headers=headers)try:html=urllib2.urlopen(request).read()except urllib2.URLError as e:print 'Download error:',e.reason,'\n'html=Noneif num_retries > 0:if hasattr(e,'code') and 500 <= e.code < 600:return self.download(url,num_retries=num_retries-1)return htmldef crawl_sitemap(self,url,max_errors=5,delay=0):sitemap=self.download(url)links=re.findall('<loc>(.*?)</loc>',sitemap)mThrottle=Throttle(delay)for link in links:if delay > 0:mThrottle.wait(link)html=self.download(link)self.htmls.append(html)def link_crawler(self,seed_url,link_regex,max_depth=-1,delay=0):crawl_queue=[seed_url]seen={seed_url:0}mThrottle=Throttle(delay)while crawl_queue:url=crawl_queue.pop()depth=seen[url]if delay !=0:mThrottle.wait(url) if depth != max_depth:html=self.download(url)if html is None:continue for link in self.get_links(html):if re.match(link_regex,link):link=urlparse.urljoin(seed_url,link)if link not in seen:seen[link]=depth+1crawl_queue.append(link)def get_links(self,html):webpage_regex=re.compile('<a[^>]+href=["\'](.*?)["\']',re.IGNORECASE)return webpage_regex.findall(html)def ID_crawler(self,url,user_agent='wswp',max_errors=5,delay=0):num_errors=0mThrottle=Throttle(delay)for page in itertools.count(1):if delay > 0:mThrottle.wait(url % page)html=self.download(url % page,user_agent)if html is None:num_errors +=1if num_errors==max_errors:breakelse:num_errors=0self.htmls.append(html)def clear(self):del self.htmls[:]def dynamic_download(self,url,data={},type='POST',headers={'user_agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2717.400 QQBrowser/9.6.11133.400'}):print 'Downloading:',urldata=urllib.urlencode(data)opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies))if type=='POST':request=urllib2.Request(url=url,headers=headers,data=data)else:url=url+'?'+datarequest=urllib2.Request(url=url,headers=headers)html=opener.open(request).read()return htmlclass Throttle:def __init__(self,delay):self.delay=delayself.domains={}def wait(self,url):domain=urlparse.urlparse(url).netloclast_accessed=self.domains.get(domain)if self.delay > 0 and last_accessed is not None:sleep_secs=self.delay-(datetime.datetime.now()-last_accessed).secondsif sleep_secs > 0:time.sleep(sleep_secs)self.domains[domain]=datetime.datetime.now()

MusicCrawler.py文件是实现上诉思路的主要文件

# -*- coding: utf-8 -*-
#MusicCrawler.py
import Crawler
import os
import re
import timeglobal mCount
global song_namemCount=0def write_file(data):global mCountif not os.path.exists("D:/%s/" % song_name.decode('utf-8')):os.mkdir('D:/%s/' % song_name.decode('utf-8'))if not data:returnwith open('D:/%s/%s.m4a' % (song_name.decode('utf-8'),str(mCount)),'wb') as code:code.write(data)    def MusicJsonCallback(e):headers={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Cache-Control':'no-cache','Connection':'keep-alive','Host':'dl.stream.qqmusic.qq.com','Pragma':'no-cache','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2717.400 QQBrowser/9.6.11133.400'}url='http://dl.stream.qqmusic.qq.com/%s?vkey=%s&guid=3218858725&uin=0&fromtag=66' % (e['data']['items'][0]['filename'],e['data']['items'][0]['vkey'])data=mCrawler.download(url,headers=headers)write_file(data)def searchCallbacksong(e):headers={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Cache-Control':'no-cache','Connection':'keep-alive','Host':'dl.stream.qqmusic.qq.com','Pragma':'no-cache','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2717.400 QQBrowser/9.6.11133.400'}for index,item in enumerate(e['data']['song']['list']):global mCountmCount=mCount+1if item['type']==0:url='https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=5381&jsonpCallback=MusicJsonCallback&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0&cid=205361747&callback=MusicJsonCallback&uin=0&songmid=%s&filename=C400%s.m4a&guid=3218858725' % (item['ksong']['mid'] if item['language']==2 else item['mid'],item['file']['media_mid'])html=mCrawler.download(url,headers=headers)exec(html)elif item['type']==111:url=item['url']+'?fromtag=38'data=mCrawler.download(url,headers=headers)write_file(data)elif item['type']==112:url='http://dl.stream.qqmusic.qq.com/C1L0%s.m4a?fromtag=38' % item['file']['media_mid']data=mCrawler.download(url,headers=headers)write_file(data)mCrawler=Crawler.Crawler()song_name=raw_input(unicode('输入歌曲名:','utf-8').encode('gbk'))
song_name=unicode(song_name,'gbk').encode('utf-8')headers={'authority':'c.y.qq.com','method':'GET','path':'/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=60916586359500801&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%s&g_tk=5381&jsonpCallback=searchCallbacksong&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0' % song_name,'scheme':'https','accept':'*/*','accept-language':'zh-CN,zh;q=0.8','cache-control':'no-cache','pragma':'no-cache','referer':'https://y.qq.com/portal/search.html','user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2717.400 QQBrowser/9.6.11133.400'}
html=mCrawler.download('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=66640132791913660&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%s&g_tk=5381&jsonpCallback=searchCallbacksong&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0' % song_name,headers=headers)
exec(html)

3.注意事项

  1. 本文代码是基于python2.7版本
  2. url构建中有一些细节问题,在上边并未全部体现出,具体细节请看代码。
  3. 本人初学python,有不足之处请多包涵,谢谢。

http://chatgpt.dhexx.cn/article/ZkWfOon8.shtml

相关文章

计算机毕业设计 SSM在线音乐网站设计与实现(源码+论文)

文章目录 1 前言2 实现效果3 设计方案4 最后 1 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的java web缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的java web管理系统达不…

自媒体人必看,这些无版权背景音乐网站,免费下载

近年来&#xff0c;自媒体行业发展迅速&#xff0c;但随之而来的问题也越来越多&#xff0c;尤其是侵权问题&#xff0c;动辄几万、几十万的赔偿金额&#xff0c;稍不注意&#xff0c;可能就侵权了。 这其中包含了图片、音乐版权等各种问题&#xff0c;之前小易和你们分享过很…

新版音乐网站系统源码Sourcecode

正文: 搭建教程: 1.上传源码&#xff0c;解压到根目录&#xff0c;php版本建议最好是7.0或以上版本2绑定域名3直接点击域名打开即可 程序: wwgth.lanzout.com/iCLNb093uzdg 图片:

python实现千千音乐mp3下载

文章来源&#xff1a;https://www.bobobk.com/216.html 进入千千音乐主页面&#xff0c;选择周杰伦的音乐告白气球&#xff0c;发现竟然是2016年的音乐试听都木有&#xff0c;悲伤。那么有没有办法可以获取到mp3文件呢&#xff1f;答案是肯定的。音乐下载可运行程序可在文末获…

一个简单的音乐网站项目

最近闲来无事&#xff0c;就用IDEA编写了一个简单的音乐网站&#xff0c;此网站具有音乐的试听&#xff0c;下载&#xff0c;收藏功能&#xff0c;并且点击收藏时&#xff0c;可以根据用户收藏的音乐信息&#xff0c;进行判定&#xff0c;推荐相类似的歌曲&#xff0c;而且&…

【免费】如何轻松的从音乐网站下载自己喜欢的mp3音乐?

如何轻松的从音乐网站下载自己喜欢的mp3音乐&#xff1f; 一般人我不告诉他&#xff0c;哈哈 首先&#xff0c;拿一个不知名的音乐网站开刀——九酷音乐&#xff08;http://www.9ku.com/&#xff09;。 打开官网首页&#xff1a; 找一首自己喜欢的音乐&#xff0c;比如少年&…

从虾米音乐缓存中下载音乐

浏览器&#xff1a;谷歌 听歌网站&#xff1a;虾米音乐 搜索自己想听的歌&#xff0c;点进去&#xff0c;先不开始听 右键打开检查---->NETWORK 搜索mp3文件&#xff0c;此时没有MP3文件 开始播放音乐&#xff0c;出现一条路径&#xff0c;复制该路径&#xff0c;用浏览器…

JYmusic音乐网站管理系统源码

介绍&#xff1a; JYmusic是一款开源的跨平台音乐管理系统&#xff0c;基于php框架tninkphp开发&#xff0c;稳定、易于扩展、超强大负载能力&#xff0c;完全可以满足音乐、DJ、音乐分享、原创音乐、音乐资讯站等使用。 环境要求&#xff1a; php 版本必须 5.4 或更高 ,MySQ…

springboot+vue在线音乐网站

项目编号&#xff1a;BS-PT-049 项目说明&#xff1a; 本系统基于Springboot和Vue实现的前后端分离的一个在线音乐网站系统&#xff0c;系统功能完整&#xff0c;页面简洁大方&#xff0c;是一个非常优秀的JAVA系统&#xff0c;比较适合做毕业设计使用。 系统的主要功能如下…

python实现某网站的音乐下载

写在前面&#xff1a;首先&#xff0c;理论上讲&#xff0c;如果歌曲可以在网页上播放&#xff0c;那么一定有网址(source src)保存着歌曲的源文件。那么利用火狐&#xff08;或者谷歌&#xff09;浏览器的F12功能&#xff0c;就可以快速提取出该source src&#xff0c;进而完成…

新版音乐网站源码

介绍&#xff1a; 我们需要的东西有&#xff1a;主机、域名 1.获得一个虚拟主机 2.注册一个二级域名 3.解析二级域名并在主机绑定域名 3.主机文件管理器上传源码并解压 4.访问绑定域名即可搭建完成 网盘下载地址&#xff1a; https://zijiewangpan.com/Wqg4Bp53v4d 图片&…

免费搭建一个云音乐网站

如何免费搭建一个云音乐网站 搭建一个云音乐网站&#xff0c;有这些东西是必需的&#xff1a; 1&#xff1a;网站源码 2&#xff1a;服务器 3&#xff1a;域名 云音乐源码在这&#xff1a;https://www.lanzous.com/i5i1fwb 然后服务器我这里选择一个虚拟主机&#xff0c;有一些…

小说项目运营快速赚钱的方法技巧都在这里了!

站在时代的风口上&#xff0c;一头猪都可以飞起来&#xff0c;不同的时期有不同的红利项目&#xff0c;有些人还没了解&#xff0c;项目就已经黄了。 小说项目只会是玩法越来越升级赚钱&#xff0c;要抓住用户心理&#xff0c;才不会被淘汰。 今天就来跟大家分享一些小说项目…

我靠“读书笔记”闷声赚3万:那些你看不上的行业,往往最赚钱

全世界只有3.14 % 的人关注了 爆炸吧知识 你有没有计算过&#xff1a;你的时间&#xff0c;值多少钱&#xff1f; 如果你月薪5000&#xff0c;一个月工作20天&#xff0c;每天8小时&#xff0c;那么你1小时的价值就是32元。 然而&#xff0c;现在请一个打扫卫生的钟点工&#x…

投入不到3000,我用小说3年赚了100万,究竟是怎么做到的?

投入不到3000&#xff0c;我用小说3年赚了100万&#xff0c;究竟是怎么做到的&#xff1f; 本人17年负债25w&#xff0c;18年用了半年还清&#xff0c;如今3年小有富余&#xff0c;全靠下面这个&#xff08;当时是副业做起&#xff09;。 但我还是要实际的告诉大家&#xff0c;…

【软件分享】阅读APP:免费开源无广告、全网小说免费看(附2613个书源)

软件简介 阅读APP是github上gedoor大佬使用Kotlin开发的一款网络阅读软件&#xff0c;没错这个软件的名字就叫【阅读】。该软件免费、开源、无广告&#xff0c;支持定义书源&#xff0c;全网小说免费看。网络阅读用这一个就够了。目前仅支持安卓系统。 下载地址 官网地址&…

一个上班可以偷偷看小说的阅读器

推荐一款很棒的电脑上看小说阅读器。我用过的最好的看小说软件&#xff0c;调整透明度&#xff0c;自动隐藏&#xff0c;很强大很好用。可调整透明背景&#xff0c;上班偷看小说&#xff0c;老板不会发现&#xff0c;鼠标放上去就有&#xff0c;移开就消失&#xff0c;就是阅读…

项目揭秘:公众号小说赚钱与推广的暴利玩法(干货)

说到网络小说&#xff0c;大部分人并不陌生&#xff0c;追小说如同追剧一样&#xff0c;多看一眼就停不下来。正是因为人的这种好奇心理&#xff0c;加上合理的分销机制&#xff0c;才衍生出了“公众号小说”项目。 有一群这样的公众号&#xff0c;你可能会从各种不同的渠道关注…

小说推文能做吗?怎么做?小说推文真的能赚钱吗?

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 近来突然有很多合作伙伴问我&#xff0c;小说推广还能做吗&#xff1f; 在此统一回复&#…

揭秘:网赚圈很红的“小说项目”!月入十万的裂变套路

近几年,在网赚圈,刮起了一阵“小说cps项目”的热潮。各大自媒体平台、公众号、个人号都在宣传操作小说派单项目,可实现暴利收入,月入几万甚至十几万!真的有那么暴利?为何那么多公众号,如此大力宣传,到底是什么套路? 诱惑性标题 很多人都会遇到这种公众号,专门推这种…