当前位置: 首页 > 后端技术 > Python

教你用Python抓取QQ音乐数据(四)

时间:2023-03-26 11:42:30 Python

【1.项目目标】通过一步步教你用Python抓取QQ音乐数据(上)我们实现了QQ音乐指定歌手单曲的获取排名靠前的歌曲的歌名、专辑名、播放链接指定页数。通过教大家使用Python抓取QQ音乐数据(下),我们实现了获取QQ音乐指定歌曲的歌词和指定歌曲首页的热评。通过教大家使用Python抓取QQ音乐数据(下),我们实现了更多的评论和词云图的生成。这次我们将三个项目打包在一起,通过菜单控制不同数据的爬取。[2。需要的库】主要涉及的库有:requests、openpyxl、html、json、wordcloud、jieba如果需要更改词云图背景图还需要numpy库和PIL库(pipinstallpillow)如果需要生成.exe,你需要pyinstaller-F[3.项目实现】1、首先确定菜单,实现哪些功能:①获取指定歌手的歌曲信息(歌名、专辑、链接)②获取指定歌曲的歌词③获取指定歌曲的评论④生成词云图⑤退出系统代码如下:*************************classQQ():defmenu(self):print('欢迎来到QQ音乐爬虫系统,下面是功能菜单,请选择。n')whileTrue:try:print('功能菜单n1.获取指定歌手的歌曲信息n2.获取指定歌曲的歌词n3.获取指定歌曲的评论n4.生成词云图n5.退出系统n')choice=int(input('请输入数字选择对应的功能:'))ifchoice==1:self.get_info()elif选择==2:self.get_id()self.get_lyric()elif选择==3:self.get_id()self.get_comment()elif选择==4:self.wordcloud()elif选择==5:print('感谢使用!')breakelse:print('输入错误,p租赁重入。n')except:print('输入错误,请重新输入。n')第一行创建类,第二行定义菜单功能。这里使用类的实例化。里面所有函数的第一个参数都是self。我觉得实例化传递参数更方便;whiletrue使菜单无限循环;Try...except...这样循环就不会因为出错而退出;其他代码打开不同的功能来设置不同的号码。2、封装工程(一)是get_info()代码如下:***********************************************************defget_info(self):wb=openpyxl.Workbook()/#创建工作簿sheet=wb.active/#获取工作簿的activitysheetsheet.title='song'/#重命名工作表sheet['A1']='songname'/#添加表头,给A1单元格赋值sheet['B1']='Album'/#添加表头,给B1单元格赋值=input('请输入要查询的歌手姓名:')page=int(input('请输入要查询歌曲的页码:'))forxinrange(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','不ice':'0','platform':'yqq.json','needNewCode':'0'}res=requests.get(url,params=params)json=res.json()list=json'data'['list']formusicinlist:song_name=music['name']/#找到歌曲名并将歌曲名赋值给song_namealbum=music'album'/#找到专辑名,将专辑名赋值给albumlink='https://y.qq.com/n/yqq/song/'+str(music['mid'])+'.htmlnn'/#找到播放链接并赋值tolinksheet.append([song_name,album,link])/#把名字、专辑和链接写成一个列表,用append函数写多行到Excelwb.save(name+'个人单曲排行榜'+str(page/*20)+'list.xlsx')/#最后保存并命名这个Excel文件print('下载成功!n')3.封装工程(2)get_id()和get_lyric的代码如下:***********************************************defget_id(self):self.i=input('请输入歌名:')url_1='https://c.y.qq.com/soso/fcgi-...'/#这是请求歌曲评论的urlheaders={'user-agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/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','无损':'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','通知':'0','平台':'yqq.json','needNewCode':'0'}res_music=requests.get(url_1,headers=headers,params=params)json_music=res_music.json()self.id=json_music'data''list'['id']/#print(self.id)defget_lyric(self):url_2='https://c.y.qq.com/lyric/fcgi...'/#这是请求歌曲评论的urlheaders={'origin':'https://y.qq.com','referer':'https://y.qq.com/n/yqq/song/0...','user-agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/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+'lyric.txt','a',encoding='utf-8')/#存储到txtf1.writelines(lyric_html)f1.close()print('下载成功!n')这里专门说说下载歌词'origin'和'referer'必须添加到标题中,或者向下抓取数据4、封装工程(3)为get_comment()和wordcloud()代码如下:***************************************defget_comment(self):page=input('请输入要下载的评论页数:')url_3='https://c.y.qq.com/base/fcgi-...'headers={'user-agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36'}f2=open(self.i+'comments.txt','a',encoding='utf-8')/#Storetotxtforninrange(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'foriincomments:comment=i['rootcommentcontent']+'n————————————————————————————————————————n'f2.writelines(comment)/#print(comment)f2.close()print('下载成功!n')defwordcloud(self):self.name=input('请输入文件名生成词云图:')defcut(text):wordlist_jieba=jieba.cut(text)space_wordlist="".join(wordlist_jieba)返回space_wordlistwithopen(self.name+".txt",encoding="utf-8")asfile:text=file.read()text=cut(text)mask_pic=numpy.array(Image.open("heart.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.效果展示打包成.exe,用pyinstaller-F打包。运行时会报错并闪退。见上图。报错信息应该和词云图有关。注释掉词云图。library,defwordcloud()如下图修改可以正常打包,但是没有生成词云的功能:下载歌词或者评论的时候,如果有同名歌曲,可以加上歌手的歌名前面,如上图“邓紫棋泡泡”。[4.总结】1、项目4复习了前三个项目,在巩固爬虫知识点的同时复习了类的相关用法;2.前三个项目可自行盖章;学习文章:手把手教你用Python抓QQ音乐数据(第一轮),教你用Python抓QQ音乐数据(第二轮),教你用Python抓QQ音乐数据(第三轮)。3.感谢观看,一百多行代码还不容易写吗?祝大家学习和工作顺利!4、如需本文源码,请在公众号后台回复“QQ音乐”获取。觉得不错记得给个star哦。看完这篇文章你有收获吗?请转发分享给更多的人加入IT分享之家群,请在微信后台回复【进群】如果想深入了解Python网络爬虫和数据挖掘,可以上专业网站:http://pdcfighting.com/