【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

news/2024/5/3 12:19:47/文章来源:https://www.cnblogs.com/mashukui/p/16629887.html

目录
  • 一、事件背景
  • 二、微热点分析
  • 二、自开发Python舆情分析
    • 2.1 Python爬虫
    • 2.2 可视化大屏
      • 2.2.1 大标题
      • 2.2.2 词云图
      • 2.2.3 条形图
      • 2.2.4 饼图(玫瑰图)
      • 2.2.5 地图
  • 三、演示视频

一、事件背景

大家好,我是马哥python说。

演员张天爱于2022.8.25号在网上爆出一段音频 "惯犯,希望所以女孩擦亮眼睛。"image.png

至今已有2.5亿次观看量,瞬间冲上热搜。

二、微热点分析

以下数据来源:微热点

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

"张天爱"全网热度:张天爱-热度分析

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

"张天爱"关键词分析:张天爱-关键词分析

"张天爱"地域分析:张天爱-地域分析

二、自开发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'])  # 评论者iduser_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 = False
else:  # 否则,设置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个图表:

  1. 大标题-Line
  2. 词云图-Wordcloud
  3. 条形图-Bar
  4. 饼图-Pie
  5. 地图-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')

看下效果:条形图

2.2.4 饼图(玫瑰图)

首先,针对评论数据,用snownlp库做情感分析判定。

for comment in v_cmt_list:tag = ''sentiments_score = SnowNLP(comment).sentimentsif sentiments_score < 0.4:  # 情感分小于0.4判定为消极tag = '消极'neg_count += 1elif 0.4 <= sentiments_score <= 0.6:  # 情感分在[0.4,0.6]直接判定为中性tag = '中性'mid_count += 1else:  # 情感分大于0.6判定为积极tag = '积极'pos_count += 1score_list.append(sentiments_score)  # 得分值tag_list.append(tag)  # 判定结果
df['情感得分'] = score_list
df['分析结果'] = 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')

看下效果:饼图

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可视化大屏】全流程揭秘实现可视化数据大屏的背后原理!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_2772.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022-08-26 第六小组 高佳誉 学习笔记

前情提要(博主在复习前端知识,所以近几天没有更新博客。相关前端内容可见博主其他随笔) JQurey 重点事件 与JS的区别 选择器思维导图知识点 1. 定义 JQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(框架)于2006年1月由John Resi…

Shopify Spark主题模板配置修改

对于那些正在启动业务的shopify卖家来说,Spark主题是很好的选择,它跨越了你的愿景和市场之间的差距,将美感和必要性结合在一起,这样你就可以用最小的触角将事情进行下去。通过最少的设置,我们设计了一个主题,以帮助你迅速和毫不费力地开店,同时仍然是一个具有惊人风格的…

NC50940 Running Median

For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output the median (middle value) of the elements received so far.题目原题地址:Running Median 题目编号:NC50940 题目类型:对…

项目工期延后有哪些补救措施?

大部分项目经理都面临过项目延期的情况,特别是在软件开发领域,项目延期情况尤为严重。项目管理者的真正挑战,不是发现问题和记录问题,而是预见问题、控制问题和解决问题。 因此当项目出现了延期状况时,我们需要思考有效的”拯救“之策,尽最大可能将未被终止的项目进行调整…

用于知识图嵌入的多尺度动态卷积网络

原文 Multi-Scale Dynamic Convolutional Network for Knowledge Graph Embedding 出版IEEE Transactions on Knowledge and Data Engineering Volume: 34 Issue: 5 01 May 2022申明 版权归原文作者及出版单位所有,如有侵权请联系删除 摘要 知识图是具有不完全或部分信息的大型…

全同态加密-丁津泰:学习

本文学习丁老师写的同态加密的文章,做些笔记。引言同态加密适用于云计算。 因为任意计算都可以由加法和乘法构成,全同态意味着计算函数\(f\)可以是任意计算操作(任意次加法和乘法)。 同态加密,起源于“隐私同态”的概念,但并未给出具体实现;后续提出一些部分同态性的方案…

打了一场模拟赛的心态,总结

今天打了一场模拟赛总结一下: 题目比较简单(我后面一个题目100一个90都是暴力的功/dogen) Frist problem: 总结:一道伪装成5⭐的打卡题目 用时:2~3min 思路:每输入一个字符串判断最后一个字符就可以得知是哪国的人(因为这几个国结尾字母各不相同) Second problem: 总…

