百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

手把手教你使用Python抓取QQ音乐数据(第四弹)

off999 2024-12-30 06:06 27 浏览 0 评论

【一、项目目标】

通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名、专辑名、播放链接。

通过手把手教你使用Python抓取QQ音乐数据(第二弹)我们实现了获取 QQ 音乐指定歌曲的歌词和指定歌曲首页热评。

通过手把手教你使用Python抓取QQ音乐数据(第三弹)我们实现了获取更多评论并生成词云图。

此次我们将将三个项目封装在一起,通过菜单控制爬取不同数据。

【二、需要的库】

主要涉及的库有:requests、openpyxl、html、json、wordcloud、jieba

如需更换词云图背景图片还需要numpy库和PIL库(pipinstall pillow)

如需生成.exe需要pyinstaller -F

【三、项目实现】

1.首先确定菜单,要实现哪些功能:

①获取指定歌手的歌曲信息(歌名、专辑、链接)

②获取指定歌曲歌词

③获取指定歌曲评论

④生成词云图

⑤退出系统

代码如下:

class QQ():
    def menu(self):
        print('欢迎使用QQ音乐爬虫系统,以下是功能菜单,请选择。\n')
        while True:
            try:
                print('功能菜单\n1.获取指定歌手的歌曲信息\n2.获取指定歌曲歌词\n3.获取指定歌曲评论\n4.生成词云图\n5.退出系统\n')
                choice = int(input('请输入数字选择对应的功能:'))
                if choice == 1:
                    self.get_info()
                elif choice == 2:
                    self.get_id()
                    self.get_lyric()
                elif choice == 3:
                    self.get_id()
                    self.get_comment()
                elif choice == 4:
                    self.wordcloud()
                elif choice == 5:
                    print('感谢使用!')
                    break
                else:
                    print('输入错误,请重新输入。\n')
            except:
                print('输入错误,请重新输入。\n')  

第一行创建类,第二行定义菜单函数,这里用了类的实例化,里面所有函数的第一个参数都是self,我认为实例化更方便传参数;

whiletrue使菜单无限循环;

Try...except...使循环不会因报错而退出;

其他代码为设置输入不同数字对应打开不同函数。

2.封装项目(一)为get_info()

代码如下:

def get_info(self):
        wb=openpyxl.Workbook()  
        #创建工作薄
        sheet=wb.active 
        #获取工作薄的活动表
        sheet.title='song' 
        #工作表重命名
 
        sheet['A1'] ='歌曲名'     #加表头,给A1单元格赋值
        sheet['B1'] ='所属专辑'   #加表头,给B1单元格赋值
        sheet['C1'] ='播放链接'   #加表头,给C1单元格赋值
        url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
        name = input('请输入要查询的歌手姓名:')
        page = int(input('请输入需要查询的歌曲页数:'))
        for x in range(page):
            params = {
            'ct':'24',
            'qqmusic_ver': '1298',
            'new_json':'1',
            'remoteplace':'sizer.yqq.song_next',
            'searchid':'64405487069162918',
            't':'0',
            'aggr':'1',
            'cr':'1',
            'catZhida':'1',
            'lossless':'0',
            'flag_qc':'0',
            'p':str(x+1),
            'n':'20',
            'w':name,
            'g_tk':'5381',
            'loginUin':'0',
            'hostUin':'0',
            'format':'json',
            'inCharset':'utf8',
            'outCharset':'utf-8',
            'notice':'0',
            'platform':'yqq.json',
            'needNewCode':'0'    
            }
            res = requests.get(url,params=params)
            json = res.json()
            list = json['data']['song']['list']
            for music in list:
                song_name = music['name']
                # 查找歌曲名,把歌曲名赋值给song_name
                album = music['album']['name']
                # 查找专辑名,把专辑名赋给album
                link = 'https://y.qq.com/n/yqq/song/' + str(music['mid']) + '.html\n\n'
                # 查找播放链接,把链接赋值给link
                sheet.append([song_name,album,link])
                # 把name、album和link写成列表,用append函数多行写入Excel
                
        wb.save(name+'个人单曲排行前'+str(page*20)+'清单.xlsx')            
        #最后保存并命名这个Excel文件
        print('下载成功!\n')

3.封装项目(二)为get_id()和get_lyric

代码如下:

