一、开发背景

您好,我是@马哥python说 ,一枚10年程序猿。

自从2023.3月以来,"淄博烧烤"现象持续占领热搜流量,体现了后疫情时代众多网友对人间烟火气的美好向往,本现象级事件存在一定的数据分析实践意义。

静态截图:

动态演示:

【大屏演示】Python可视化舆情大屏「淄博烧烤」

二、爬虫代码

2.1 爬微博列表

通过m端的搜索页面,爬取以"淄博烧烤"为关键词的微博id,获取到微博id的目的,是传给评论爬虫。

发送请求部分:

  1. # 请求地址
  2. url = 'https://m.weibo.cn/api/container/getIndex'
  3. # 请求参数
  4. params = {
  5. "containerid": "100103type=60&q={}".format(v_keyword),
  6. "page_type": "searchall",
  7. "page": page
  8. }
  9. # 发送请求
  10. r = requests.get(url, headers=headers, params=params)

注意,type=60代表"热门",如下:

解析数据部分:

  1. # 解析json数据
  2. cards = r.json()["data"]["cards"]
  3. print('微博数量:', len(cards))
  4. for card in cards:
  5. # 微博id
  6. id_list = card['mblog']['id']
  7. id_list_list.append(id_list)

至此,已经获取到以「淄博烧烤」为关键词的微博id列表 id_list_list 了。

2.2 爬微博评论

从2.1章节获取到微博id列表之后,传入爬取微博评论函数 get_comments

这部分爬虫讲解可移步:

【2023微博评论爬虫】用python爬上千条微博评论,突破15页限制!

最终,爬取到的微博评论数据,示例如下:

说明:无论微博搜索页,还是微博评论页,都可以自定义设置max_page,满足自己的个性化数据量要求。

2.3 导入MySQL数据库

最核心的三行代码:

  1. # 读取csv数据
  2. df = pd.read_csv('去重后_' + comment_file)
  3. # 把csv数据导入MySQL数据库
  4. df.to_sql(name='t_zbsk', con=engine, chunksize=1000, if_exists='replace', index=False)
  5. print('导入数据库完成!')

用create_engine创建数据库连接,格式为:

create_engine('数据库类型+数据库驱动://用户名:密码@数据库IP地址/数据库名称')

这样,数据库连接就创建好了。

然后,用pandas的read_csv函数读取csv文件。

最后,用pandas的to_sql函数,把数据存入MySQL数据库:

  • name='college_t2' #mysql数据库中的表名
  • con=engine # 数据库连接
  • index=False #不包含索引字段
  • if_exists='replace' #如果表中存在数据,就替换掉

非常方便地完成了反向导入,即:从csv向数据库的导入。

这个部分的讲解视频:

仅用Python三行代码,实现数据库和excel之间的导入导出!

三、可视化代码

3.1 大标题

由于pyecharts组件没有专门用作标题的图表,我决定灵活运用Line组件实现大标题。

首先,找到一张星空图作为大屏背景图:

然后,在Line组件中加入js代码,加载背景图:

  1. # 设置背景图片
  2. line3.add_js_funcs(
  3. """
  4. var img = new Image(); img.src = './static/bg2.png';
  5. """
  6. )

大标题效果如下:

3.2 词云图(含:加载停用词)

绘制词云图,需要先进行中文分词。既然分词,就要先设置停用词,避免干扰词影响分析结果。

这里采用哈工大停用词作为停用词词典。

  1. # 停用词列表
  2. with open('hit_stopwords.txt', 'r') as f:
  3. stopwords_list = f.readlines()
  4. stopwords_list = [i.strip() for i in stopwords_list]

这样,所有停用词就存入stopwords_list这个列表里了。

如果哈工大停用词仍然无法满足需求,再加入一些自定义停用词,extend到这个列表里:

  1. # 加入自定义停用词
  2. stopwords_list.extend(
  3. ['3', '5', '不', '都', '好', '人', '吃', '都', '去', '想', '说', '还', '很', '…', 'nan', '真的', '不是',
  4. '没', '会', '看', '现在', '觉得', ' ', '没有', '上', '感觉', '大', '太', '真', '哈哈哈', '火', '挖', '做',
  5. '一下', '不能', '知道', '这种', '快'])

现在就可以愉快的绘制词云图了,部分核心代码:

  1. wc = WordCloud(init_opts=opts.InitOpts(width='600px', height=chart_height, theme=theme_config, chart_id='wc1'))
  2. wc.add(series_name="评论内容",
  3. data_pair=data300,
  4. word_gap=1,
  5. word_size_range=[20, 70],
  6. ) # 增加数据
  7. wc.set_global_opts(
  8. title_opts=opts.TitleOpts(pos_left='center',
  9. pos_top='0%',
  10. title=v_title,
  11. title_textstyle_opts=opts.TextStyleOpts(font_size=20, color=title_color) # 设置标题
  12. ),
  13. tooltip_opts=opts.TooltipOpts(is_show=True), # 显示提示
  14. )

