【技能流吃瓜】python可视化大屏舆情分析“张天爱“变乱网友品评

分享
藏宝库编辑 2024-9-12 07:38:21 70 0 来自 中国
一、变乱配景

各人好,我是马哥python说。


演员张天爱于2022.8.25号在网上爆出一段音频 "惯犯,盼望以是女孩擦亮眼睛。" 1.png 至今已有2.5亿次观看量,刹时冲上热搜。
二、微热门分析

以下数据来源:微热门


从舆情分析网站上来看,从热度指数的变化趋势来看,"张天爱"的热度在08月25日22时到达了92.56的峰值。

"张天爱"全网热度:

"张天爱"网络媒体的评价指标:

"张天爱"关键词分析: 5.png

"张天爱"地域分析: 6.png 二、自开辟Python舆情分析

2.1 Python爬虫

从博文URL地点中找出id。
目的链接地点的id参数值就是id:
原文查察
把id带入到我的Python爬虫代码中,下面展示部门爬虫代码。
关键逻辑,就是max_id的处理处罚:
原文查察
假如是第一页,不消传max_id参数。
假如非第一页,需要传max_id参数,它的值来自于上一页的r.json()['data']['max_id']
起首,向页面发送哀求:
r = requests.get(url, headers=headers)  # 发送哀求print(r.status_code)  # 查察相应码print(r.json())  # 查察相应内容下面,是剖析数据的处理处罚逻辑:
datas = r.json()['data']['data']for data in datas:    page_list.append(page)    id_list.append(data['id'])    dr = re.compile(r'<[^>]+>', re.S)  # 用正则表达式洗濯品评数据    text2 = dr.sub('', data['text'])    text_list.append(text2)  # 品评内容    time_list.append(trans_time(v_str=data['created_at']))  # 品评时间    like_count_list.append(data['like_count'])  # 品评点赞数    source_list.append(data['source'])  # 品评者IP归属地    user_name_list.append(data['user']['screen_name'])  # 品评者姓名    user_id_list.append(data['user']['id'])  # 品评者id    user_gender_list.append(tran_gender(data['user']['gender']))  # 品评者性别    follow_count_list.append(data['user']['follow_count'])  # 品评者关注数    followers_count_list.append(data['user']['followers_count'])  # 品评者粉丝数末了,是生存数据的处理处罚逻辑:
df = pd.DataFrame(    {        'id': [weibo_id] * len(time_list),        '品评页码': page_list,        '品评id': id_list,        '品评时间': time_list,        '品评点赞数': like_count_list,        '品评者IP归属地': source_list,        '品评者姓名': user_name_list,        '品评者id': user_id_list,        '品评者性别': user_gender_list,        '品评者关注数': follow_count_list,        '品评者粉丝数': followers_count_list,        '品评内容': text_list,    })if os.path.exists(v_comment_file):  # 假如文件存在,不再设置表头    header = Falseelse:  # 否则,设置csv文件表头    header = True# 生存csv文件df.to_csv(v_comment_file, mode='a+', index=False, header=header, encoding='utf_8_sig')print('结果生存乐成:{}'.format(v_comment_file))篇幅有限,哀求头、cookie、循环页码、数据洗濯等其他细节不再赘述。


看下终极数据: 2.2 可视化大屏

起首,看下终极大屏交互结果:
这个大屏,包罗了5个图表:

  • 大标题-Line
  • 词云图-Wordcloud
  • 条形图-Bar
  • 饼图-Pie
  • 舆图-Map
下面,依次解说代码实现。
2.2.1 大标题

