手把手教你使用Python抓取QQ音乐数据(第三弹)
【一、项目目标】
通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名、专辑名、播放链接。
通过手把手教你使用Python抓取QQ音乐数据(第二弹)我们实现了获取 QQ 音乐指定歌曲的歌词和指定歌曲首页热评。
此次我们在项目(二)的基础上获取更多评论并生成词云图,形成手把手教你使用Python抓取QQ音乐数据(第三弹)。
【二、需要的库】
主要涉及的库有:requests、json、wordcloud、jieba
如需更换词云图背景图片还需要numpy库和PIL库(pipinstall pillow)
【三、项目实现】
1、首先回顾一下,下面是项目(二)获取指定歌曲首页热评的代码;
def get_comment(i):
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',
# 标记了请求从什么设备,什么浏览器上发出 } 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': id, 'cmd': '8', 'needmusiccrit': '0', 'pagenum': '0', 'pagesize': '25', '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['hot_comment']['commentlist'] f2 = open(i+'评论.txt','a',encoding='utf-8') #存储到txt中 for i in comments: comment = i['rootcommentcontent'] + '\n——————————————————————————————————\n' f2.writelines(comment) # print(comment)
f2.close()
2、下面来考虑如何获取后面的评论,下图是项目(二)评论页面的parms参数;
image
3、网页无法选择评论的页码,想看后面的评论智能一次一次的点击“点击加载更多”;我们可以点击一下看看parms有什么变化。
image
4、这里有个小技巧,先点击下图所示clear按钮,把network界面清空,再点击“点击加载更多”,就能直接找到第二页的数据。
image
image
5、点击加载更多后出现下图。
image
image
6、发现不止pagenum变了,cmd和pagesize也变了,到底那个参数的问题呢,那我们再看下第三页;
image
7、只有pagenum变了,那我们尝试一下把pagenum改成“0”,其他不变,能正常显示第一页数据吗?
image
第一页第一条评论
image
第一页最后一条评论
image
8、能正常显示,那就确定思路了:用第二页的parms,写一个for循环赋值给pagenum,参考项目(二)把评论抓取到txt。
9、代码实现:为了不给服务器造成太大压力,我们本次只爬取20页数据。
import requests,json
def get_id(i):
global id 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': 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() id = json_music['data']['song']['list'][0]['id'] return id # print(id)
def get_comment(i):
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(i+'评论.txt','a',encoding='utf-8') #存储到txt中 for n in range(20): 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': '247347346', 'cmd': '6', 'needmusiccrit': '0', 'pagenum':n, 'pagesize': '15', 'lasthotcommentid': 'song_247347346_3297354203_1576305589', '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() input('下载成功,按回车键退出!')
def main(i):
get_id(i) get_comment(i)
main(i = input('请输入需要查询歌词的歌曲名称:'))
10、词云图代码
from wordcloud import WordCloud
import jieba
import numpy
import PIL.Image as Image #以上两个库是为了更换词云图背景图片
def cut(text):
wordlist_jieba=jieba.cut(text) space_wordlist=" ".join(wordlist_jieba) return space_wordlist
with open("句号评论.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) image=wordcloud.to_image() # image.show() wordcloud.to_file('云词图.png') # 把词云保存下来
11、成果展示
image
image
【四、总结】
1、项目三比项目二多的功能:一是通过寻找parms参数里每一页评论页码之间的关系,爬取更多的评论;二是学会生成词云图;(注意读取文件的路径)
2、WordCloud更多参数详见下图,可以研究出更多的玩法;
image
3、不只.txt可以作为词云图的数据源,csv、Excel也可以:
import xlrd
引入excel读取模块
datafile_path = '你的Excel文件.xlsx'
data = xlrd.open_workbook(datafile_path)
文件名以及路径
table = data.sheet_by_name('sheet')
通过名称获取Sheet1表格
nrows = table.nrows
获取该Sheet1中的有效行数
list = []
for i in range(nrows):
value = str(table.row_values(i)[1]) # print(value) list.append(value)
print(pingjia_list)
text = str(list).replace("'", '').replace(',', '').rstrip(']').lstrip('[')
print(text)
4、爬QQ音乐项目到此告一段落,如有需要的话可以通过Scrapy框架爬取更多的歌曲信息、歌词、评论。但是作为练手项目,重要的不是爬多少数据,而是学会如何爬取指定的数据。
5、第四弹小编将会把前面三个项目封装在一起,通过菜单控制爬取不同数据,敬请期待。
6、需要本文源码的话,请在公众号后台回复“QQ音乐”四个字进行获取。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Flutter 85: Flutter Attach 调试 Flutter Code
在实际开发过程中,为了满足项目业务方面以及兼容历史代码等方面,经常会采取 Flutter 功能模块以 aar 或 Module 等引入方式;而 Flutter Code 代码是与 Android / iOS Native Code 区分为两个工程的;此时若需要调试应该怎么处理呢? Android 小菜目前主要从事 Android 开发,日常用的最多的是 Run / Debug 跟踪运行项目,而目前 Flutter Module 作为 Native Project 的子模块,直接 Run / Debug 会把 Flutter Module 当作一个新的 Project 运行; 此时需要通过 Flutter Attach 方式在 AndroidStudio 与设备之间建立 Socket 连接,之后便可以对 Flutter Code 进行调试; Flutter Attach 运行 Flutter Code;此时等待连接 Waiting for a connection from Flutter on Redmi K30 5G... 运行安装 Android Native apk; 与设备同步...
- 下一篇
浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试
文章目录 Java的静态代理 静态代理的优缺点 ABAP的静态代理 Spring AOP的动态代理 JDK动态代理的优缺点 CGLIB动态代理的优缺点 ABAP CGLIB的模拟实现 ABAP Pre和Post Exit Jerry之前一篇文章 SAP产品增强技术回顾,提到基于Java编程语言实现的SAP Commerce,借助Spring框架的支持,能使用面向切面编程的理念(Aspect Orient Programming,以下简称AOP),将业务代码和非业务代码(比如权限检查,日志记录,性能统计等)彻底分离开。 下图是某应用里方法的常规实现:权限检查,日志记录和性能检测的代码一次又一次地侵入到本应只包含业务代码的三个方法中: 下图是应用AOP之后的方法实现:三个方法体内只包含纯粹的业务代码,看起来清爽了很多。权限检查,日志记录和性能检测的代码,作为仍需关注的三个方面,以切面的方式编织到三个方法中。Weave,AOP里的术语,中文材料里经常译成“编织”,描述了被代理类的方法通过非源代码修改层面被增添以新逻辑的动作。 我们说面向对象编程(Object Oriented Program...
相关文章
文章评论
共有0条评论来说两句吧...