def get_id(self):
        self.i = input('请输入歌曲名:')
        url_1 = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
        # 这是请求歌曲评论的url
        headers = {'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
        params = {'ct': '24', 'qqmusic_ver': '1298', 'new_json': '1', 'remoteplace': 'txt.yqq.song', 'searchid': '71600317520820180', 't': '0', 'aggr': '1', 'cr': '1', 'catZhida': '1', 'lossless': '0', 'flag_qc': '0', 'p': '1', 'n': '10', 'w': self.i, 'g_tk': '5381', 'loginUin': '0', 'hostUin': '0', 'format': 'json', 'inCharset': 'utf8', 'outCharset': 'utf-8', 'notice': '0', 'platform': 'yqq.json', 'needNewCode': '0'}  
        res_music = requests.get(url_1,headers=headers,params=params)
        json_music = res_music.json()
        self.id = json_music['data']['song']['list'][0]['id']
        # print(self.id)
 
    def get_lyric(self):
        url_2 = 'https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_yqq.fcg'
        # 这是请求歌曲评论的url
        headers = {
        'origin':'https://y.qq.com',
        'referer':'https://y.qq.com/n/yqq/song/001qvvgF38HVc4.html',
        'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
        params = {
            'nobase64':'1',
            'musicid':self.id,
            '-':'jsonp1',
            'g_tk':'5381',
            'loginUin':'0',
            'hostUin':'0',
            'format':'json',
            'inCharset':'utf8',
            'outCharset':'utf-8',
            'notice':'0',
            'platform':'yqq.json',
            'needNewCode':'0',
            }
        res_music = requests.get(url_2,headers=headers,params=params)
        js_1 = res_music.json()
        lyric = js_1['lyric']
        lyric_html = html.unescape(lyric)   #用了转义字符html.unescape方法
        # print(lyric_html)
        f1 = open(self.i+'歌词.txt','a',encoding='utf-8')    #存储到txt中
        f1.writelines(lyric_html)
        f1.close()
        print('下载成功!\n')

这里特别说一下下载歌词的headers里必须加上’origin’和’referer’,要不爬下来数据。

4.封装项目(三)为get_comment()和wordcloud()

代码如下:

def get_comment(self):
        page = input('请输入要下载的评论页数:')
        url_3 = 'https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg'
        headers = {'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
        f2 = open(self.i+'评论.txt','a',encoding='utf-8')    #存储到txt中
        for n in range(int(page)):
            params = {'g_tk_new_20200303': '5381', 'g_tk': '5381', 'loginUin': '0', 'hostUin': '0', 'format': 'json', 'inCharset': 'utf8', 'outCharset': 'GB2312', 'notice': '0', 'platform': 'yqq.json', 'needNewCode': '0', 'cid': '205360772', 'reqtype': '2', 'biztype': '1', 'topid': self.id, 'cmd': '6', 'needmusiccrit': '0', 'pagenum':n, 'pagesize': '15', 'lasthotcommentid':'', 'domain': 'qq.com', 'ct': '24', 'cv': '10101010'}
            res_music = requests.get(url_3,headers=headers,params=params)
            js_2 = res_music.json()
            comments = js_2['comment']['commentlist']
            for i in comments:
                comment = i['rootcommentcontent'] + '\n——————————————————————————————————\n'
                f2.writelines(comment)
            # print(comment)
        f2.close()
        print('下载成功!\n')
 
    def wordcloud(self):
        self.name = input('请输入要生成词云图的文件名称:')
        def cut(text):
            wordlist_jieba=jieba.cut(text)
            space_wordlist=" ".join(wordlist_jieba)
            return space_wordlist
        with open(self.name+".txt" ,encoding="utf-8")as file:
            text=file.read()
            text=cut(text)
            mask_pic=numpy.array(Image.open("心.png"))
            wordcloud = WordCloud(font_path="C:/Windows/Fonts/simfang.ttf",
            collocations=False,
            max_words= 100,
            min_font_size=10, 
            max_font_size=500,
            mask=mask_pic).generate(text)
            wordcloud.to_file(self.name+'云词图.png')  # 把词云保存下来 
        print('生成成功!\n')

5.最后类的实例化

qq = QQ()
qq.menu()

6.效果展示

image

image

image

image

image

image

image

image

image

image

  1. 打包成.exe

用pyinstaller -F打包,运行会报错、闪退。

image

看上图报错信息应该和词云图有关,注释掉词云图所需的库,def wordcloud()按下图修改可正常打包,但是就没有生成词云图的功能了:

image

image

image

下载歌词或评论时,如有重名的歌曲,可在歌曲前面加上歌手姓名,如上图的“邓紫棋泡沫”。

【四、总结】

1.项目四对前三个项目进行了复习,在巩固了爬虫知识点的同时又复习了类的相关用法;

2.前三个项目可自行戳;文章进行学习:手把手教你使用Python抓取QQ音乐数据(第一弹)、手把手教你使用Python抓取QQ音乐数据(第二弹)、手把手教你使用Python抓取QQ音乐数据(第三弹)。

3.感谢观看,写百行以上的代码是不是轻轻松松呢。祝小伙伴们学业有成,工作顺利!

4.如果需要本文源码的话,请在公众号后台回复“QQ音乐”四个字进行获取,觉得不错,记得给个star噢。

****看完本文有收获?请转发分享给更多的人****

相关推荐

阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?

TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...

高流量大并发Linux TCP性能调优_linux 高并发网络编程

其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...

性能测试100集(12)性能指标资源使用率

在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...

Linux 服务器常见的性能调优_linux高性能服务端编程

一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...

Nginx性能优化实战:手把手教你提升10倍性能!

关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...

高并发场景下,Spring Cloud Gateway如何抗住百万QPS?

关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...

Kubernetes 高并发处理实战(可落地案例 + 源码)

目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...

高并发场景下,Nginx如何扛住千万级请求?

Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...

Spring Boot+Vue全栈开发实战,中文版高清PDF资源

SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...

Docker-基础操作_docker基础实战教程二

一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...

你有空吗?跟我一起搭个服务器好不好?

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...

部署你自己的 SaaS_saas如何部署

部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...

Docker Compose_dockercompose安装

DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...

京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统

前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...

Kubernetes (k8s) 入门学习指南_k8s kubeproxy

Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...

取消回复欢迎 发表评论: