爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

不温卜火
• 阅读 2129

  大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页:https://buwenbuhuo.blog.csdn.net/爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

PS:由于现在越来越多的人未经本人同意直接爬取博主本人文章,博主在此特别声明:未经本人允许,禁止转载!!!

目录


爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐


推荐

爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
  ♥各位如果想要交流的话,可以加下QQ交流群:974178910,里面有各种你想要的学习资料。♥

  ♥欢迎大家关注公众号【不温卜火】,关注公众号即可以提前阅读又可以获取各种干货哦,同时公众号每满1024及1024倍数则会抽奖赠送机械键盘一份+IT书籍1份哟~♥
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

一、前言(fiddler)

1.1 简单介绍及下载

前三篇博文主要讲解了如何破解三种加密方式的方法。但是我们在爬取的时候是不是发现其实是挺繁琐的。那么接下来的这篇文章我给大家介绍的就是能够方便我们抓取网页内容的fiddler抓包工具。
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
爬虫是爬取看到的数据(可见即可爬),有些app或web的数据直接通过网页不好分析,这个时候需要使用fiddler工具帮助分析请求和响应。
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
fiddler作为客户端和服务端的中间代理,可以找到请求也可以找到响应。

说了这么多,下面我们先来下载fiddler:

fiddler中文版下载地址(非官方):http://www.32r.com/soft/43364.html

下载完成后打开如下图:
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
我们下载完成之后是不是不会使用?没关系,在此博主给出抓包工具总结。

fiddler抓包工具总结:https://www.cnblogs.com/yyhh/p/5140852.html

1.2 修改部分设置

下面我们需要修改的部分配置

    1. 设置成仅从浏览器解密
      爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
    1. 连接的端口
      爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
      fiddler如果抓取本地电脑web端的数据,代理就需要设置了,默认会代理本地的浏览器。

二、抓包分析

前面介绍了那么多,下面就可以开始进入正题了。
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
下面下给出QQ音乐的Web端的网址:https://y.qq.com/

2.1 尝试抓包

    1. 打开网址
      爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
    1. 下面进入qq web端搜索音乐
      爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
    1. 单击某个音乐试听
      爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
      但是因为版权原因,有些音乐需要会员才能播放,建议使用会员账号登录,然后获取cookie。
    1. 使用fiddler抓包查看
      抓包具体过程:
      抓包工具端: fiddler(点击右下角)—>出现捕获中。
      爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
      Web端:搜索框—>自己喜欢的音乐(eg:春娇与志明)—>选择一个首歌播放—>等待加载完成。
      爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
      再次查看抓包工具端: ctrl+F(搜索mp4格式)查看类型—> 选择最大的文件保存到本地
      爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
      博主本人是让文件保存到桌面上,你们测试的时候自己保存到自己常用的地方。然后用系统自带的播放器即可打开。如果下载正确的话,是可以能够正常听到音乐的。如下图:
      爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

2.2 分析抓包链接

我们抓包成功以后,就可以开始分析链接了。
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
通过上图,我们可以看到上下的Raw分别代表的是请求和响应。不过我们不用管下方的响应。
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
在请求框中,我们发现GET是可直接访问的,这个时候我们可以点击打开这个链接(首次打开的时候会有风险提示,我们只需继续访问就可以了)
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

URL如下:

https://123.6.21.20/amobile.music.tc.qq.com/C400003K4R1k1UFHot.m4a?guid=455328485&vkey=989DD22B314AA8F897A78B189A6599625AF831C0160449364EA8300956E1B684F72196D02C0170DA55F6E8215E5D9782DF0365EFE921E7BD&uin=4116&fromtag=66 

我们进入这个URL之后,如果能播放音乐代表我们找的是正确的。如下图:
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
🆗找到了链接,接下来我们分析这个URL的参数,参数在右侧的WebForms内:
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
上图中的这个url对应的响应就是需要抓取的数据,下面我们多测试几个音乐,观察参数。

我们再来抓取另一首歌曲的的相关信息。
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
经过多次的对比发现vkey不同,那么vkey怎么获取到呢?
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
找啊找,终于在上图中的的url的响应中找到了vk,其实直接找purl更方便

