美文网首页
入我豪门真的不亏~内附词云图相关分析

入我豪门真的不亏~内附词云图相关分析

作者: apricoter | 来源:发表于2020-04-11 23:36 被阅读0次

    从创造营开始,就入了豪门,一直想考古电竞男主脸--任豪的微博,这几天空闲来翻了翻从2015年10月24日他开通微博到2020年4月6日的582条原创微博,发现入豪不亏!~

    首先要爬取数据,一般web都有反爬虫机制,而且反爬虫策略一直在更新,冒着被封号的危险,踩了无数的坑,看了周鸟大佬(感谢微博id:@爱编程的周鸟)的视频后,有了以下思路:
    微博目前有3个版本,分别是手机端(https://m.weibo.cn/)、移动端(https://weibo.cn/)和网页端(https://weibo.com/),因为网页端很难操作,一般选择移动端或者手机端。本文选用移动端,界面越“丑”但越好用。
    根据周鸟大佬的视频,大家可以轻松得到喜欢的博主的所有微博(包括原创、转发、图片、视频等),根据自己的需要设置起始时段,当一切配置好后,下次直接更改博主id和cookie(有时候会过期失效)即可。
    下面贴出视频链接:
    [https://m.weibo.cn/u/3184193244?uid=3184193244&luicode=10000011&lfid=100103type%3D1%26q%3D%E5%91%A8%E9%B8%9F](https://m.weibo.cn/u/3184193244?uid=3184193244&luicode=10000011&lfid=100103type%3D1%26q%3D%E5%91%A8%E9%B8%9F]

    在此贴出几个注意点:
    ①如果本身安装了Python,这个mini版本就不需要安装了,而且要注意不同版本的冲突,如果要卸载最好先在cmd里面看自己需要什么版本再用uninstall.exe卸载
    ②如果因为空间限制,Python安装在d盘或者其他盘,就要体现设置好环境变量,并且在cmd里面要转换路径(cd /d d:/具体路径)
    ③如果怕大号被封,最好用小号的cookie
    ④如果which Python无结果,可以输where is Python试试

    部分数据截图如下:


    对提取到的微博数据,采用jieba分词模块对微博正文进行处理,首先将微博中的数字、字母、特殊符号等使用正则表达式去掉,然后使用jieba分词模块对微博正文进行分词。
    首先画一个词云图,看看豪大爷最喜欢用哪些词,具体代码如下所示:

    import requests
    import json
    import re
    import csv
    from time import sleep
    from PIL import Image
    from wordcloud import WordCloud, ImageColorGenerator  #词云库
    import matplotlib.pyplot as plt #数学绘图库
    import numpy as np
    import jieba  #分词库
    import matplotlib.font_manager as fm #需要对中文进行处理
    from os import path  #用来获取文档的路径
    
    
    #读入txt文本数据
    ywj=open(r'f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\ywj.txt',"r").read().split('\n')
    background_image = np.array(Image.open(r'f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\yt.jpg'))
    
    Rs1=[] #建立存储分词的列表
    for i in range(len(ywj)):
        result=[]
        seg_list = jieba.cut(ywj[i])
        for w in seg_list :#读取每一行分词
            result.append(w)
        Rs1.append(result)#将该行分词写入列表形式的总分词列表
    
    #写入CSV,此时仅分词
    file1=open('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\fc.csv','w')
    writer = csv.writer(file1)#定义写入格式
    writer.writerows(Rs1)#按行写入
    file1.close()
    

    得到分词后的结果:


    #打开停用词表
    ywj_stop={}.fromkeys([line.rstrip() for line in open(r'f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\stopwords.txt',"r")])
    #原txt文件
    ywj=open(r'f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\ywj.txt',"r").read().split('\n')
    Rs2=[] #建立存储分词的列表
    for i in range(len(ywj)-1):
        result=[]
        seg_list = jieba.cut(ywj[i])
        for w in seg_list :#读取每一行分词
            if w not in ywj_stop and w != ' ':
                result.append(w)
        Rs2.append(result)#将该行分词写入列表形式的总分词列表
    #写入CSV,此时是删除停用词之后的结果
    file2=open('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\stop_cutword.csv','w')
    writer = csv.writer(file2)#定义写入格式
    writer.writerows(Rs2)#按行写入
    file2.close()
    

    得到删除停用词后的结果:


    使用的背景图如下:


    #此时将stop_cutword.csv转换为txt文件
    stop_cutword=open(r'f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\stop_cutword.txt',"r").read().split('\n')
    # Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
    stop_cutword_text = "/".join(stop_cutword)
    
    wc = WordCloud(
        scale=4,
        font_path="f:\\Anaconda\\Lib\\site-packages\\wordcloud\\Fonts\\MSYH.TTF",
        background_color="white",
        max_words=200,
        max_font_size=60,
        random_state=42,
        mask=background_image).generate(stop_cutword_text)
    #为图片设置字体    
    my_font=fm.FontProperties(fname='f:\\Anaconda\\Lib\\site-packages\\wordcloud\\Fonts\\MSYH.TTF')
    #产生背景图片,基于彩色图像的颜色生成器    
    image_colors = ImageColorGenerator(background_image)
    #开始画图
    plt.imshow(wc.recolor(color_func=image_colors))
    plt.imshow(wc)
    #为云图去掉坐标轴
    plt.axis('off')
    #画云图,显示
    plt.show
    #保存云图
    wc.to_file(r"f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\hz.png")
    

    得到词云图:


    从词云图可以看出我们豪总是一个认真努力积极向上的当代好青年_

    “希望、努力、美好、梦想”,是你啊,是始终的追光者。
    生活有望穿秋水的等待也会有意想不到的惊喜。
    无需畏惧黑暗,但你要成为光。

    “RISE、ZERO、POI”,是矢志不渝的坚持啊
    你收集了世间星光,带着温柔和真诚来遇见我们。
    谢谢你经历过的一切造就了现在的任豪,接下来请一路走花路吧

    “现在、准备、马上、今晚、明天”是忙碌的豪总啊
    一直在路上,因为无尽的热情和喜爱持续输出。
    希望你能永远明朗坦荡钟情豁达,有得有失有坚持,能笑能哭能尽欢。

    ”第一次、成团、作品、录制、创造、拍照、MV、舞台“是处处有惊喜的人生啊
    星星醉酒到处跑,月亮跌进深海里,我以前从未觉得人间美好,直到你来了。
    你的种种第一次,带给我们的是处处惊喜。

    ”北京、上海、妈妈、回家“是牵挂家人的任菲特啊
    就像你说的,”我出生在一个与生俱来就铭刻着我的成都
    我把我轻狂的热血留在了杭州
    我走着人生最大转折点选择在上海
    而我将最美好的时光寄托给了你们“
    希望POI.任豪可以走出国门看世界,果仁们一路相伴!

    ”哈哈哈、纠结、开心、幸福“是充满小确辛的生活啊
    有钱会炒股、杀鱼做饭熟练、照顾别人情绪、话不多但精辟,一枚细心boy!
    笑容就像冬日的暖阳,治愈人心,愿你的笑容常在!

    ”一起、谢谢、粉丝、宝宝、十二、谢谢你们”是始终对粉丝温柔回应的人好啊
    看完b站的录播,不知道那天晚上被wjjw批成什么样,和粉丝之间的真心话
    与粉丝双向的爱,易于常人成熟的心智
    被队员都形容“稳、老大哥、豪总"的他,始终向众人展示他的好与温柔

    好吧,自己敲完的字感触颇多,感觉自己很幸运,喜欢上一个内心柔软的男孩!

    再看看豪总一般什么时候比较活跃哈
    时间在excel中是字符形式的,需要把其转换为datetime格式,然后忽略分钟对小时进行概率统计,具体代码如下:

    # 对豪总发微博的时间进行统计
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.font_manager as fm
    import seaborn as sns
    from datetime import datetime
    import pylab as pl
    # 设置背景
    sns.set_style('darkgrid')
    # 设置字体,防止中文乱码
    zhfont1 =fm.FontProperties(fname='F:\\Worktools\Fonts\MSYH.TTF')
    # 此时要将日期去掉
    works=pd.read_excel('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\time.xls')
    works['时间']=works['时间']
    Time=[]
    for i in range(0,len(works)):
        Time.append(datetime.strptime(works['时间'][i].strftime("%H:%M:%S"), '%H:%M:%S'))
        
    emmm=[]
    for i in range(0,len(Time)):
        emmm.append(Time[i].hour)
    print(emmm)
    plo=sns.distplot(emmm,label = '豪总发微博的时间',bins = np.arange(25),kde=False,color='#ff8000')
    
    # 添加横纵坐标
    plt.xlabel('time')
    plt.ylabel('numbers')
    # 设置x轴刻度
    plo.set_xticks(np.arange(0,24,1))
    # tight:坐标轴数据显示更明细
    plt.axis('tight')
    # x轴标签旋转角度
    pl.xticks(rotation=30)
    pl.xticks(rotation=30)
    # 显示图例
    plt.legend(prop=zhfont1)
    
    # 添加数据标签
    # z, y+0.05表示在每一柱子对应x值、y值上方0.05处标注
    # '%.0f'中0表示不显示小数后面的数值,1就表示显示小数后面一位,以此类推 
    # ha='center', va= 'bottom'代表horizontalalignment(水平对齐)、verticalalignment(垂直对齐)
    
    for p in plo.containers[0].patches:
            height = p.get_height()
            x, y = p.get_x() + p.get_width()/2 - 0.3, 1.02 * height
            plt.text(x, y+0.5, '{:,.0f}'.format(height),va= 'bottom')
            
    # 添加折线图,此时先得到每小时段的频数,不采用核密度是此时只想要一个纵坐标
    # def list_count(num_list):
    #     return {x: num_list.count(x) for x in set(num_list)}
    # y=list_count(emmm)
    # y=np.asarray(y.values())
    # 因为数据类型转换的问题,直接复制y-NUM
    
    # 绘制折线图
    # 0-23的自然数列
    x = np.arange(24)
    NUM=[30, 6, 4, 2, 3, 5, 5, 5, 10, 16, 19, 34, 31, 43, 32, 46, 28, 42, 45, 47, 36, 32, 39, 22]
    plt.plot(x, NUM, color="green", linestyle="--", linewidth=1)
    
    
    # 图表输出到本地
    # 注意:在plt.show()后调用了 plt.savefig(),实际上已经创建了一个新的空白的图片(坐标轴),再plt.savefig()就会保存这个新生成的空白图片。
    plt.savefig('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\time.png')
    # 显示图形
    plt.show()
    

    再直观看一下更漂亮的图吧!

    NUM=np.array(NUM)
    sortIndex = np.argsort(-NUM) # 倒序,返回排序后各数据的原始下标
    x_sort = x[sortIndex] # 重新进行排序,与y保持初始顺序一致
    y_sort = NUM[sortIndex] # 重新进行排序,倒序
    
    # 添加横纵坐标
    plt.xlabel('time')
    plt.ylabel('numbers')
    
    # 设置字体,防止中文乱码
    zhfont1 =fm.FontProperties(fname='F:\\Worktools\Fonts\MSYH.TTF')
    
    #定义函数来显示柱状上的数值
    def autolabel(rects):
        for rect in rects:
            height = rect.get_height()
            plt.text(rect.get_x()+rect.get_width()/2.-0.25, 1.01*height, '%s' % int(height))
    
    plt.xticks(np.arange(len(x_sort)), x_sort)
    a = plt.bar(np.arange(len(x_sort)),y_sort,color=['r','g','b', 'c', 'm', 'y'],label = '豪总发微博的时间')
    # 显示图例
    plt.legend(prop=zhfont1)
    autolabel(a)
    plt.savefig('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\time1.png')
    
    # 显示图形
    plt.show()
    

    由图可知,豪总一般在下午15点或者晚上18、19点的时候十分活跃,但是在23点之后甚至00点之后也依然活跃,而且在凌晨1点到5点之间也是有数次在线,也要注意休息啊

    下面再来看看点赞数、评论数和转发数,以下观点摘自知乎@蕴涵:

    点赞数反应了综合好感度。主要是路人的好感度。对于知名的一线小花小生,点赞数几十万甚至破百万都不是太难的事。光看数字参考度不强。但可以对比一下。比如都是一张自拍,说中秋快乐,一位点赞数五十万,一位三十五万,结果就不言而喻了。评论数比较能反应粉丝活跃度。一般会回复的,不是纯粉,就是黑粉,回复数的多少,通常是粉丝战斗力的直观体现。同样用中秋自拍举例。一位点赞数五十万,回复数五万。一位点赞数三十五万,回复数九万。可见前者路人缘好,后者流量强。转发数是粉丝加路人粉的体现。简单说,你想知道这位明星到底有多红,看他的转发量就可以了,评论数是纯粉,点赞是路人纯粉和路人粉。那么转发数就基本上是这个明星目前的粉丝活跃度了。再拿中秋自拍举例。一人转发数二十四万,点赞五十万,评论五万。一人转发数十五万,点赞三十五万,评论九万。虽然在你印象里后者可能比较红,但实际上,是后者可能不如前者。(转自https://www.zhihu.com/question/41556587/answer/277402351

    因此,我用了气泡图来反映三者之间的关系,因为豪总的数据基本都是万级的,我对数据做了一点点处理:

    #绘制气泡图看点赞数、评论数和转发数的关系
    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    from matplotlib.font_manager import FontProperties
    
    #一键防止中文乱码
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    data = pd.read_csv('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\tendency.csv')
    data.head()
    #一共有582个数据,产生582种随机颜色
    colors1 = np.random.rand(582)
    plt.scatter(x = data.like/10000, 
               y = data.comment/10000, 
               s = data.repost/100,
               c = colors1, label = '转发数', alpha = 0.6
                )
    
    # 添加横纵坐标
    plt.xlabel('点赞数*10000')
    plt.ylabel('评论数*10000')
    
    # 添加标题
    plt.title('点赞数、评论数和转发数的气泡图')
    # 添加图例
    plt.legend()
    #设置画布大小
    plt.figure(figsize=(40,25))
    # 显示图形
    plt.show()
    

    通过气泡图也是可以看出当点赞数和评论数越多时,转发数所代表的圆圈也相应的比较大。

    再看看这几年豪总的点赞数和评论数和转发数的具体趋势吧

    #通过时间序列分析三者趋势
    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    from matplotlib.font_manager import FontProperties
    from datetime import datetime
    
    #一键防止中文乱码
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    df = pd.read_csv('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\tendency.csv', encoding='utf-8', index_col='date')
    df.index = pd.to_datetime(df.index)  # 将字符串索引转换成时间索引
    ts = df  # 生成pd.Series对象
    # 查看数据格式
    ts.head()
    
    ax = ts.plot(
        x_compat=True,
        grid=True)
     # 显示背景的网格线
    ax.set_title("pv-gmv")
    ax.grid(linestyle="--", alpha=0.3)
    plt.show()
    

    再看看成团前后的差别吧,我是从2019年2月开始截取的数据

    #截取近一年的数据看看具体趋势
    ts_subset1 = ts[:'2019-02-01']  
    ax1 = ts_subset1.plot(
        x_compat=True,
        grid=True)
    #df[['A']]用于提取某一类
    ax1.set_title("趋势图")
    ax1.grid(linestyle="--", alpha=0.3)
    plt.show()
    

    可以明显看出,从2019年4月创造营开营到2019年6月8日成团出道,因为梦想而坚持,他值得!

    最后我按照评论数排序,统计了前11条微博。
    1.#元气爱豆的日常# 今天合唱300总决赛 大家一起加油 #元气爱豆的日常# 为了不露出衣服造型 我只能先这样哈哈哈哈哈 相信你们能给我们一个震撼的力量 期待哦#爱
    (https://weibo.com/5732739112/I5Z43qCwQ?type=comment#_rnd1586784335026)

    2.#元气爱豆的日常# 第一次有了坐飞机离不开的玩具 它睡着好舒服啊 #爱豆V力量# 哈哈哈哈哈哈 安全落地 大家放心咯 [带着微博去旅行]✈️
    (https://weibo.com/5732739112/I67TWyAPJ?type=comment#_rnd1586784076207)

    3.前往下一站北京的路上 一路下来见到很多不同群体的人 也有曾经一直没能去尝试的事情 大多美好的回忆 仿佛是你在停下脚步用心感受霎那间 #爱豆V力量# #元气爱豆的日常#
    (https://weibo.com/5732739112/I5Z43qCwQ?type=comment#_rnd1586784335026)

    4.讲真的#元气爱豆的日常# 自拍真的是门学问
    (https://weibo.com/5732739112/I5Z43qCwQ?type=comment#_rnd1586784335026)

    5.看我的月饼 #爱豆V力量# #元气爱豆的日常# 今天要次月饼哦 腊肉月饼我的最爱 哈哈哈
    (https://weibo.com/5732739112/I5Z43qCwQ?type=comment#_rnd1586784335026)

    6.#爱豆V力量##爱豆V力量# 暗中观察 @R1SE-赵让 @R1SE-刘也
    (https://weibo.com/5732739112/I5IZNe2sH?type=comment#_rnd1586784566928)

    7.成团满月的一天 小伙子们你们都很不错哦 @R1SE-何洛洛 @R1SE-赵让 @R1SE-张颜齐 @R1SE-周震南 @R1SE-姚琛 @R1SE-刘也 @R1SE-赵磊 @R1SE-夏之光 @R1SE-焉栩嘉
    (https://weibo.com/5732739112/I5IZNe2sH?type=comment#_rnd1586784566928)

    8.#VogueMe酷枇杷舞#@VogueMe 那就一起呗 R1SE-任豪的微博视频
    (https://weibo.com/5732739112/I3rlWF81N?type=comment)

    9.R1SE成员第一次的集体飞行✈️
    (https://weibo.com/5732739112/I3rlWF81N?type=comment)

    10.胡老师生日快乐 🎉 🎂🎂 @胡彦斌 R1SE-任豪的微博视频
    (https://weibo.com/5732739112/HBVFwct0J?type=comment)

    11.#元气爱豆的日常# #爱豆V力量# 他拍和自拍 我就觉得我自拍的还行... 哼你们觉得哪个好嘛
    (https://weibo.com/5732739112/HBVFwct0J?type=comment)

    哈哈,从豪总评论数最多的微博来看,都是有视频有自拍的,所以以后要多自拍哦,尽管蜜汁角度_

    相关文章

      网友评论

          本文标题:入我豪门真的不亏~内附词云图相关分析

          本文链接:https://www.haomeiwen.com/subject/ekuumhtx.html