由于pyecharts组件没有专门用作标题的图表,我决定机动运用Line组件实现大标题。
line3 = (    Line(init_opts=opts.InitOpts(width="1000px",  # 宽度                                 height="625px",  # 高度                                 bg_color={"type": "pattern", "image": JsCode("img"),                                           "repeat": "repeat", }))  # 设置配景图片        .add_xaxis([None])  # 插入空数据        .add_yaxis("", [None])  # 插入空数据        .set_global_opts(        title_opts=opts.TitleOpts(title=v_title,                                  pos_left='center',                                  title_textstyle_opts=opts.TextStyleOpts(font_size=45,                                                                          color='#51c2d5',                                                                          align='left'),                                  pos_top='top'),        yaxis_opts=opts.AxisOpts(is_show=False),  # 不表现y轴        xaxis_opts=opts.AxisOpts(is_show=False))  # 不表现x轴)# 设置配景图片line3.add_js_funcs(    """    var img = new Image(); img.src = '大屏配景.jpg';    """)line3.render('大标题.html')print('页面渲染完毕:大标题.html')

这里最关键的逻辑,就是配景图片的处理处罚。我找了一个张天爱的图片:然后用add_js_funcs代码把此图片设置为整个大屏的配景图。


大标题结果:2.2.2 词云图

起首,把品评数据洗濯出来:
cmt_list = df['品评内容'].values.tolist()  # 转换成列表cmt_list = [str(i) for i in cmt_list]  # 数据洗濯cmt_str = ' '.join(cmt_list)  # 转换成字符串然后,将洗濯后的数据,带入词云图函数,核心代码:
wc = WordCloud(init_opts=opts.InitOpts(width=chart_width, height=chart_height, theme=theme_config, chart_id='wc1'))wc.add(series_name="词汇",       data_pair=data,       word_gap=1,       word_size_range=[5, 30],       mask_image='张天爱配景图.png',       )  # 增加数据wc.set_global_opts(    title_opts=opts.TitleOpts(pos_left='center',                              title="张天爱品评-词云图",                              title_textstyle_opts=opts.TextStyleOpts(font_size=20)  # 设置标题                              ),    tooltip_opts=opts.TooltipOpts(is_show=True),  # 不表现工具箱)wc.render('张天爱词云图.html')  # 天生html文件print('渲染完成:' + '张天爱词云图.html')

看下结果:2.2.3 条形图

针对品评数据的TOP10高频词,绘制出条形图。
核心代码:
bar = Bar(    init_opts=opts.InitOpts(theme=theme_config, width=chart_width, height=chart_height,                            chart_id='bar_cmt'))  # 初始化条形图bar.add_xaxis(x_data)  # 增加x轴数据bar.add_yaxis("数目", y_data)  # 增加y轴数据bar.reversal_axis()  # 设置水平方向bar.set_series_opts(label_opts=opts.LabelOpts(position="right"))  # Label出现位置bar.set_global_opts(    legend_opts=opts.LegendOpts(pos_left='right'),    title_opts=opts.TitleOpts(title=v_title, pos_left='center'),  # 标题    toolbox_opts=opts.ToolboxOpts(is_show=False, ),  # 不表现工具箱    xaxis_opts=opts.AxisOpts(name="数目", axislabel_opts={"rotate": 0}),  # x轴名称    yaxis_opts=opts.AxisOpts(name="关键词",                             axislabel_opts=opts.LabelOpts(font_size=9, rotate=0),  # y轴名称                             ))bar.render(v_title + ".html")  # 天生html文件print('渲染完成:' + v_title + '.html')

看下结果: 11.png 2.2.4 饼图(玫瑰图)

起首,针对品评数据,用snownlp库做情绪分析判定。
for comment in v_cmt_list:    tag = ''    sentiments_score = SnowNLP(comment).sentiments    if sentiments_score < 0.4:  # 情绪分小于0.4判定为悲观        tag = '悲观'        neg_count += 1    elif 0.4 <= sentiments_score <= 0.6:  # 情绪分在[0.4,0.6]直接判定为中性        tag = '中性'        mid_count += 1    else:  # 情绪分大于0.6判定为积极        tag = '积极'        pos_count += 1    score_list.append(sentiments_score)  # 得分值    tag_list.append(tag)  # 判定结果df['情绪得分'] = score_listdf['分析结果'] = tag_list然后,将统计数据带入饼图函数,部门核心代码:
# 画饼图pie = (    Pie(init_opts=opts.InitOpts(theme=theme_config, width=chart_width, height=chart_width, chart_id='pie1'))        .add(series_name="情绪分布",  # 系列名称             data_pair=[['正能量', pos_count],  # 添加数据                        ['中性', mid_count],                        ['负能量', neg_count]],             rosetype="radius",  # 是否展示成南丁格尔图             radius=["30%", "55%"],  # 扇区圆心角显现数据的百分比,半径显现数据的巨细             )  # 加入数据        .set_global_opts(  # 全局设置项        title_opts=opts.TitleOpts(title=v_title, pos_left='center'),  # 标题        legend_opts=opts.LegendOpts(pos_left='right', orient='vertical')  # 图例设置项,靠右,竖向分列    )        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")))  # 样式设置项pie.render(v_title + '.html')  # 天生html文件print('渲染完成:' + v_title + '.html')

看下结果: 12.png 2.2.5 舆图

把品评者的IP归属地统计求和,求和后的总数分布在舆图上。
df['品评者IP归属地'] = df['品评者IP归属地'].astype(str).str.replace('来自', '')  # 数据洗濯loc_grp = df.groupby('品评者IP归属地').count()['品评内容']data_list = list(zip(loc_grp.index.tolist(), loc_grp.values.tolist()))数据准备好之后,带入舆图函数,部门核心代码:
f_map = (    Map(init_opts=opts.InitOpts(width=chart_width,                                height=chart_height,                                theme=theme_config,                                page_title=v_title,                                chart_id='map1',                                bg_color=None))        .add(series_name="品评数目",             data_pair=v_data_list,             maptype="china",  # 舆图范例             is_map_symbol_show=False)        .set_global_opts(        title_opts=opts.TitleOpts(title=v_title,                                  pos_left="center", ),        legend_opts=opts.LegendOpts(  # 设置图例            is_show=True, pos_top="40px", pos_right="30px"),        visualmap_opts=opts.VisualMapOpts(  # 设置视觉映射            is_piecewise=True, range_text=['高', '低'], pieces=[  # 分段表现                # {"min": 10000, "color": "#751d0d"},                {"min": 121, "max": 150, "color": "#37561a"},                {"min": 91, "max": 120, "color": "#006400"},                {"min": 61, "max": 90, "color": "#4d9116"},                {"min": 31, "max": 60, "color": "#77bb40"},                {"min": 11, "max": 30, "color": "#b8db9b"},                {"min": 0, "max": 10, "color": "#e5edd6"}            ]),    )        .set_series_opts(label_opts=opts.LabelOpts(is_show=True, font_size=8, ),                         markpoint_opts=opts.MarkPointOpts(                             symbol_size=[90, 90], symbol='circle'),                         effect_opts=opts.EffectOpts(is_show='True', )                         ))f_map.render(v_title + '.html')print('渲染完成:' + v_title + '.html')

看下结果:三、演示视频

结果演示:
https://www.zhihu.com/zvideo/1546516025184866304
保举阅读:
【Python可视化大屏】全流程揭秘实现可视化数据大屏的背后原理!
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 13:36, Processed in 0.177233 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表