那么图上的url,怎么发送请求,又要观察它的参数
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
经过多次的对比发现,有多个参数不同,特别是songmid也不同,songmid怎么获取呢?找啊找,终于在搜索页面找到了songmid
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
在上图中我们看到songmid不同,但是为了更近一步验证。我们先对其格式化一下。

先给出JSON在线解析网站:
https://www.sojson.com/
下面进行JSON解析
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
通过格式化之后,我们看着就很明显了。

下面我们需要找的就是搜索页面每首歌曲的ID
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
通过抓包我们发现这个返回的是个JSON字符串
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
通过对比我们发现此部分正是我们需要的部分。下面我们来找下歌曲的mid
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

三、部分代码实现

爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

3.1 根据搜索信息发送请求歌曲名字和mid

1. 链接分析

首先我们先来看下完整网址

https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.center&searchid=41287009571950165&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=%E6%98%A5%E5%A8%87%E4%B8%8E%E5%BF%97%E6%98%8E&g_tk_new_20200303=5381&g_tk=5381&loginUin=459804692&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0 

打开如下图所示:
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
我们发现参数有很多那么可以我们尝试只添加名称看能否正常访问。链接如下:

https://c.y.qq.com/soso/fcgi-bin/client_search_cp?w=春娇与志明 

爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

🆗那么我们就可以知道精简过后的URL

网址:https://c.y.qq.com/soso/fcgi-bin/client\_search\_cp
精简后的参数:w=春娇与志明
获取:歌曲名字和mid

2. 代码实现

爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

    1. 实现代码
# encoding: utf-8
'''
  @author 李华鑫
  @create 2020-10-21 18:06
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@qq.com
  @software: Pycharm
  @file: test.py
  @Version:1.0

'''
import requests
import re
import os
from lxml import etree

class QQMusicSpider:
    def __init__(self):
        self.url1 = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36",
            "Referer": "https://y.qq.com/",
            "Cookie": "pgv_pvi=2567757824; ts_uid=64446952; pgv_pvid=6809245960; userAction=1; RK=0ID4VI/yGY; ptcz=6f4eaa825e99af36068b5d51b8e34c1c0087b9c95c44f7b062d5cff7b3c70d22; euin=owSF7e4kNKnz; qm_keyst=Q_H_L_2a6K5_50eO5-itw83Uio7kRWq8WgGbPI1BGlM1c8ng4qZt_ZAxTRmHb8B4SQBWD; uin=278455900; tmeLoginType=2; psrf_qqopenid=8E8FC9D9774A8788D4DF1FD73F2B8D88; psrf_qqaccess_token=22EEB4580A1D37E9AB61B4A2CD6FC0CE; psrf_qqunionid=; qqmusic_key=Q_H_L_2a6K5_50eO5-itw83Uio7kRWq8WgGbPI1BGlM1c8ng4qZt_ZAxTRmHb8B4SQBWD; psrf_musickey_createtime=1602572393; psrf_access_token_expiresAt=1610348393; psrf_qqrefresh_token=1873C9B55CC272116295F7B5AC7DE014; yqq_stat=0; pgv_info=ssid=s3690755542; ts_refer=ADTAGmyqq; pgv_si=s1594386432; yplayer_open=1; qqmusic_fromtag=66; yq_playschange=0; yq_playdata=; player_exist=1; yq_index=1; ts_last=y.qq.com/n/yqq/song/002t78Qs1Av9Kn.html"
        }
        self.w = ""

    def get_search_content(self):
        """获取搜索结果"""
        data = self.parse_content(url=self.url1, headers=self.headers, params={"w": self.w}).decode("utf-8")
        song_mid_list = re.findall(r'"songmid":"(.*?)"', data)
        song_name_list = re.findall(r'"songname":"(.*?)"', data)
        return list(zip(song_name_list, song_mid_list))

    def parse_content(self, url, headers, params={}):
        """解析url,返回响应字节"""
        response = requests.get(url, headers=headers, params=params)
        return response.content

    def parse_json(self, url, headers, params={}):
        """解析url,返回json"""
        response = requests.get(url, headers=headers, params=params)
        return response.json()

    def parse_xpath(self, html):
        """使用xpath解析html,返回xpath对象"""
        etree_obj = etree.HTML(html)
        return etree_obj

    def start(self):
        """开始爬虫"""
        self.w = input("请输入搜索的歌曲/歌手:")
        search_data = self.get_search_content()
        for index,value in enumerate(search_data):
            print("({}){}".format(index+1,value[0]))
        index = int(input("请输入歌曲编号进行下载:"))
        print(search_data[index-1])

if __name__ == '__main__':
    QQMusicSpider().start() 
  • 2、测试结果
    爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

3.2 根据mid发送请求获取vk/purl

经过上一小部分的代码测试,我们已经能够获取到mid和歌手信息。下面我们根据歌曲的mid搜索vk。

3.2.1 链接分析

下面我们现在抓包工具中找到vk的URL

https://u.y.qq.com/cgi-bin/musics.fcg?-=getplaysongvkey6182361656698969&g_tk=5381&sign=zzancg5ohny8sa7re612a04ee9b6b58b82bcdaa064240f964&loginUin=459804692&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&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%22455328485%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%22455328485%22%2C%22songmid%22%3A%5B%22004Uln1G2Aunqw%22%5D%2C%22songtype%22%3A%5B0%5D%2C%22uin%22%3A%22459804692%22%2C%22loginflag%22%3A1%2C%22platform%22%3A%2220%22%7D%7D%2C%22comm%22%3A%7B%22uin%22%3A459804692%2C%22format%22%3A%22json%22%2C%22ct%22%3A24%2C%22cv%22%3A0%7D%7D 

我们打开之后如下图:
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
下面我们找到data内的数据并复制出来

{"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"455328485","songmid":["%s"],"songtype":[0],"uin":"0","loginflag":1,"platform":"20"}},"comm":{"uin":0,"format":"json","ct":24,"cv":0}} 

爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
🆗说明我们测试是成功的。

网址:https://u.y.qq.com/cgi-bin/musics.fcg
精简后的参数:data=xxx,这里参数有有{}注意参数拼接问题
获取:purl

3.2.2 代码实现

    1. 实现代码
import requests
import re
import os
from lxml import etree

class QQMusicSpider:
    def __init__(self):
        self.url1 = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp"
        self.url2 = 'https://u.y.qq.com/cgi-bin/musicu.fcg?data={"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"602087500","songmid":["%s"],"songtype":[0],"uin":"0","loginflag":1,"platform":"20"}},"comm":{"uin":0,"format":"json","ct":24,"cv":0}}'
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36",
            "Referer": "https://y.qq.com/",
            "Cookie": "pgv_pvi=2567757824; ts_uid=64446952; pgv_pvid=6809245960; userAction=1; RK=0ID4VI/yGY; ptcz=6f4eaa825e99af36068b5d51b8e34c1c0087b9c95c44f7b062d5cff7b3c70d22; euin=owSF7e4kNKnz; qm_keyst=Q_H_L_2a6K5_50eO5-itw83Uio7kRWq8WgGbPI1BGlM1c8ng4qZt_ZAxTRmHb8B4SQBWD; uin=278455900; tmeLoginType=2; psrf_qqopenid=8E8FC9D9774A8788D4DF1FD73F2B8D88; psrf_qqaccess_token=22EEB4580A1D37E9AB61B4A2CD6FC0CE; psrf_qqunionid=; qqmusic_key=Q_H_L_2a6K5_50eO5-itw83Uio7kRWq8WgGbPI1BGlM1c8ng4qZt_ZAxTRmHb8B4SQBWD; psrf_musickey_createtime=1602572393; psrf_access_token_expiresAt=1610348393; psrf_qqrefresh_token=1873C9B55CC272116295F7B5AC7DE014; yqq_stat=0; pgv_info=ssid=s3690755542; ts_refer=ADTAGmyqq; pgv_si=s1594386432; yplayer_open=1; qqmusic_fromtag=66; yq_playschange=0; yq_playdata=; player_exist=1; yq_index=1; ts_last=y.qq.com/n/yqq/song/002t78Qs1Av9Kn.html"
        }
        self.w = ""

    def get_search_content(self):
        """获取搜索结果"""
        data = self.parse_content(url=self.url1, headers=self.headers, params={"w": self.w}).decode("utf-8")
        song_mid_list = re.findall(r'"songmid":"(.*?)"', data)
        song_name_list = re.findall(r'"songname":"(.*?)"', data)
        return list(zip(song_name_list, song_mid_list))

    def get_vk(self, songmid):
        """根据歌曲的mid搜索vk"""
        data = self.parse_json(url=self.url2 % songmid, headers=self.headers)
        print(data)

    def parse_content(self, url, headers, params={}):
        """解析url,返回响应字节"""
        response = requests.get(url, headers=headers, params=params)
        return response.content

    def parse_json(self, url, headers, params={}):
        """解析url,返回json"""
        response = requests.get(url, headers=headers, params=params)
        return response.json()

    def parse_xpath(self, html):
        """使用xpath解析html,返回xpath对象"""
        etree_obj = etree.HTML(html)
        return etree_obj

    def start(self):
        """开始爬虫"""
        self.w = input("请输入搜索的歌曲/歌手:")
        search_data = self.get_search_content()
        for index,value in enumerate(search_data):
            print("({}){}".format(index+1,value[0]))
        index = int(input("请输入歌曲编号进行下载:"))
        self.get_vk(search_data[index-1][1])

