十行代码帮助小姐姐给偶像送上最真挚的礼物----爬虫词云齐上阵,熬夜精心制作
这是本文思路,谢谢观看
- 十行代码帮助小姐姐给偶像送上最真挚的礼物----爬虫词云齐上阵,熬夜精心制作
- 故事背景
- 制作过程
- 1.爬虫的帮助
- 2.词云的帮助
- 成果展示
首先,最近河南暴雨严重,希望河南的小伙伴们保护好自己,也希望大家少一点关注娱乐圈毫无意义的瓜,多去关注一下河南的暴雨救援情况,贡献出自己的力所能及的帮助。加油,We are always by your side!!!
hello,大家好,我又来了,快上车!别问我是谁,问就是迷一样的男人!
故事背景
最近嘛,有位朋友找我帮忙嘛,希望我帮她做一份礼物,送给一直鼓舞着她不断向前,不断努力奋斗的偶像…,好家伙,我直接感动了,优质偶像的作用竟是如此之大!(一定要追有意义的优质明星,当一个理智的粉丝,而不是一群(nao can)粉)
就冲她是个小姐姐,这个忙我一定帮! 于是我爽快地答应了!
了解到这位小姐姐的偶像是一位歌手后,我以歌曲为出发点,开始准备这份特别的礼物。(由于不太方便透露信息,以后都以我的偶像原创歌手薛之谦来写,希望大家谅解)
话不多说,开干!
制作过程
首先,我觉得作为一名优秀的歌手,歌曲的质量是放在第一位的,无关颜值无关综艺感,更无关演技,当然还是要以人品为首位!所以我打算从歌曲评论为出发点去制作这个礼物!
1.爬虫的帮助
说到评论,最先想到的便是爬虫了,把评论爬取下来。于是我打开了网易云音乐官网,找到了我最近比较喜欢的歌《变废为宝》正常套路,检测其端口,获取相关数据:
这是最终的代码:利用 requests 进行网页请求;利用json 进行格式转换
我把爬取来的评论放到了一个名为:变废为宝.txt的txt文本文档中
import requestsimport json
def get_hot_comments(res):
comments_json = json.loads(res.text)
hot_comments = comments_json['hotComments']
with open('变废为宝.txt', 'w', encoding='utf-8') as file:
for each in hot_comments:
file.write(each['user']['nickname'] + ':\n\n')
file.write(each['content'] + '\n')
file.write("---------------\n")
def get_comments(url):
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400',
'referer': 'https://music.163.com/'
}
params = "Brz3HT85JisY8LDEnLmxi / xmif2K6blJa6S98 / yJLqJC57FXl3 / X2 / N4o7f + rI6X + XrTVC7x8LcajFJFdaJGEYAzGbBN6WQLsJSqWbi5PYjJ0DHpXPSqZk0o / +GOJigre4SPFZy1sAQvV + BNovPMpsaKevgNxMftnwzEictv6k2arH0y5XLZZ0y8P3FNYYgZ + s70qhLJHf8B5bfjf23uSiFaclQFGpM / Sn202q / iHgxXSq4f7y1NkFXlXXMfNn8io09KCa1yynKed9W1ptPI5q4Jj + 5\
FQQgDYyXKHAvl1SisUm3Pj8rtl + VIGJFvyIVE"
encSecKey = "d180e107a8c7d417d1a27bc23f2321b97d1744df31c17415843a41015fbec1ae3b681d45fc3d98974f05e1b552d5a5b54c750637f68d0b36e74596211e8db6d9d9969b52589a57c48c98a1c87dfaf3f93a228be636def04e36fd8ea2fe4c345b0951a9fe5fc8043937b753bbe5339a7d7180b0813b31af734668ab6f08eaa8c5"
data = {
"params ": params,
"encSecKey": encSecKey
}
name_id = url.split('=')[1]
target_url = "https://music.163.com/api/v1/resource/comments/R_SO_4_{}?csrf_token=".format(name_id)
res = requests.post(target_url, headers=headers, data=data) # 传入它的关键字参数
return res
def main():
url = input("请输入链接地址:")
res = get_comments(url) # 返回给相关获取的网页资源
get_hot_comments(res)
if __name__ == "__main__":
main()
这些都是一个个评论:
2.词云的帮助
如何快速的看出一首歌的影响力,主要在于看这首歌的评论趋向,到底是称赞多呢还是拉跨多呢,又或者评论趋向于那几点呢?这个时候词云的作用是十分巨大的,他可以把关键词集中在一起,并且出现关键词的次数越多的话,在词云中的显现会更加明显。
话不多说,我们直接开搞:
# -*-coding:utf-8 -*-# @Author:到点了,心疼徐哥哥
# 奥利给干!!!
import wordcloud #导入词云库
import numpy as np
import matplotlib.pyplot as plt
import PIL
import jieba
import re
with open(r'变废为宝.txt',encoding='utf8') as fp:
text1 = fp.readlines()#打开我们之前爬虫爬下来的txt文件
image1 = PIL.Image.open(r'a.jpg')#导入图片,作为词云的形状,不是背景图,只影响词云的形状
MASK = np.array(image1)#把图片转化为数组格式,需要用img=np.array(img)做转换,才能看到shape属性,是(height,width,channel)数组,channel的通道顺序为RGB。
WC = wordcloud.WordCloud(font_path = 'simkai.ttf',max_words=200,
max_font_size=200,mask = MASK,height= 4000,width=4000,
background_color='white',repeat=False,mode='RGB',random_state = 42)
st1 = re.sub('[,。、“”‘ ’]','',str(text1)) #使用正则表达式将符号替换掉。
#re.sub共有五个参数。其中三个必选参数:pattern, repl, string两个可选参数:count, flags
# 第一个参数:pattern,表示正则中的模式字符串,这个没太多要解释的。
#第二个参数:repl,就是replacement,被替换,的字符串的意思。
# 第三个参数:string,即表示要被处理,要被替换的那个string字符串。
conten = ' '.join(jieba.lcut(st1))
con = WC.generate(conten)
plt.imshow(con)
plt.axis('off')#隐藏坐标轴
plt.show() #显示图片
path = r'C:\Users\xuyip\PycharmProjects\pythonProject33\pyecharts'
con.to_file(path+r'\beautifulcloud.png')#保存图片
这里我们主要使用了wordcloud这个词云库,我们详细的说一下词云的各种可修改的格式和风格
WC = wordcloud.WordCloud(font_path = 'simkai.ttf',max_words=200,max_font_size=200,mask = MASK,height= 4000,width=4000,
background_color='white',repeat=False,mode='RGB',random_state = 42)
width:画布宽度(默认为400像素)
height:画布高度(默认为200)
margin:每个单词间的间隔 (默认为2)
prefer_horizontal :词语水平方向排版出现的频率(默认为0.9,注意水平排版和垂直排版概率之和为1,因此默认垂直方向排版为0.1)
mask:nd-array or None (default=None), 简单理解为绘制模板。当mask不为0时,那么之前依据height和width设置的画布则作废,此时“画布”形状大小由mask决定。
scale:float (default=1). 计算和绘图之间的比例(就是放大画布的尺寸,也可以叫比例尺)
max_words:number (default=200) 最大显示单词字数。
max_font_size:int or None (default=None) 最大单词的字体大小,如果没有设置的话,直接使用画布的大小。
stopwords:set of strings or None 被淘汰不用于显示的词语,默认使用内置的stopwords。
background_color:color value (default=”black”) 词云图像的背景色,默认为黑色。
mode:string (default=”RGB”) 当mode=“RGBA”且background_color=“None”时,将生成透明的背景。
relative_scaling:float (default=’auto’) 词频大小对字体大小的影响度。如果设置为1的话,如果一个单词出现两次那么其字体大小为原来 的两倍。
random_state:设置有多少种随机生成状态,即有多少种配色方案
这里我们将背景色设为了白色:background_color=‘white’(也有别的颜色,可以随意设置) 最大单词数我们设置为max_words=200,最多配色数设置为random_state = 42,最大单词字体型号设置为:max_font_size=200
然后大功告成!
成果展示
让我们来看看最终成果吧:
这便是一个简单的词云了,从中我们可以看出大家对这首歌评论的关键词,因为我们的背景图片只是一个圆,这样多少有点low,能不能换成别的呢,答案是:能!
我们接着看:
我们找到薛之谦的一张图片,已之为背景图,但这张图片必须只有人物,也就是把背景去掉,把人物抠出来(需要一丢丢的抠图技术,不要说不会哟,我默认你会ps),词云才会以人物身体来作为背景
DuangDuangDuang:
啥也不说,先鼓三分钟掌,然后我又为小姐姐陆陆续续做了十张左右,小姐姐直接感激的痛哭流涕!其实这是我花了一个晚上熬夜制作的,不过没事,帮助他人是一件非常快乐的事,希望大家也为他人伸出援助之手,我们一起加油!
哈哈哈,这就是今天要给大家分享的全部内容了
如果你喜欢的话,就不要吝惜你的一键三连了~