词云图效果:

3.3 玫瑰图(含:snownlp情感分析)

先对评论数据进行情感判定,采用snownlp技术进行情感打分及判定结果:

  1. for comment in cmt_list:
  2. sentiments_score = SnowNLP(comment).sentiments
  3. if 0 <= sentiments_score < 0.2: # 情感分小于0.2,判定为极其消极
  4. tag = '极其消极'
  5. neg_very_count += 1
  6. elif 0.2 <= sentiments_score < 0.4: # 情感分在0.2和0.4之间,判定为比较消极
  7. tag = '比较消极'
  8. neg_count += 1
  9. elif 0.4 <= sentiments_score < 0.6: # 情感分在0.4和0.6之间,判定为中性
  10. tag = '中性'
  11. mid_count += 1
  12. elif 0.6 <= sentiments_score < 0.9: # 情感分在0.6和0.9之间,判定为比较积极
  13. tag = '比较积极'
  14. pos_count += 1
  15. else: # 情感分大于0.9,判定为极其积极
  16. tag = '极其积极'
  17. pos_very_count += 1

将情感分析结果用pandas保存到一个Excel文件里,如下:

绘制玫瑰图,部分核心代码:

  1. # 画饼图
  2. pie = (
  3. Pie(init_opts=opts.InitOpts(theme=theme_config, width=chart_width, height=chart_height, chart_id='pie1'))
  4. .add(series_name="情感分类", # 系列名称
  5. data_pair=[ # 添加数据
  6. ['极其积极', pos_very_count],
  7. ['比较积极', pos_count],
  8. ['中性', mid_count],
  9. ['比较消极', neg_count],
  10. ['极其消极', neg_very_count],
  11. ],
  12. rosetype="radius", # 是否展示成南丁格尔图
  13. radius=["20%", "65%"], # 扇区圆心角展现数据的百分比
  14. ) # 加入数据
  15. .set_global_opts( # 全局设置项
  16. title_opts=opts.TitleOpts(title=v_title,
  17. pos_left='center',
  18. title_textstyle_opts=opts.TextStyleOpts(color=title_color, ), ), # 标题
  19. legend_opts=opts.LegendOpts(pos_left='center', pos_top='8%', orient='horizontal',
  20. textstyle_opts=opts.TextStyleOpts(color='white', )) # 图例字体颜色
  21. )
  22. )

玫瑰图效果:

3.4 柱形图-TOP10关键词

先根据词云图部分提取出TOP10高频词(过滤掉停用词之后的):

  1. data10 = collections.Counter(result).most_common(10)

然后带入柱形图,部分核心代码:

  1. # 画柱形图
  2. bar = Bar(
  3. init_opts=opts.InitOpts(theme=theme_config, width='780px', height=chart_height,
  4. chart_id='bar1')) # 初始化条形图
  5. bar.add_xaxis(x_data) # 增加x轴数据
  6. bar.add_yaxis("高频词汇", y_data) # 增加y轴数据
  7. bar.set_series_opts(label_opts=opts.LabelOpts(position="top")) # Label出现位置
  8. bar.set_global_opts(。。。)

柱形图效果:

3.5 折线图-讨论热度趋势

首先,根据评论时间统计出每天的微博评论数量:

  1. # 按日期分组统计评论数量
  2. df_comments['评论日期'] = df_comments['评论时间'].astype(str).str[:10] # 提取日期
  3. grp = df_comments.groupby('评论日期')['评论内容'].count()

然后,根据统计数据画出折线图,部分核心代码:

  1. line = Line(
  2. init_opts=opts.InitOpts(width='780px', height=chart_height, theme=theme_config, chart_id='line1')) # 实例化
  3. line.add_xaxis(x_data) # 加入X轴数据
  4. line.add_yaxis('讨论数量', y_data, is_smooth=True,
  5. areastyle_opts=opts.AreaStyleOpts(color=JsCode(area_color_js), opacity=1), ) # 加入Y轴数据
  6. line.set_global_opts(。。。)

折线图效果:

3.6 地图-IP分布

由于IP属地字段都包含"来自"两字,先进行数据清洗,将"来自"去掉:

  1. # 数据清洗-ip属地
  2. ip_count = df_comments['评论者IP归属地'].str.replace('来自', '')

然后统计各个IP属地的数量,方便后续带入地图可视化:

  1. # 统计各IP数量
  2. ip_count = ip_count.value_counts()

