【一、项目目标】

通过手把手教你使用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.效果展示

7. 打包成.exe

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

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

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

源码加群:850591259

python音乐的数据抓取与分析_手把手教你使用Python抓取QQ音乐数据!相关推荐

  1. python爬取qq音乐歌曲链接为什么播放不出来_手把手教你使用Python抓取QQ音乐数据(第一弹)...

    原标题:手把手教你使用Python抓取QQ音乐数据(第一弹) [一.项目目标] 获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 由浅入深,层层递进,非常适合刚入门的同学练手. ...

  2. python玩王者荣耀皮肤碎片怎么获得_手把手教你使用python获取王者荣耀英雄及皮肤高清图片...

    # -*- coding: utf-8 -*- """ __title__ = '爬取王者荣耀英雄及皮肤高清图片' __author__ = '张佑' __mtime__ ...

  3. 手把手教你入侵网站修改数据_手把手教你使用Python抓取QQ音乐数据(第四弹)...

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

  4. 如何用python抓取qq音乐_手把手教你使用Python抓取QQ音乐数据(第三弹)-阿里云开发者社区...

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

  5. python爬取资料怎么样_手把手教你Python爬取新房数据

    原标题:手把手教你Python爬取新房数据 项目背景 新房数据,对于房地产置业者来说是买房的重要参考依据,对于房地产开发商来说,也是分析竞争对手项目的绝佳途径,对于房地产代理来说,是踩盘前的重要准备. ...

  6. python爬虫爬取房源_手把手教你用Python网络爬虫爬取新房数据

    项目背景 大家好,我是J哥. 新房数据,对于房地产置业者来说是买房的重要参考依据,对于房地产开发商来说,也是分析竞争对手项目的绝佳途径,对于房地产代理来说,是踩盘前的重要准备. 今天J哥以「惠民之家」 ...

  7. python进行数据预测_手把手教你用Python进行时间序列分解和预测

    原标题:手把手教你用Python进行时间序列分解和预测 作者:Mohit Sharma 翻译:数据派THU-王闯(Chuck) 预测是一件复杂的事情,在这方面做得好的企业会在同行业中出类拔萃.时间序列 ...

  8. python数据预测代码_手把手教你用Python玩转时序数据,从采样、预测到聚类丨代码...

    原标题:手把手教你用Python玩转时序数据,从采样.预测到聚类丨代码 原作 Arnaud Zinflou 郭一璞 编译 时序数据,也就是时间序列的数据. 像股票价格.每日天气.体重变化这一类,都是时 ...

  9. python网页爬虫循环获取_手把手教你用 Python 搞定网页爬虫

    原标题:手把手教你用 Python 搞定网页爬虫 编译:欧剃 作为数据科学家的第一个任务,就是做网页爬取.那时候,我对使用代码从网站上获取数据这项技术完全一无所知,它偏偏又是最有逻辑性并且最容易获得的 ...

最新文章

  1. C语言之分支结构 if(一)
  2. 一个常用的正则表达验证类
  3. Java学习总结:36(日期处理类)
  4. 1微秒等于多少皮秒_注册汽油贸易公司分享1升汽油等于多少公斤?
  5. Linux函数名加数字,C++ 编译器的函数名修饰规则
  6. Apache ZooKeeper - 使用原生的API操作ZK_ACL权限
  7. Linux bash逐行读取文件的方法
  8. 文件 在线压缩 技术
  9. JavaOne和OOW 2015总结
  10. PHP 函数截图 哈哈哈
  11. 成中集团线下IDC迁移上云
  12. python笔记(一)获取当前目录路径和文件(抄录)
  13. 系统与服务器断开了连接不上,win7系统电脑玩跑跑卡丁车出现与服务器断开连接的解决方法...
  14. 团队项目计划、人员安排以及开发方法
  15. C语言入门题库——求2+22+222+......+22222的值
  16. Python编写函数,计算某个员工的奖金发放额度,要求输入员工的营业额,输出对应的奖金总额
  17. 苹果或将微信下架系谣言,苹果微信牵手ios11
  18. R代码学习(5)——数据类型(字符串)
  19. 【测评】抗原乳化方法学评测:去离子水乳化、机械乳化法、PBS 缓冲液乳化..
  20. 探索性分析——某医院18年销售数据分析

热门文章

  1. 火狐浏览器驱动 python_python + selenium自动化测试环境搭建 及 火狐驱动
  2. electron播放本地任意格式的视频
  3. 机器学习1:——Pandas——1:基本数据操作
  4. excel文件中的数据转化为json格式并输出json文件
  5. PMP考试成绩出来了,怎么才算合格?
  6. 王者荣耀服务器未响应WIFI,王者荣耀WIFI不稳定原因介绍 无线网很卡解决方法
  7. 第四套人民币身价大变 1980年版50元涨六倍
  8. 消防安保主题的微信公众号图文应该怎样排版?
  9. 多线程—7种同步方法
  10. 持续集成回顾暨点滴分享[4] – 静态代码检查,单元测试好基友!