文档章节

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

o
 osc_9na1lmr9
发布于 07/05 11:50
字数 1734
阅读 19
收藏 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.效果展示

  1. 打包成.exe

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

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

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

【四、总结】

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

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

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

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

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

IT共享之家

入群请在微信后台回复【入群】


想学习更多Python网络爬虫与数据挖掘知识,可前往专业网站:http://pdcfighting.com/

o
粉丝 0
博文 79
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.4K
6
CDH5: 使用parcels配置lzo

一、Parcel 部署步骤 1 下载: 首先需要下载 Parcel。下载完成后,Parcel 将驻留在 Cloudera Manager 主机的本地目录中。 2 分配: Parcel 下载后,将分配到群集中的所有主机上并解压缩。 3 激...

cloud-coder
2014/07/01
6.8K
1
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
5.4K
8
网页抓取工具 --pyrailgun

这是一个非常简单易用的抓取工具 怎么使用? 首先你需要创建一个对应站点的规则文件 比如test.json { } 然后在代码里面把它作为一个任务加入到railgun from railgun import RailGun railgun =...

baizhongwei
2013/02/28
7.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在Android中以像素为单位获取屏幕尺寸 - How to get screen dimensions as pixels in Android

问题: I created some custom elements, and I want to programmatically place them to the upper right corner ( n pixels from the top edge and m pixels from the right edge). 我创建......

javail
58分钟前
7
0
如何在不安装Microsoft Office的情况下用C#创建Excel(.XLS和.XLSX)文件?

问题: 如何在不使用运行代码的计算机上安装Excel的情况下使用C#创建Excel电子表格? 解决方案: 参考一: https://stackoom.com/question/dHZ/如何在不安装Microsoft-Office的情况下用C-创...

技术盛宴
今天
7
0
如何使用pip升级所有Python软件包? - How to upgrade all Python packages with pip?

问题: Is it possible to upgrade all Python packages at one time with pip ? 是否可以通过pip一次升级所有Python软件包? Note : that there is a feature request for this on the off......

法国红酒甜
今天
21
0
活体检测+合成图鉴别面前,人脸“照片活化”黑产攻击一秒被擒

本文作者:y****n 如今,随着人脸技术的日趋成熟,新兴娱乐文化得到了极大的推动,尤其是随着 DeepFake、FaceSwap 等人脸编辑及生成技术的发展,虚拟主播、人脸合成带给人们全新的体验,但同...

百度开发者中心
昨天
12
0
如何在SQL Server中将多行文本合并为单个文本字符串?

问题: Consider a database table holding names, with three rows: 考虑一个包含名称的数据库表,该表具有三行: PeterPaulMary Is there an easy way to turn this into a single str......

富含淀粉
今天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部