if __name__ == '__main__':
    QQMusicSpider().start() 
    1. 运行结果
      爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
    1. 格式化查看
      爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
    1. 尝试解析
# 代码如下
data["req_0"]["data"]["midurlinfo"][0]["purl"] 

理论上到这里就可以获取到我们所需要的URL。

3.3 根据purl获取歌曲字节

3.3.1 分析

首先我们回忆下刚开始使用抓包工具抓取的音乐的URL
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
我们把url复制出来:

https://123.6.21.20/amobile.music.tc.qq.com/C400003K4R1k1UFHot.m4a?guid=455328485&vkey=EA9D246E2EB9BDCFFBF840E6479B26495C97E5C0EE12BC8FA81BDAEFB47399C5169A4813DA033FA9FEE710887216632680B11940CFC77F64&uin=0&fromtag=66 

下面我们看下我们上一步中截取出来的purl
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
把它复制出来

C400003K4R1k1UFHot.m4a?guid=602087500&vkey=D81DEE79601184E377220701E1EB24FA3B4F9B869F8C4D77E8A82ACAA73A088D8A6FB8C934D8430328B3FA93628F4B723AC0759214464A6F&uin=0&fromtag=66 

下面我们拼接一下url试试:

https://123.6.21.20/amobile.music.tc.qq.com/C400003K4R1k1UFHot.m4a?guid=602087500&vkey=D81DEE79601184E377220701E1EB24FA3B4F9B869F8C4D77E8A82ACAA73A088D8A6FB8C934D8430328B3FA93628F4B723AC0759214464A6F&uin=0&fromtag=66 

爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
🆗我们拼接的和我们所想的是一样的。

网址:https://123.6.21.20/amobile.music.tc.qq.com/
参数:拼接purl
获取:歌曲字节

3.3.2 代码

    1. 测试代码
import requests
import re
import os
from lxml import etree
requests.packages.urllib3.disable_warnings()