下面开始绘制地图,部分核心代码:

  1. f_map = (
  2. Map(init_opts=opts.InitOpts(width='600px',
  3. height='600px',
  4. theme=theme_config,
  5. page_title=v_title,
  6. chart_id='map1',
  7. bg_color=None))
  8. .add(series_name="评论数量",
  9. data_pair=list(zip(loc_list, value_list)),
  10. maptype="china", # 地图类型
  11. is_map_symbol_show=False)
  12. .set_global_opts(。。。)
  13. .set_series_opts(label_opts=opts.LabelOpts(is_show=True, font_size=8, ),
  14. markpoint_opts=opts.MarkPointOpts(
  15. symbol_size=[90, 90], symbol='circle'),
  16. effect_opts=opts.EffectOpts(is_show='True', )
  17. )
  18. )

地图效果,如下:

当然,地图中的颜色,都是自己设置的十六进制颜色,可以根据自己的喜好更改。

3.7 Page组合大屏

最后,也是最关键的一步,把以上所有图表组合到一起,用Page组件,并且选用DraggablePageLayout方法,即拖拽的方式,组合图表:

  1. # 绘制:整个页面
  2. page = Page(
  3. page_title='微博热门评论可视化分析大屏-以"淄博烧烤"为例',
  4. layout=Page.DraggablePageLayout,
  5. )
  6. page.add(
  7. # 绘制:大标题
  8. make_title(v_title='微博热门评论可视化分析大屏-以"淄博烧烤"为例'),
  9. # 绘制:词云图
  10. make_wordcloud(v_title='评论内容-词云图'),
  11. # 绘制:饼图
  12. make_analyse_pie(v_title='情感分布-玫瑰图'),
  13. # 绘制:柱形图
  14. make_bar(v_title='TOP10关键词-柱形图'),
  15. # 绘制:折线图
  16. make_line(v_title='讨论热度趋势-折线图'),
  17. # 绘制:地图
  18. make_map(v_title='评论IP分布-中国地图'),
  19. )
  20. page.render('大屏_临时.html')

本代码执行完毕后,打开临时html并排版,排版完点击Save Config,把json文件放到本目录下。

再执行最后一步,调用json配置文件,生成最终大屏文件。

  1. Page.save_resize_html(
  2. source="大屏_临时.html", # 源html文件
  3. cfg_file="chart_config.json", # 配置文件
  4. dest="大屏_最终.html" # 目标html文件
  5. )

至此,所有代码执行完毕,生成了最终大屏html文件。

四、彩蛋-多种颜色主题

分享一个小技巧,我设置了一键更换颜色主题:

  1. # 整体主题颜色
  2. theme_config = ThemeType.SHINE

只需更换ThemeType参数,即可实现一键更换主题!

4.1 INFOGRAPHIC主题

4.2 MACARONS主题

4.3 SHINE主题

4.4 WALDEN主题

4.5 WESTEROS主题

4.6 WHITE主题

4.7 WONDERLAND主题

更多颜色主题等待小伙伴去发掘!

五、技术总结

技术开发流程:

  1. requests 爬虫发送请求
  2. json 解析返回数据
  3. re 正则表达式清洗文本
  4. pandas保存csv文件
  5. sqlalchemy 保存MySQL数据
  6. pyecharts 可视化开发
  7. snownlp 情感分析
  8. jieba 中文分词
  9. pyecharts+page 组合大屏
  10. flask 启动网页服务

六、在线体验

为了方便大家体验可视化动态交互效果,我把此大屏部署到了服务器,请移步:

马哥python说 - 效果演示

七、演示视频

效果演示视频:

【大屏演示】Python可视化舆情大屏「淄博烧烤」

八、获取完整源码

附完整源码:【可视化大屏】“淄博烧烤”热评舆情分析大屏


