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

news/2024/5/13 22:01:34/文章来源:https://blog.csdn.net/u014584274/article/details/72835684

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://www.luyixian.cn/news_show_865376.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一周恢复被K网站的特殊案例

对于SEOer&#xff0c;笔者有时会感慨到其就是刀锋上的舞者&#xff0c;因为其要面临着人为或者非人为因素所带来的K站惩罚。笔者依然记得在本月5号早上到公司后查看网站各方面SEO数据时的心情&#xff0c;当看到自己辛辛苦苦构建的网站收录和排名都归零的时候&#xff0c;心情…

办好长尾网站要害词的3个技法

固然现正在的搜刮引擎优化路越来越难走&#xff0c;然而咱们要晓得的是征采引擎正在退步&#xff0c;共奇迹的站长们也正在退步&#xff0c;而本人没有退步的话&#xff0c;那样着实便是一种生长&#xff0c;网站跟没有上 算法的脚步&#xff0c;跟没有上共奇迹的脚步&#xff…

分析网站优化4大要点

分析网站优化4大要点 1、 网站的分析 1&#xff09; 对于网站自身存在的问题进行剖析&#xff0c;寻找网站的目前所存在的问题&#xff08;如在布局设计上是否符合引擎的收录和抓取规则&#xff0c;网站在关键词优化上是否合理&#xff0c;网站的功能的特点是否明晰等&#xff…

怎样建设SEO团队

每个做SEO的人都想拥有一支自己的团队&#xff0c;然后让自己的团队变得很强大&#xff0c;很精锐&#xff0c;他们的梦想就是把所有网站的SEO?项目都集中在自己的团队里&#xff0c;呵呵&#xff0c;这是不现实的&#xff0c;但是&#xff0c;你要想拥有一支完整的、正规的团…

网站运营的看法

在如今的互联网中&#xff0c;不同的行业不同的群体基本都已树立自己的行业**&#xff0c;一些中小站长如何才能在这样的竞争中去发展运营适合自己的行业网站来攒取广告收益。 避开热门行业&#xff0c;热门行业化细分如汽车类&#xff0c;房产类&#xff0c;人才招聘类等&…

五大不能seo作弊

第一&#xff1a;博客作弊&#xff0c;这是一种互联网在线刊物&#xff0c;博客作弊的人通常是发表不相关的消息&#xff0c;好友通往一些URL的链接&#xff0c;以便使作弊者达到推动搜索排名的目的。现在很多博客作者都不愿让读者发表评论&#xff0c;就是怕评论中带链接地址的…

网站的更改规律

网站更新的九大基本概论1.文章的原创性&#xff1a;大家都知道搜索引擎是很喜欢原创文章的&#xff0c;最好花一点时间去撰写原创的文章&#xff0c;一篇原创抵得上十篇转载和伪原创&#xff0c;也可以锻炼自己的写作能力&#xff0c;如果实在懒得原创最好伪原创或者扫书&#…

如何实现seo优化和网站建设相辅相成

SEO网站优化到底是什么感念?和网站建设究竟有什么区别?也许不是行家的人不会很清楚。网站对于企业来说是展示企业文化&#xff0c;企业产品&#xff0c;信息沟通的一种平台。然而网站建设出来后是否能够达到预想的效果呢?前些年SEO还很少知道&#xff0c;网站建设的漂亮&…

seo优化中的误区

一、使用DIVCSS的误区 1、用DIVCSS结构建造静态html上网页等于彻底丢弃古老的table写法 之所以不建议用table来布局网页是因为网页加载很慢的时辰要等table机关加载完成才能看到网页&#xff0c;其次是table布局没有必然语义&#xff0c;网页代码改削起来斗劲麻烦。Table是专门…

google引擎优化SEO中不要健忘对PDF文件的优化