class QQMusicSpider:
    def __init__(self):
        self.url1 = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp"
        self.url2 = 'https://u.y.qq.com/cgi-bin/musicu.fcg?data={"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"602087500","songmid":["%s"],"songtype":[0],"uin":"0","loginflag":1,"platform":"20"}},"comm":{"uin":0,"format":"json","ct":24,"cv":0}}'
        self.url3 = "https://123.6.21.20/amobile.music.tc.qq.com/"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36",
            "Referer": "https://y.qq.com/",
            "Cookie": "pgv_pvi=2567757824; ts_uid=64446952; pgv_pvid=6809245960; userAction=1; RK=0ID4VI/yGY; ptcz=6f4eaa825e99af36068b5d51b8e34c1c0087b9c95c44f7b062d5cff7b3c70d22; euin=owSF7e4kNKnz; qm_keyst=Q_H_L_2a6K5_50eO5-itw83Uio7kRWq8WgGbPI1BGlM1c8ng4qZt_ZAxTRmHb8B4SQBWD; uin=278455900; tmeLoginType=2; psrf_qqopenid=8E8FC9D9774A8788D4DF1FD73F2B8D88; psrf_qqaccess_token=22EEB4580A1D37E9AB61B4A2CD6FC0CE; psrf_qqunionid=; qqmusic_key=Q_H_L_2a6K5_50eO5-itw83Uio7kRWq8WgGbPI1BGlM1c8ng4qZt_ZAxTRmHb8B4SQBWD; psrf_musickey_createtime=1602572393; psrf_access_token_expiresAt=1610348393; psrf_qqrefresh_token=1873C9B55CC272116295F7B5AC7DE014; yqq_stat=0; pgv_info=ssid=s3690755542; ts_refer=ADTAGmyqq; pgv_si=s1594386432; yplayer_open=1; qqmusic_fromtag=66; yq_playschange=0; yq_playdata=; player_exist=1; yq_index=1; ts_last=y.qq.com/n/yqq/song/002t78Qs1Av9Kn.html"
        }
        self.w = ""

    def get_search_content(self):
        """获取搜索结果"""
        data = self.parse_content(url=self.url1, headers=self.headers, params={"w": self.w}).decode("utf-8")
        song_mid_list = re.findall(r'"songmid":"(.*?)"', data)
        song_name_list = re.findall(r'"songname":"(.*?)"', data)
        return list(zip(song_name_list, song_mid_list))

    def get_purl(self, songmid):
        """根据歌曲的mid搜索vk"""
        data = self.parse_json(url=self.url2 % songmid, headers=self.headers)
        return data["req_0"]["data"]["midurlinfo"][0]["purl"]

    def parse_content(self, url, headers, params={}):
        """解析url,返回响应字节"""
        response = requests.get(url, headers=headers, params=params)
        return response.content

    def parse_json(self, url, headers, params={}):
        """解析url,返回json"""
        response = requests.get(url, headers=headers, params=params)
        return response.json()

    def parse_xpath(self, html):
        """使用xpath解析html,返回xpath对象"""
        etree_obj = etree.HTML(html)
        return etree_obj

    def start(self):
        """开始爬虫"""
        self.w = input("请输入搜索的歌曲/歌手:")
        search_data = self.get_search_content()
        for index,value in enumerate(search_data):
            print("({}){}".format(index+1,value[0]))
        index = int(input("请输入歌曲编号进行下载:"))
        purl = self.get_purl(search_data[index-1][1])
        print(self.url3+purl)

if __name__ == '__main__':
    QQMusicSpider().start() 
    1. 运行结果
      爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

四、完整代码

# encoding: utf-8
'''
  @author 李华鑫
  @create 2020-10-24 14:37
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@qq.com
  @software: Pycharm
  @file: QQ音乐.py
  @Version:1.0

'''
import requests
import re
import os
from lxml import etree