我是 @马哥python说 ,持续分享python源码干货中!

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏的更多相关文章

  1. 数据可视化开源系统(python开发)

    Caravel 是 Airbnb (知名在线房屋短租公司)开源的数据探查与可视化平台(曾用名Panoramix),该工具在可视化.易用性和交互性上非常有特色,用户可以轻松对数据进行可视化分析. 核心功 ...

  2. Android 性能优化(2)性能工具之「Hierarchy Viewer 」Optimizing Your UI:分析哪个view有性能问题,查看屏幕上某像素点的坐标,颜色等

    Optimizing Your UI In this document Using Hierarchy Viewer Running Hierarchy Viewer and choosing a w ...

  3. Mditor 发布「桌面版」了 - http://mditor.com

    简单说明 Mditor 最早只有「组件版」,随着「桌面版」的发布,Mditor 目前有两个版本: 可嵌入到任意 Web 应用的 Embed 版本,这是一桌面版的基础,Repo: https://git ...

  4. 分享开源 Markdown 编辑器 Mditor 的「桌面版」

    简单说明 Mditor 最早只有「组件版」,随着「桌面版」的发布,Mditor 目前有两个版本: 可嵌入到任意 Web 应用的 Embed 版本,这是一桌面版的基础,Repo: https://git ...

  5. 【可视化大屏教程】用Python开发智慧城市数据分析大屏!

    目录 一.开发背景 二.讲解代码 2.1 大标题+背景图 2.2 各区县交通事故统计图-系列柱形图 2.3 图书馆建设率-水球图 2.4 当年城市空气质量aqi指数-面积图 2.5 近7年人均生产总值 ...

  6. 【Python开发】Python 适合大数据量的处理吗?

    Python 适合大数据量的处理吗? python 能处理数据库中百万行级的数据吗? 处理大规模数据时有那些常用的python库,他们有什么优缺点?适用范围如何? 需要澄清两点之后才可以比较全面的看这 ...

  7. 常用的十大Python开发工具

    据权威机构统计,Python人才需求量每日高达5000+,但目前市场上会 Python 的程序员少之又少, 竞争小,很容易快速高薪就业.可能你并不太了解常用的十大Python开发工具都有哪些,现在告诉 ...

  8. Web 开发和数据科学家仍是 Python 开发的两大主力

    由于 Python 2 即将退役,使用 Python 3 的开发者大约为 90%,Python 2 的使用量正在迅速减少.而去年仍有 1/4 的人使用 Python 2. Web 开发和数据科学家仍是 ...

  9. 手把手教你快速使用数据可视化BI软件创建全球经济贸易分析大屏

    灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件.   本文以全球经济贸易分析大屏为例 ...

  10. 【Python 04】Python开发环境概述

    1.Python概述 Python是一种计算机程序设计语言,一个python环境中需要有一个解释器和一个包集合. (1)Python解释器 使用python语言编写程序之前需要下载一个python解释 ...

随机推荐

  1. CSS实现文字颜色渐变效果

    略微搜索查阅了网上的实现方法: 1.给元素添加背景渐变色,通过背景裁剪其中文字,再将文字设置为透明即可实现.(兼容性问题请自行添加浏览器前缀) background-color:linear-grad ...

  2. Java中使用List的add方法后元素相同问题

    在写JavaWeb时,我在后端通过JDBC读取了数据后逐个使用List.add()方法添加元素并通过request方法传给jsp页面解析,但是添加以后出现了在列表里有n个(假设添加了n个元素)最后一个 ...

  3. vue:路由守卫

    路由守卫 作用:对路由进行权限控制 配置路由守卫应在暴露前配置 分类:全局守卫.独享守卫.组件内守卫 首先先给需要鉴权的路由设置好meta配置项. meta配置项:是vue-router中的一个对象, ...

  4. rocketmq-spring : 实战与源码解析一网打尽

    RocketMQ 是大家耳熟能详的消息队列,开源项目 rocketmq-spring 可以帮助开发者在 Spring Boot 项目中快速整合 RocketMQ. 这篇文章会介绍 Spring Boo ...

  5. TypeScript 学习笔记 — 基于对象操作的内置类型的使用(十二)

    目录 1.Partial 转化可选属性 (?) 2.Required 转化必填属性 (-?) 3.Readonly 转化仅读属性 (readonly) Mutate(非内置,与 Readonly 相对 ...

  6. 二进制安装Kubernetes(k8s)IPv4/IPv6双栈 v1.24.0

    二进制安装Kubernetes(k8s) v1.24.0 IPv4/IPv6双栈 介绍 kubernetes二进制安装 1.23.3 和 1.23.4 和 1.23.5 和 1.23.6 和 1.24 ...

  7. vmware中安装windows11系统

    1.官网下载windwos11镜像(点击跳转下载) 2.打开vmware,创建新的虚拟机 3.选择典型方便快捷 4.选择安装程序光盘文件,点击浏览选择刚刚下载好的iso镜像 5.选择windows版本 ...

  8. classmethod和staticmethod装饰器

    """ 两个装饰器 @classmethod 把一个对象绑定的方法,修改成为一个类方法 1.在方法中仍然可以引用类中的静态变量 2.可以不用实例化对象,就直接使用类名在外 ...

  9. 浅谈对属性描述符__get__、__set__、__delete__的理解

    1.属性描述符的基础介绍 1.1 何为属性描述符? 属性描述符是一种Python语言中的特殊对象,用于定义和控制类属性的行为.属性描述符可以通过定义__get__.__set__.__delete__ ...

  10. $el,$nextTick,$set

    this.$el this.$el DOM的根元素 => 是一个完全唯一的 $el 直到组件挂载完成 (mounted) 之前都会是 undefined. 对于单一根元素的组件,$el 将会指向 ...