在SEO中&#xff0c;有良多上网站元素都是优化的焦点&#xff0c;好比h问题标签、lbg等权重标签等&#xff0c;许多公司和SEOer都忽略了优化网页上的很多自己元素。在SEO中&#xff0c;几乎每个网页元素都是影响SEO的排名。你应该在每个方面都作出全力&#xff0c;以此来吸引se…

七个错误方法导致网站外链推广不成功

一、软件群发 这是很多的新手最常犯的一个通病&#xff0c;他们以为在网站之初一定要快速增加外链的数量&#xff0c;所以就喜欢在论坛上用群发软件来发大量的外链&#xff0c;其实这是恰恰是很错误的想法。 我们大家都应该知道的一点是&#xff0c;这样的做法是可以在短期内很…

大型网站的架构演化,发展历程

今天开始读《大型网站技术架构&#xff1a;核心原理与案例分析》&#xff0c;觉得这本书将的全面而又通俗易懂&#xff0c;有兴趣的同学可以看一看。下面对大型网站的架构演化&#xff0c;发展历程做了整理&#xff0c;小伙伴们一起来学习一下。 传统企业应用面对的挑战&…

学习从现在开始!免费计算机技术教程网站大汇聚!

嘿嘿&#xff0c;不多说了&#xff5e;大家想提高自己的电脑水平的话&#xff0c;就来看看吧&#xff5e;&#xff5e;保证你有收获de&#xff01;网页设计、编程、网络管理、应用技巧、设计、硬件所有咚咚应有尽有一个都没少&#xff5e;&#xff5e;而且绝大部分都是免费d&am…

网站用户单点登录系统解决方案

网站用户单点登录系统解决方案 1 背景   在网站建设的过程中&#xff0c;多个应用系统一般是在不同的时期开发完成的。各应用系统由于功能侧重、设计方法和开发技术有所不同&#xff0c;也就形成了各自独立的用户库和用户认证体系。随着网站的发展&#xff0c;会出现这样的用…

迅速提高网站流量的方法

这么好的网站&#xff0c;我才发现&#xff0c;真是相见狠晚。 看见这么多网友发表文章&#xff0c;手也有点痒了&#xff0c;我也来凑个热闹&#xff0c;哈哈&#xff0c;&#xff0c;&#xff0c;好了书归正转&#xff01; 1.网络站优化法[Google]我认为这种方法是最有效的&a…

网站推广常用的29个方法

搜索引擎策略 以网站最重要的关键词在主要搜索引擎中排名领先&#xff0c;这是搜索引擎推广中最重要的策略。搜索引擎的"搜索机器人spiders" 会自动搜索网页内容&#xff0c;因此搜索引擎策略从优化网页开始。 1、添加网页标题&#xff08;title&#xff09;。 为每页…

企业网站服务器负载均衡技术

Internet的快速增长使网络服务器&#xff0c;特别是Web服务器&#xff0c;面对的访问者数量快速增加&#xff0c;网络服务器需要具备提供大量并发访问服务的能力。例如sohu每天会收到数千百万次的访问请求&#xff0c;因此对于提供大负载Web服务的服务器来讲&#xff0c;CPU、I…

门户网站运营工作全流程

值得大家关注的是&#xff0c;网站的运营&#xff08;Operate&#xff09;大家会跟网站的推广&#xff08;Promotion&#xff09;混同起来&#xff0c;实际上&#xff0c;网站的推广工作只是网站运营的一部分&#xff0c;除此之外&#xff0c;还有网站及栏目或活动的策划工作&a…

BUGKU 网站被黑

首先打开链接 我的金币要不够了我就先不打开了 然后打开之后我吗会发现用F12检查了之后也没有什么有用的信息 用bp抓包也没有 然后使用御剑去扫描一下使用第二个批量扫描后台 然后再这张图的添加上点添加将网址输在里面再点击选择PHP.txt 然后点击开始扫描就可以得出几个网…

网站根目录设置

转载于:https://www.cnblogs.com/hellowzd/p/4143314.html