Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【爬虫+数据清洗+可视化】“淄博烧烤”热评Python舆情分析大屏

【爬虫+数据清洗+可视化】“淄博烧烤”热评Python舆情分析大屏

原创
作者头像
马哥python说
修改于 2024-04-06 23:28:17
修改于 2024-04-06 23:28:17
64008
代码可运行
举报
运行总次数:8
代码可运行

一、开发背景

本文首发公众号【老男孩的平凡之路】 我是@马哥python说 ,一枚10年程序猿。

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

静态截图:
大屏截图
大屏截图

动态演示:https://cloud.tencent.com/developer/video/80112

二、爬虫代码

2.1 爬微博列表

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

发送请求部分:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 请求地址
url = 'https://m.weibo.cn/api/container/getIndex'
# 请求参数
params = {
    "containerid": "100103type=60&q={}".format(v_keyword),
    "page_type": "searchall",
    "page": page
}
# 发送请求
r = requests.get(url, headers=headers, params=params)

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

m端微博
m端微博

解析数据部分:

代码语言:python
代码运行次数:1
运行
AI代码解释
复制
# 解析json数据
cards = r.json()["data"]["cards"]
print('微博数量:', len(cards))
for card in cards:
    # 微博id
    id_list = card['mblog']['id']
    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数据库

最核心的三行代码:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 读取csv数据
df = pd.read_csv('去重后_' + comment_file)
# 把csv数据导入MySQL数据库
df.to_sql(name='t_zbsk', con=engine, chunksize=1000, if_exists='replace', index=False)
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代码,加载背景图:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 设置背景图片
line3.add_js_funcs(
    """
    var img = new Image(); img.src = './static/bg2.png';
    """
)

大标题效果如下:

最上方的大标题
最上方的大标题

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

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

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

代码语言:python
代码运行次数:1
运行
AI代码解释
复制
# 停用词列表
with open('hit_stopwords.txt', 'r') as f:
    stopwords_list = f.readlines()
stopwords_list = [i.strip() for i in stopwords_list]

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

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

代码语言:python
代码运行次数:4
运行
AI代码解释
复制
# 加入自定义停用词
stopwords_list.extend(
    ['3', '5', '不', '都', '好', '人', '吃', '都', '去', '想', '说', '还', '很', '…', 'nan', '真的', '不是',
     '没', '会', '看', '现在', '觉得', ' ', '没有', '上', '感觉', '大', '太', '真', '哈哈哈', '火', '挖', '做',
     '一下', '不能', '知道', '这种', '快'])

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

代码语言:python
代码运行次数:2
运行
AI代码解释
复制
wc = WordCloud(init_opts=opts.InitOpts(width='600px', height=chart_height, theme=theme_config, chart_id='wc1'))
wc.add(series_name="评论内容",
       data_pair=data300,
       word_gap=1,
       word_size_range=[20, 70],
       )  # 增加数据
wc.set_global_opts(
    title_opts=opts.TitleOpts(pos_left='center',
                              pos_top='0%',
                              title=v_title,
                              title_textstyle_opts=opts.TextStyleOpts(font_size=20, color=title_color)  # 设置标题
                              ),
    tooltip_opts=opts.TooltipOpts(is_show=True),  # 显示提示
)

词云图效果:

评论内容-词云图
评论内容-词云图

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

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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
for comment in cmt_list:
    sentiments_score = SnowNLP(comment).sentiments
    if 0 <= sentiments_score < 0.2:  # 情感分小于0.2,判定为极其消极
        tag = '极其消极'
        neg_very_count += 1
    elif 0.2 <= sentiments_score < 0.4:  # 情感分在0.2和0.4之间,判定为比较消极
        tag = '比较消极'
        neg_count += 1
    elif 0.4 <= sentiments_score < 0.6:  # 情感分在0.4和0.6之间,判定为中性
        tag = '中性'
        mid_count += 1
    elif 0.6 <= sentiments_score < 0.9:  # 情感分在0.6和0.9之间,判定为比较积极
        tag = '比较积极'
        pos_count += 1
    else:  # 情感分大于0.9,判定为极其积极
        tag = '极其积极'
        pos_very_count += 1

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

