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

打印 上一主题 下一主题

主题 609|帖子 609|积分 1827

目录

一、事件背景

大家好,我是马哥python说
演员张天爱于2022.8.25号在网上爆出一段音频 "惯犯,希望所以女孩擦亮眼睛。"
至今已有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']
首先,向页面发送请求:
  1. r = requests.get(url, headers=headers)  # 发送请求
  2. print(r.status_code)  # 查看响应码
  3. print(r.json())  # 查看响应内容
复制代码
下面,是解析数据的处理逻辑:
  1. datas = r.json()['data']['data']
  2. for data in datas:
  3.         page_list.append(page)
  4.         id_list.append(data['id'])
  5.         dr = re.compile(r'<[^>]+>', re.S)  # 用正则表达式清洗评论数据
  6.         text2 = dr.sub('', data['text'])
  7.         text_list.append(text2)  # 评论内容
  8.         time_list.append(trans_time(v_str=data['created_at']))  # 评论时间
  9.         like_count_list.append(data['like_count'])  # 评论点赞数
  10.         source_list.append(data['source'])  # 评论者IP归属地
  11.         user_name_list.append(data['user']['screen_name'])  # 评论者姓名
  12.         user_id_list.append(data['user']['id'])  # 评论者id
  13.         user_gender_list.append(tran_gender(data['user']['gender']))  # 评论者性别
  14.         follow_count_list.append(data['user']['follow_count'])  # 评论者关注数
  15.         followers_count_list.append(data['user']['followers_count'])  # 评论者粉丝数
复制代码
最后,是保存数据的处理逻辑:
  1. df = pd.DataFrame(
  2.         {
  3.                 'id': [weibo_id] * len(time_list),
  4.                 '评论页码': page_list,
  5.                 '评论id': id_list,
  6.                 '评论时间': time_list,
  7.                 '评论点赞数': like_count_list,
  8.                 '评论者IP归属地': source_list,
  9.                 '评论者姓名': user_name_list,
  10.                 '评论者id': user_id_list,
  11.                 '评论者性别': user_gender_list,
  12.                 '评论者关注数': follow_count_list,
  13.                 '评论者粉丝数': followers_count_list,
  14.                 '评论内容': text_list,
  15.         }
  16. )
  17. if os.path.exists(v_comment_file):  # 如果文件存在,不再设置表头
  18.         header = False
  19. else:  # 否则,设置csv文件表头
  20.         header = True
  21. # 保存csv文件
  22. df.to_csv(v_comment_file, mode='a+', index=False, header=header, encoding='utf_8_sig')
  23. print('结果保存成功:{}'.format(v_comment_file))
复制代码
篇幅有限,请求头、cookie、循环页码、数据清洗等其他细节不再赘述。
看下最终数据:
2.2 可视化大屏

首先,看下最终大屏交互效果:
这个大屏,包含了5个图表:

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

由于pyecharts组件没有专门用作标题的图表,我决定灵活运用Line组件实现大标题。
  1. line3 = (
  2.         Line(init_opts=opts.InitOpts(width="1000px",  # 宽度
  3.                                      height="625px",  # 高度
  4.                                      bg_color={"type": "pattern", "image": JsCode("img"),
  5.                                                "repeat": "repeat", }))  # 设置背景图片
  6.                 .add_xaxis([None])  # 插入空数据
  7.                 .add_yaxis("", [None])  # 插入空数据
  8.                 .set_global_opts(
  9.                 title_opts=opts.TitleOpts(title=v_title,
  10.                                           pos_left='center',
  11.                                           title_textstyle_opts=opts.TextStyleOpts(font_size=45,
  12.                                                                                   color='#51c2d5',
  13.                                                                                   align='left'),
  14.                                           pos_top='top'),
  15.                 yaxis_opts=opts.AxisOpts(is_show=False),  # 不显示y轴
  16.                 xaxis_opts=opts.AxisOpts(is_show=False))  # 不显示x轴
  17. )
  18. # 设置背景图片
  19. line3.add_js_funcs(
  20.         """
  21.         var img = new Image(); img.src = '大屏背景.jpg';
  22.         """
  23. )
  24. line3.render('大标题.html')
  25. print('页面渲染完毕:大标题.html')
复制代码
这里最关键的逻辑,就是背景图片的处理。我找了一个张天爱的图片:
然后用add_js_funcs代码把此图片设置为整个大屏的背景图。
大标题效果:
2.2.2 词云图

首先,把评论数据清洗出来:
  1. cmt_list = df['评论内容'].values.tolist()  # 转换成列表
  2. cmt_list = [str(i) for i in cmt_list]  # 数据清洗
  3. cmt_str = ' '.join(cmt_list)  # 转换成字符串
复制代码
然后,将清洗后的数据,带入词云图函数,核心代码:
  1. wc = WordCloud(init_opts=opts.InitOpts(width=chart_width, height=chart_height, theme=theme_config, chart_id='wc1'))
  2. wc.add(series_name="词汇",
  3.        data_pair=data,
  4.        word_gap=1,
  5.        word_size_range=[5, 30],
  6.        mask_image='张天爱背景图.png',
  7.        )  # 增加数据
  8. wc.set_global_opts(
  9.         title_opts=opts.TitleOpts(pos_left='center',
  10.                                   title="张天爱评论-词云图",
  11.                                   title_textstyle_opts=opts.TextStyleOpts(font_size=20)  # 设置标题
  12.                                   ),
  13.         tooltip_opts=opts.TooltipOpts(is_show=True),  # 不显示工具箱
  14. )
  15. wc.render('张天爱词云图.html')  # 生成html文件
  16. print('渲染完成:' + '张天爱词云图.html')
复制代码
看下效果:
2.2.3 条形图

针对评论数据的TOP10高频词,绘制出条形图。
核心代码:
  1. bar = Bar(
  2.         init_opts=opts.InitOpts(theme=theme_config, width=chart_width, height=chart_height,
  3.                                 chart_id='bar_cmt'))  # 初始化条形图
  4. bar.add_xaxis(x_data)  # 增加x轴数据
  5. bar.add_yaxis("数量", y_data)  # 增加y轴数据
  6. bar.reversal_axis()  # 设置水平方向
  7. bar.set_series_opts(label_opts=opts.LabelOpts(position="right"))  # Label出现位置
  8. bar.set_global_opts(
  9.         legend_opts=opts.LegendOpts(pos_left='right'),
  10.         title_opts=opts.TitleOpts(title=v_title, pos_left='center'),  # 标题
  11.         toolbox_opts=opts.ToolboxOpts(is_show=False, ),  # 不显示工具箱
  12.         xaxis_opts=opts.AxisOpts(name="数量", axislabel_opts={"rotate": 0}),  # x轴名称
  13.         yaxis_opts=opts.AxisOpts(name="关键词",
  14.                                  axislabel_opts=opts.LabelOpts(font_size=9, rotate=0),  # y轴名称
  15.                                  ))
  16. bar.render(v_title + ".html")  # 生成html文件
  17. print('渲染完成:' + v_title + '.html')
复制代码
看下效果:
2.2.4 饼图(玫瑰图)

首先,针对评论数据,用snownlp库做情感分析判定。
[code]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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!

标签云

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