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

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

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


2


推荐

23
  ♥各位如果想要交流的话,可以加下QQ交流群:974178910,里面有各种你想要的学习资料。♥

  ♥欢迎大家关注公众号【不温卜火】,关注公众号即可以提前阅读又可以获取各种干货哦,同时公众号每满1024及1024倍数则会抽奖赠送机械键盘一份+IT书籍1份哟~♥
24

一、前言(fiddler)

1.1 简单介绍及下载

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

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

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

下载完成后打开如下图:
4
我们下载完成之后是不是不会使用?没关系,在此博主给出抓包工具总结。

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

1.2 修改部分设置

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

  • 1. 设置成仅从浏览器解密
    5
  • 2. 连接的端口
    6
    fiddler如果抓取本地电脑web端的数据,代理就需要设置了,默认会代理本地的浏览器。

二、抓包分析

前面介绍了那么多,下面就可以开始进入正题了。
55
下面下给出QQ音乐的Web端的网址:https://y.qq.com/

2.1 尝试抓包

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

2.2 分析抓包链接

我们抓包成功以后,就可以开始分析链接了。
14
通过上图,我们可以看到上下的Raw分别代表的是请求和响应。不过我们不用管下方的响应。
56
在请求框中,我们发现GET是可直接访问的,这个时候我们可以点击打开这个链接(首次打开的时候会有风险提示,我们只需继续访问就可以了)
15

URL如下:

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

我们进入这个URL之后,如果能播放音乐代表我们找的是正确的。如下图:
16
🆗找到了链接,接下来我们分析这个URL的参数,参数在右侧的WebForms内:
17
上图中的这个url对应的响应就是需要抓取的数据,下面我们多测试几个音乐,观察参数。

我们再来抓取另一首歌曲的的相关信息。
18
经过多次的对比发现vkey不同,那么vkey怎么获取到呢?
19
找啊找,终于在上图中的的url的响应中找到了vk,其实直接找purl更方便

那么图上的url,怎么发送请求,又要观察它的参数
20
经过多次的对比发现,有多个参数不同,特别是songmid也不同,songmid怎么获取呢?找啊找,终于在搜索页面找到了songmid
21
在上图中我们看到songmid不同,但是为了更近一步验证。我们先对其格式化一下。

先给出JSON在线解析网站:
https://www.sojson.com/
下面进行JSON解析
22
通过格式化之后,我们看着就很明显了。

下面我们需要找的就是搜索页面每首歌曲的ID
23
通过抓包我们发现这个返回的是个JSON字符串
24
通过对比我们发现此部分正是我们需要的部分。下面我们来找下歌曲的mid
25

三、部分代码实现

56

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

打开如下图所示:
26
我们发现参数有很多那么可以我们尝试只添加名称看能否正常访问。链接如下:

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

27

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

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

2. 代码实现

56

  • 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、测试结果
    28

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

我们打开之后如下图:
29
下面我们找到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}}

30
🆗说明我们测试是成功的。

网址: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()
  • 2. 运行结果
    31
  • 3. 格式化查看
    32
  • 4. 尝试解析
# 代码如下
data["req_0"]["data"]["midurlinfo"][0]["purl"]

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

3.3 根据purl获取歌曲字节

3.3.1 分析

首先我们回忆下刚开始使用抓包工具抓取的音乐的URL
33
我们把url复制出来:

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

下面我们看下我们上一步中截取出来的purl
34
把它复制出来

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

35
🆗我们拼接的和我们所想的是一样的。

网址: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()
  • 2. 运行结果
    36

四、完整代码

# 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()

五、运行结果

37
38
39
50

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


51

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

52
53

  • 104
    点赞
  • 236
    收藏
    觉得还不错? 一键收藏
  • 70
    评论
QQ音乐爬虫推荐系统是指通过爬取QQ音乐平台上的各种音乐内容数据,并基于此数据进行推荐系统的开发与应用。 首先,爬虫是指通过程序自动获取网页上的数据的技术。爬取QQ音乐的数据可以包括歌曲的基本信息、歌手的作品、用户的播放习惯等等。这些数据可以通过程序从QQ音乐平台上获取,然后进行清洗和存储。 其次,推荐系统是根据用户的个性化需求和历史行为,在大量数据的基础上给用户生成个性化推荐结果的系统。通过分析爬取到的QQ音乐数据,可以利用推荐算法来为用户推荐他们可能喜欢的音乐。 在QQ音乐爬虫推荐系统中,可以根据不同的推荐策略来进行推荐,如基于内容的推荐、协同过滤推荐等。基于内容的推荐是根据歌曲的特征信息,如歌曲的风格、歌手的分类、歌曲的时长等,来计算相似度,然后推荐用户可能喜欢的相似歌曲。协同过滤推荐则是根据用户的历史行为和其他用户之间的行为相似性,来推荐具有相似兴趣的用户喜欢的歌曲。 此外,还可以加入其他因素来进行推荐,如用户的地域、时间等。例如,可以根据用户所在地区的热门歌曲推荐一些本地区用户喜欢的音乐;或者根据用户的时间偏好,比如上午推荐轻松舒缓的音乐,晚上推荐安静放松的音乐等。 总的来说,QQ音乐爬虫推荐系统可以通过爬取QQ音乐的数据,并基于推荐算法和其他因素给用户个性化的推荐结果,提高用户的使用体验和音乐发现的便利性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 70
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值