AMBA AHB总结

AMBA AHB(高级高性能总线)介绍 一、AHB简介 AHB是为提出高性能可综合设计的要求而产生的新一代AMBA总线。它是一种支持多总线主机和提供高带宽操作的高性能总线。 AMBA AHB实现了高性能,高时钟频率系统的以下特征要求: 突发传输、分块处理、单周期总线主机移交,单时钟沿操…

[XMAN2018排位赛]AutoKey

1、得到USB流量,首先了解AutoKey是什么 自动秘钥密码(Autokey)_不会学习的小菜鸡的博客-CSDN博客_autokey密码 2、安装UsbKeyboardDataHacker.py 工具 GitHub - WangYihang/UsbKeyboardDataHacker: USB键盘流量包取证工具 , 用于恢复用户的击键信息 3、用UsbKeyboardDataHacke…

Promise的基本用法

一.定义: Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。 二.特点: (1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种…

devexpress 22.1.3 PivotGrid 结合.net6 MVC

效果图 主页面zyjkDetection.cshtml@using Health.Model @using Health.Repository; @*For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 *@ @inject HealthDataContext db @{ViewData["Title"] = …

手绘丛林冒险游戏推荐

mac上的一款手绘丛林冒险游戏《Gibbon: Beyond the Trees》推荐给大家,跟着一只迷路的长臂猿展开冒险旅程,进入未知的危险之地。在解放模式下竞速奔向自由,或者进入长达一小时的叙事故事中,体会世界各地野生动物奋斗求生的真实故事。 软件下载地址 《Gibbon: Beyond the Tr…

springboot实现文件下载(打jar包可下载,可解决下载文件损坏)

前端代码:downloadTemplate(){let url = `${window._CONFIG[domianURL]}/invoice/bmsBillRiskverification/downloadTemplate`;window.location.href = url;}后端代码:/*** @param response* @功能描述 下载文件:*/@RequestMapping("/downloadTemplate")public voi…

python 读取json文件

一个jason文件实例————fcc.json { "organization": "freeCodeCamp", "website": "https://www.freecodecamp.org/", "formed": 2014, "founder": "Quincy Larson", "certifications": [ …

Webpack 4

模块打包工具的由来 Web1.0编写静态页面 表单验证和动效Web2.0 之 AJAX管理数据 和用户进行数据交互大前端开发PC 端 移动端 小程序 APP现代 Web 开发“问题”采用模块化开发 使用新特性提高效率保证安全性 实时监听开发过程使用热更新 项目结果打包压缩优化使用 Webpack 实现项…

使用cmd中的alias来定义别名

作为一枚网络工程师,经常就是面对一堆黑框框,也是就是终端。不同操作系统、不同厂家的目录,功能相同但是键入的命令又大不相同,这些差异化容易让脑子混乱。比如华为、思科、H3C、锐捷的设备,命令都有不同,不过因为系统功能基本上固定的,也没有什么操作空间了,直接记忆即…

VS2019+QT5.9+PCL1.8.1环境配置

1.1 软件环境及下载地址: VS2019社区版:https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/ Qt5.9.3:https://download.qt.io/archive/qt/5.9/5.9.3/qt-opensource-windows-x86-5.9.3.exe.mirrorlist PCL1.8.1:https://github.com/PointCloudLibrary/pcl/re…

IP地址分类

每个IP地址都包含两部分,即网络号和主机号例如:202.112.81.34指的 就是202.112.81这个网络的第34号机。网络号:用于识别主机所在的网络主机号:用于识别该网络中的主机。当分配给主机号的二进制位越多,则能标识的主机数就越多,相应地能标识的网络数就越少,反之亦然IP地址…

笔记本通过网口分享wifi网络给其他电脑

这样操作后,笔记本的有线网卡IP地址变成了192.168.137.1(win10为192.168.0.1) 其他电脑用网线连接笔记本的网口,设置和笔记本有线网卡同一网段,网关设置成笔记本有线网卡的IP地址(192.168.137.1或192.168.0.1)即可上网

跨局域网传文件时,你的传输方式真的安全吗?

随着互联网技术的深入发展,网络隔离已经越来越广泛地应用到政府部门组织和大型企业的日常管理中。网络隔离技术是指两个或两个以上的计算机或网络在断开连接的基础上,实现信息交换和资源共享。网络隔离技术的主要目标是将有害的网络安全威胁隔离开,以保障数据信息在可信网络…