class QQMusicSpider:
    def __init__(self):
        self.url1 = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp"
        self.url2 = 'https://u.y.qq.com/cgi-bin/musicu.fcg?data={"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"602087500","songmid":["%s"],"songtype":[0],"uin":"0","loginflag":1,"platform":"20"}},"comm":{"uin":0,"format":"json","ct":24,"cv":0}}'
        self.url3 = "https://123.6.21.20/amobile.music.tc.qq.com/"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36",
            "Referer": "https://y.qq.com/",
            "Cookie": "pgv_pvi=2567757824; ts_uid=64446952; pgv_pvid=6809245960; userAction=1; RK=0ID4VI/yGY; ptcz=6f4eaa825e99af36068b5d51b8e34c1c0087b9c95c44f7b062d5cff7b3c70d22; euin=owSF7e4kNKnz; qm_keyst=Q_H_L_2a6K5_50eO5-itw83Uio7kRWq8WgGbPI1BGlM1c8ng4qZt_ZAxTRmHb8B4SQBWD; uin=278455900; tmeLoginType=2; psrf_qqopenid=8E8FC9D9774A8788D4DF1FD73F2B8D88; psrf_qqaccess_token=22EEB4580A1D37E9AB61B4A2CD6FC0CE; psrf_qqunionid=; qqmusic_key=Q_H_L_2a6K5_50eO5-itw83Uio7kRWq8WgGbPI1BGlM1c8ng4qZt_ZAxTRmHb8B4SQBWD; psrf_musickey_createtime=1602572393; psrf_access_token_expiresAt=1610348393; psrf_qqrefresh_token=1873C9B55CC272116295F7B5AC7DE014; yqq_stat=0; pgv_info=ssid=s3690755542; ts_refer=ADTAGmyqq; pgv_si=s1594386432; yplayer_open=1; qqmusic_fromtag=66; yq_playschange=0; yq_playdata=; player_exist=1; yq_index=1; ts_last=y.qq.com/n/yqq/song/002t78Qs1Av9Kn.html"
        }
        self.w = ""

    def get_search_content(self):
        """获取搜索结果"""

        data = self.parse_content(url=self.url1, headers=self.headers, params={"w": self.w}).decode("utf-8")
        song_mid_list = re.findall(r'"songmid":"(.*?)"', data)
        song_name_list = re.findall(r'"songname":"(.*?)"', data)
        return list(zip(song_name_list, song_mid_list))

    def get_purl(self, songmid):
        """根据歌曲的mid搜索vk"""
        data = self.parse_json(url=self.url2 % songmid, headers=self.headers)
        return data["req_0"]["data"]["midurlinfo"][0]["purl"]

    def save_song(self, url,song_name):
        """下载歌曲"""
        print("-"*100)
        filename = song_name+".mp3"
        print("{}下载中...".format(filename))
        data = self.parse_content(url=url, headers=self.headers)
        if data:
            with open(filename,"wb") as file:
                file.write(data)
            print("{}下载完毕".format(filename))
        else:
            print("{}下载失败,建议豪华绿钻用户使用会员账号修改程序cookie".format(filename))
        print("-" * 100)

    def parse_content(self, url, headers, params={}):
        """解析url,返回响应字节"""
        response = requests.get(url, headers=self.headers, params=params,verify=False)
        return response.content

    def parse_json(self, url, headers, params={}):
        """解析url,返回json"""
        response = requests.get(url, headers=headers, params=params,verify=False)
        return response.json()

    def parse_xpath(self, html):
        """使用xpath解析html,返回xpath对象"""
        etree_obj = etree.HTML(html)
        return etree_obj

    def start(self):
        """开始爬虫"""
        self.w = input("输入要搜索的歌曲/歌手:")
        search_data = self.get_search_content()

        while True:
            for index, value in enumerate(search_data):
                print("({}){}".format(index + 1, value[0]))
            print("(0)退出程序")
            index = int(input("选择歌曲编号进行下载:"))
            if index == 0:
                break
            purl = self.get_purl(search_data[index - 1][1])
            self.save_song(url=self.url3 + purl,song_name=search_data[index - 1][0])

if __name__ == '__main__':
    QQMusicSpider().start() 

五、运行结果

爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!


爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

  好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
  如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论”“收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
  码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!

爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

本文转自 https://buwenbuhuo.blog.csdn.net/article/details/109259210,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
不温卜火 不温卜火
3年前
爬虫入门经典(五) | 简单一文教你如何爬取高德地图
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
不温卜火 不温卜火
3年前
爬虫入门经典(二十四) | 爬取当当网图书信息并进行数据清洗
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
不温卜火 不温卜火
3年前
爬虫入门经典(六) | 一文带你深入了解为什么使用代理IP及其如何使用
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
不温卜火 不温卜火
3年前
爬虫入门经典(十三) | 一文教你简单爬取腾讯招聘
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
不温卜火 不温卜火
3年前
爬虫入门经典(十) | 一文带你快速爬取网易云音乐
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
不温卜火 不温卜火
3年前
爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
不温卜火 不温卜火
3年前
爬虫入门经典(七) | 一文带你爬取淘宝电场
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
不温卜火 不温卜火
3年前
爬虫入门经典(八) | 一文带你快速爬取股吧
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
不温卜火 不温卜火
3年前
爬虫入门经典(九) | 简单一文教你如何爬取扇贝单词
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
不温卜火 不温卜火
3年前
爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
不温卜火 不温卜火
3年前
爬虫入门经典(四) | 如何爬取豆瓣电影Top250
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行