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

不温卜火 等级 433 0 0

  大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在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,如有侵权,请联系删除。

收藏
评论区

相关推荐

Golang高并发抓取HTML图片
版权所有,转载请注明:http://www.lenggirl.com/language/gopicture.html(https://links.jianshu.com/go?tohttp%3A%2F%2Fwww.lenggirl.com%2Flanguage%2Fgopicture.html) 使用准备 1.安装Golang 2.
30分钟开发一款抓取网站图片资源的浏览器插件
前言 由于业务需求, 笔者要为公司开发几款实用的浏览器插件,所以大致花了一天的时间,看完了谷歌浏览器插件开发文档,在这里特地总结一下经验, 并通过一个实际案例来复盘插件开发的流程和注意事项. 你将收获 如何快速上手浏览器插件开发 浏览器插件开发的核心概念 浏览器插件的通信机制 浏览器插件的数据存储 浏览器插件的应用场景 开发一款抓取网站图片资源
Linux 网络分析必备技能:tcpdump 实战详解
大家好,我是肖邦,这是我的第 11 篇原创文章。 今天要分享的是 tcpdump,它是 Linux 系统中特别有用的网络工具,通常用于故障诊断、网络分析,功能非常的强
前端开发神器Charles从入门到卸载
前言 本文将带大家学习使用前端开发神器charles,从基本的下载安装到常见配置使用,为大家一一讲解。 一、花式夸奖Charles 截取 Http 和 Https 网络封包。 支持重发网络请求,方便后端调试。 支持修改网络请求参数。 支持网络请求的截获并动态修改。 支持模拟慢速网络。 好,骑上我心爱的小摩托,准备上路... 二、下载
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
微标题信公众号文章,阅读数,点赞数历史文章抓取
微标题信公众号文章,阅读数,点赞数历史文章抓取 需求 最近在做舆情与微信文章相关的数据抓取,发现微信公众号有些难点很难克服。市面上流行的数据抓取思路要么被腾讯封杀,要么操作难度大。 解决方案 搜狗微信 无法采集历史,而且搜索也不按时间排序。获取的数据的价值不高,仅仅可以通过他获取公众号的biz。 微信公众平台 微信公
易班自动刷网薪系统
写在前面 Python 课最后的大作业,跟大哥们一起写这个小玩意,因为学院好像很喜欢刷这些东西,总体来说挺简单的 分到我的模块刚刚好需要手机抓包,网页端易班登陆进去没有发动态的模块了,模块在维护 后续会更新其他人的板块并尝试做出来真正的模拟登陆(逆向app或者使用appium提取loginToken) 源码python coding: utf8 """@T
使用Python抓取helloworld上的文章
嘿嘿嘿,py真好玩 代码写得很渣,本着能跑就好的原则,就这样啦 pythonimport osfrom requestshtml import HTMLSessionimport sqlite3from pathlib import PathBASEDIR Path(file).resolve().parent.parentdomain "https:/
fiddler 安装手机证书时打开网址拒绝访问
按照网上教程配置了fiddler之后,去手机下载证书。输入IP+端口号时报错了,网页拒绝了您的访问。 试了很多方法,最后发现 需要关闭window 防火墙。然后手机端就可以访问了。下载完成后如果不能安装,可以去WiFi高级设置安装证书里选择证书安装。安装证书的时候凭据用途一定要选择WLAN.
肝了三天,万字长文教你玩转 tcpdump,从此抓包不用愁
系列导读 本文是 【网络知识扫盲】专栏的第三篇。今天要给大家介绍的一个 Unix 下的一个 网络数据采集分析工具 \ Tcpdump,也就是我们常说的抓包工具。与它功能类似的工具有 wireshark ,不同的是,wireshark 有图形化界面,而 tcpdump 则只有命令行。由于我本人更习惯使用命令行的方式进行抓包,因此今天先跳过
分别用python2和python3伪装浏览器爬取网页内容
python网页抓取功能非常强大,使用urllib或者urllib2可以很轻松的抓取网页内容。但是很多时候我们要注意,可能很多网站都设置了防采集功能,不是那么轻松就能抓取到想要的内容。今天我来分享下载python2和python3中都是如何来模拟浏览器来跳过屏蔽进行抓取的。最基础的抓取:! /usr/bin/env python codingutf8 @Au
详解4种类型的爬虫技术
导读:网络爬虫是一种很好的自动采集数据的通用手段。本文将会对爬虫的类型进行介绍。 作者:赵国生 王健来源:大数据DT(ID:hzdashuju) 聚焦网络爬虫是“面向特定主题需求”的一种爬虫程序,而通用网络爬虫则是捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分,主要目的是将互联网上的网页下载到本地,形成一个互联网内
小红书很难爬?最新爬取方法教给你啦~
Python进击者第184篇原创文章前言大家好,我是Kuls。之前写的那篇App抓包软件charles的配置说过,超过30在看,马上更下一篇。所以加班加点给大家写了今天这篇文章。本文将会带着大家完完整整的爬取小红书的全过程 小红书需要做的前提工作就是装配好mitmproxy具体的配置过程,我建议大家参照崔大写的来进行安装https://zhuanlan.z
有读者问我怎么爬App,我手把手教了他(多图警告)
前言大家好,我是Kuls。最近看见很多读者在说怎么抓取APP上的内容为此,我打算写一些关于爬取APP方面的文章,当然APP的爬取自然是要比网页要麻烦。但是只要我们把前期的工作做好,后面也会更加的顺利。今天这篇文章就是来教大家如何抓取到APP数据,用什么软件,怎么配置?Charles首先,我们来看看百度百科是怎么介绍这款软件的 是一个HTTP代理服务器,HTT
爬虫进阶 - 前后端分离有什么了不起,过程超详细
这是一个详细的爬虫进阶教程,里面包含了很详细的思考和试错过程,如果你对学爬虫是认真的,建议认真看。 我们要抓取下面这个网站上的所有图书列表: https://www.epubit.com/books 1) 探索研究 创建一个新的python文件,写入如下代码:import requests url  'https://www.epubit.com/boo