情感判定结果
情感判定结果

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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 画饼图
pie = (
    Pie(init_opts=opts.InitOpts(theme=theme_config, width=chart_width, height=chart_height, chart_id='pie1'))
    .add(series_name="情感分类",  # 系列名称
         data_pair=[  # 添加数据
             ['极其积极', pos_very_count],
             ['比较积极', pos_count],
             ['中性', mid_count],
             ['比较消极', neg_count],
             ['极其消极', neg_very_count],
         ],
         rosetype="radius",  # 是否展示成南丁格尔图
         radius=["20%", "65%"],  # 扇区圆心角展现数据的百分比
         )  # 加入数据
    .set_global_opts(  # 全局设置项
        title_opts=opts.TitleOpts(title=v_title,
                                  pos_left='center',
                                  title_textstyle_opts=opts.TextStyleOpts(color=title_color, ), ),  # 标题
        legend_opts=opts.LegendOpts(pos_left='center', pos_top='8%', orient='horizontal',
                                    textstyle_opts=opts.TextStyleOpts(color='white', ))  # 图例字体颜色
    )
)

玫瑰图效果:

情感分布-玫瑰图
情感分布-玫瑰图

3.4 柱形图-TOP10关键词

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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
data10 = collections.Counter(result).most_common(10)

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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
 # 画柱形图
bar = Bar(
    init_opts=opts.InitOpts(theme=theme_config, width='780px', height=chart_height,
                            chart_id='bar1'))  # 初始化条形图
bar.add_xaxis(x_data)  # 增加x轴数据
bar.add_yaxis("高频词汇", y_data)  # 增加y轴数据
bar.set_series_opts(label_opts=opts.LabelOpts(position="top"))  # Label出现位置
bar.set_global_opts(。。。)

柱形图效果:

top10高频词-柱形图
top10高频词-柱形图

3.5 折线图-讨论热度趋势

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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 按日期分组统计评论数量
df_comments['评论日期'] = df_comments['评论时间'].astype(str).str[:10]  # 提取日期
grp = df_comments.groupby('评论日期')['评论内容'].count()

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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
line = Line(
init_opts=opts.InitOpts(width='780px', height=chart_height, theme=theme_config, chart_id='line1'))  # 实例化
line.add_xaxis(x_data)  # 加入X轴数据
line.add_yaxis('讨论数量', y_data, is_smooth=True,
           areastyle_opts=opts.AreaStyleOpts(color=JsCode(area_color_js), opacity=1), )  # 加入Y轴数据
line.set_global_opts(。。。)

折线图效果:

讨论热度趋势-折线图
讨论热度趋势-折线图

3.6 地图-IP分布

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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 数据清洗-ip属地
ip_count = df_comments['评论者IP归属地'].str.replace('来自', '')

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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 统计各IP数量
ip_count = ip_count.value_counts()

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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
f_map = (
    Map(init_opts=opts.InitOpts(width='600px',
                                height='600px',
                                theme=theme_config,
                                page_title=v_title,
                                chart_id='map1',
                                bg_color=None))
    .add(series_name="评论数量",
         data_pair=list(zip(loc_list, value_list)),
         maptype="china",  # 地图类型
         is_map_symbol_show=False)
    .set_global_opts(。。。)
    .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', )
                     )
)

地图效果,如下:

评论IP分布-中国地图
评论IP分布-中国地图

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

3.7 Page组合大屏

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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 绘制:整个页面
page = Page(
    page_title='微博热门评论可视化分析大屏-以"淄博烧烤"为例',
    layout=Page.DraggablePageLayout,
)
page.add(
    # 绘制:大标题
    make_title(v_title='微博热门评论可视化分析大屏-以"淄博烧烤"为例'),
    # 绘制:词云图
    make_wordcloud(v_title='评论内容-词云图'),
    # 绘制:饼图
    make_analyse_pie(v_title='情感分布-玫瑰图'),
    # 绘制:柱形图
    make_bar(v_title='TOP10关键词-柱形图'),
    # 绘制:折线图
    make_line(v_title='讨论热度趋势-折线图'),
    # 绘制:地图
    make_map(v_title='评论IP分布-中国地图'),
)
page.render('大屏_临时.html') 

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

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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
Page.save_resize_html(
	source="大屏_临时.html",  # 源html文件
	cfg_file="chart_config.json",  # 配置文件
	dest="大屏_最终.html"  # 目标html文件
)

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

四、彩蛋-多种颜色主题

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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 整体主题颜色
theme_config = ThemeType.SHINE

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

4.1 INFOGRAPHIC主题

INFOGRAPHIC主题
INFOGRAPHIC主题

4.2 MACARONS主题

MACARONS主题
MACARONS主题

4.3 SHINE主题

SHINE主题
SHINE主题

4.4 WALDEN主题

WALDEN主题
WALDEN主题

4.5 WESTEROS主题

WESTEROS主题
WESTEROS主题

4.6 WHITE主题

WHITE主题
WHITE主题

4.7 WONDERLAND主题

WONDERLAND主题
WONDERLAND主题

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

五、技术总结

技术开发流程:

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

