一、开发背景

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

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

静态截图:

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

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

二、爬虫代码

2.1 爬微博列表

通过m端的查找页面,爬取以”淄博烧烤”为要害词的微博id,获取到微博id的意图,是传给谈论爬虫。

发送恳求部分:

# 恳求地址
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代表”抢手”,如下:

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

解析数据部分:

# 解析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页限制!

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

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

说明:不管微博查找页,还是微博谈论页,都可以自定义设置max_page,满意自己的个性化数据量要求。

2.3 导入MySQL数据库

最中心的三行代码:

# 读取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组件完成大标题。

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

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

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

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

大标题作用如下:

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

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

制作词云图,需要先进行中文分词。既然分词,就要先设置停用词,防止干扰词影响剖析成果。
这儿选用哈工大停用词作为停用词词典。

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

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

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

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

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

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),  # 显现提示
)

词云图作用:

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

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

先对谈论数据进行情感断定,选用snownlp技能进行情感打分及断定成果:

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开发「淄博烧烤」微博热评舆情分析大屏

制作玫瑰图,部分中心代码:

# 画饼图
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', ))  # 图例字体色彩
    )
)

玫瑰图作用:

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

3.4 柱形图-TOP10要害词

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

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

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

 # 画柱形图
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(。。。)

柱形图作用:

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

3.5 折线图-谈论热度趋势

首要,依据谈论时刻计算出每天的微博谈论数量:

# 按日期分组计算谈论数量
df_comments['谈论日期'] = df_comments['谈论时刻'].astype(str).str[:10]  # 提取日期
grp = df_comments.groupby('谈论日期')['谈论内容'].count()

然后,依据计算数据画出折线图,部分中心代码:

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(。。。)

折线图作用:

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

3.6 地图-IP散布

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

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

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

# 计算各IP数量
ip_count = ip_count.value_counts()

下面开始制作地图,部分中心代码:

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', )
                     )
)

地图作用,如下:

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

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

3.7 Page组合大屏

终究,也是最要害的一步,把以上所有图表组合到一同,用Page组件,而且选用DraggablePageLayout方法,即拖拽的方法,组合图表:

# 制作:整个页面
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配置文件,生成终究大屏文件。

Page.save_resize_html(
	source="大屏_暂时.html",  # 源html文件
	cfg_file="chart_config.json",  # 配置文件
	dest="大屏_终究.html"  # 目标html文件
)

至此,所有代码履行结束,生成了终究大屏html文件。

四、彩蛋-多种色彩主题

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

# 整体主题色彩
theme_config = ThemeType.SHINE

只需替换ThemeType参数,即可完成一键替换主题!

4.1 INFOGRAPHIC主题

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

4.2 MACARONS主题

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

4.3 SHINE主题

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

4.4 WALDEN主题

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

4.5 WESTEROS主题

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

4.6 WHITE主题

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

4.7 WONDERLAND主题

【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

更多色彩主题等候小伙伴去开掘!

五、技能总结

技能开发流程

  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源码干货中!