六、在线体验

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

mgnb.pro:8888

七、演示视频

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

___

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
暂无评论
推荐阅读
编辑精选文章
换一批
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
针对TOP250排行榜的数据,开发一套可视化数据大屏系统,展示各维度数据分析结果。
马哥python说
2025/04/27
4130
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
【爬虫+数据清洗+可视化分析】舆情分析"淄博烧烤"的B站评论
自从2023.3月以来,"淄博烧烤"现象持续占领热搜流量,体现了后疫情时代众多网友对人间烟火气的美好向往,本现象级事件存在一定的数据分析实践意义。
马哥python说
2024/04/06
5980
【爬虫+数据清洗+可视化分析】舆情分析"淄博烧烤"的B站评论
利用pyecharts做数据大屏dashboard
本站文章除注明转载/出处外,均为本站原创,转载前请务必署名,转载请标明出处 最后编辑时间为: 2021/11/25 15:50:29
overme
2022/01/17
1.8K0
利用pyecharts做数据大屏dashboard
用Python爬取了《扫黑风暴》数据,并将其可视化分析后,终于知道它为什么这么火了~
本期是对腾讯热播剧——扫黑风暴的一次爬虫与数据分析,耗时两个小时,总爬取条数3W条评论,总体来说比较普通,值得注意的一点是评论的情绪文本分析处理,这是第一次接触的知识。
用户8949263
2022/04/08
5560
用Python爬取了《扫黑风暴》数据,并将其可视化分析后,终于知道它为什么这么火了~
用Python爬取了《雪中悍刀行》数据,并将其可视化分析后,终于知道它为什么这么火了~
本期是对腾讯热播剧——雪中悍刀行的一次爬虫与数据分析,耗时一个小时,总爬取条数1W条评论,很适合新人练手,值得注意的一点是评论的情绪文本分析处理,这是第一次接触的知识。
陈晨135
2022/01/04
6980
用Python爬取了《雪中悍刀行》数据,并将其可视化分析后,终于知道它为什么这么火了~
Python数据可视化 词云图 绘制词云的方法总结
pyecharts是基于echarts的python库,能够绘制多种交互式图表,和其他可视化库不一样,pyecharts支持链式调用。
叶庭云
2020/09/17
31.6K0
Python数据可视化   词云图  绘制词云的方法总结
用Python分析《令人心动的offer2》的13万条弹幕,网友们都在吐槽什么?
综艺,是我们劳累了一天的放松方式,也是我们饭后的谈资。看着自己喜欢的综艺,时光足够美。而《令人心动的offer》,就是一个不错的综艺选择。
龙哥
2020/12/07
3250
用Python分析《令人心动的offer2》的13万条弹幕,网友们都在吐槽什么?
python pyecharts数据可视化 词云图 仪表盘 水球图
词云就是通过形成关键词云层或关键词渲染,过滤掉大量的文本信息,对网络文本中出现频率较高的关键词的视觉上的突出。
叶庭云
2020/09/17
1.7K0
python   pyecharts数据可视化  词云图  仪表盘   水球图
如何用Python对某娅偷逃税进行微博舆情分析~
前几天某娅因偷逃税被罚了13.41亿元,此消息一出,可是在网上激起了千层浪,网友们直接炸锅了。都在感慨,这辈子挣的钱不知道有没有人家交的罚款的零头多。
陈晨135
2021/12/25
9010
如何用Python对某娅偷逃税进行微博舆情分析~
用 pyecharts 制作数据可视化大屏之数据地图
前段时间,给大家分享过 20 个炫酷的数据可视化大屏,源代码都是基于 echarts 的,于是我产生了用 Python 来实现数据可视化大屏的想法。
张俊红
2021/02/03
3.9K0
用 pyecharts 制作数据可视化大屏之数据地图
《囧妈》口碑扑街?Python告诉你观众这次为何不买账了
导读:今天我们就来聊聊另类春节档的唯一一部电影《囧妈》,Python技术部分可以直接看第三部分。
IT阅读排行榜
2020/02/20
3830
《囧妈》口碑扑街?Python告诉你观众这次为何不买账了
Python 爬取“工商秘密”微博后,我做了这个“可视化大屏”(附gif图)
微博作为我的日常软件之一,平时除了看看热搜、肖战(哈哈),我还会时不时看看秘密,虽然从来都没有投过稿,但还是会对一些感兴趣的内容评论评论或者点点赞,前两天刷秘密突然很想知道,
数据森麟
2021/03/09
6570
Python 爬取“工商秘密”微博后,我做了这个“可视化大屏”(附gif图)
软件测试|Python数据可视化神器——pyecharts教程(三)
前面两篇文章我们使用pyecharts绘制了柱状图以及基于地图的热力图等图像,在我们的日常工作中,还有饼状图也是我们经常使用的图像,下面我们来介绍一下使用pyecharts绘制饼状图的教程。
霍格沃兹测试开发Muller老师
2023/02/19
6280
Python告诉你:从《入海》到《消愁》毛不易的歌里都在唱些什么?
【导语】:今天我们来聊聊——B站联合毛不易发布的毕业季主题曲《入海》,以及背后不一样的毛不易。Python技术部分请看第三部分。公众号后台,回复关键字“入海”获取完整数据。
CDA数据分析师
2020/05/26
6360
Python告诉你:从《入海》到《消愁》毛不易的歌里都在唱些什么?
任意关键词(如淄博烧烤)微博数据抓取及可视化
利用在上一期【推送】中微博关键词爬虫,爬取了超过 4000 条微博数据,每条数据 18 个字段,这一期,我们来看看对这份数据的数据分析。包含常规可视化和复杂网络建模两部分,也许值得一个收藏、转发。
月小水长
2023/07/03
6690
任意关键词(如淄博烧烤)微博数据抓取及可视化
Python解读:地摊经济火了,你想好摆摊去卖什么了吗?
【导语】:今天我们来聊聊地摊经济,Python技术部分请看第四部分。公众号后台,回复关键字“地摊”获取完整数据。
CDA数据分析师
2020/06/12
7550
仅拍125个视频就成为千万级网红? Python告诉你:李子柒的视频都在拍些什么?
【导语】:今天我们来聊聊把生活过成诗的李子柒。Python技术部分请看第二部分。公众号后台,回复关键字“李子柒”获取完整数据。
CDA数据分析师
2020/06/04
1.5K0
仅拍125个视频就成为千万级网红? Python告诉你:李子柒的视频都在拍些什么?
不仅仅是玩具,Python带你解读不一样的乐高
【导语】:今天我们来聊聊小朋友和大朋友们都爱不释手的乐高,Python技术部分请看第四部分。公众号后台,回复关键字“乐高”获取完整数据。
CDA数据分析师
2020/06/04
8770
不仅仅是玩具,Python带你解读不一样的乐高
26张图,带你全面盘点2021微博热搜!
2021是最好的一年,也是很差的一年,时光如白驹过隙,匆匆溜走,还有多少热点,在你的记忆里!
周萝卜
2022/02/10
2.3K0
26张图,带你全面盘点2021微博热搜!
爬取猫眼《长津湖》影评,分析观影群众信息,还进行了明日票房预测,好玩!
对于这个十一黄金周的电影市场,绝对是《长津湖》的天下,短短几天,票房就已经突破36亿,大有奋起直追《战狼2》的尽头。而且口碑也是相当的高,猫眼评分高达9.5,绝对的票房口碑双丰收啊
周萝卜
2021/10/13
6080
推荐阅读
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
4130
【爬虫+数据清洗+可视化分析】舆情分析"淄博烧烤"的B站评论
5980
利用pyecharts做数据大屏dashboard
1.8K0
用Python爬取了《扫黑风暴》数据,并将其可视化分析后,终于知道它为什么这么火了~
5560
用Python爬取了《雪中悍刀行》数据,并将其可视化分析后,终于知道它为什么这么火了~
6980
Python数据可视化 词云图 绘制词云的方法总结
31.6K0
用Python分析《令人心动的offer2》的13万条弹幕,网友们都在吐槽什么?
3250
python pyecharts数据可视化 词云图 仪表盘 水球图
1.7K0
如何用Python对某娅偷逃税进行微博舆情分析~
9010
用 pyecharts 制作数据可视化大屏之数据地图
3.9K0
《囧妈》口碑扑街?Python告诉你观众这次为何不买账了
3830
Python 爬取“工商秘密”微博后,我做了这个“可视化大屏”(附gif图)
6570
软件测试|Python数据可视化神器——pyecharts教程(三)
6280
Python告诉你:从《入海》到《消愁》毛不易的歌里都在唱些什么?
6360
任意关键词(如淄博烧烤)微博数据抓取及可视化
6690
Python解读:地摊经济火了,你想好摆摊去卖什么了吗?
7550
仅拍125个视频就成为千万级网红? Python告诉你:李子柒的视频都在拍些什么?
1.5K0
不仅仅是玩具,Python带你解读不一样的乐高
8770
26张图,带你全面盘点2021微博热搜!
2.3K0
爬取猫眼《长津湖》影评,分析观影群众信息,还进行了明日票房预测,好玩!
6080
相关推荐
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验