有幸入华夏 发表于 2024-6-14 20:40:01

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

目录

[*]一、开发背景
[*]二、爬虫代码

[*]2.1 爬微博列表
[*]2.2 爬微博评论
[*]2.3 导入MySQL数据库

[*]三、可视化代码

[*]3.1 大标题
[*]3.2 词云图(含:加载停用词)
[*]3.3 玫瑰图(含:snownlp情感分析)
[*]3.4 柱形图-TOP10关键词
[*]3.5 折线图-讨论热度趋势
[*]3.6 地图-IP分布
[*]3.7 Page组合大屏

[*]四、彩蛋-多种颜色主题

[*]4.1 INFOGRAPHIC主题
[*]4.2 MACARONS主题
[*]4.3 SHINE主题
[*]4.4 WALDEN主题
[*]4.5 WESTEROS主题
[*]4.6 WHITE主题
[*]4.7 WONDERLAND主题

[*]五、技术总结
[*]六、在线体验
[*]七、演示视频
[*]八、转载声明

一、开发背景

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

动态演示:
【大屏演示】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代表"热门",如下:

解析数据部分:
# 解析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数据库

最核心的三行代码:
# 读取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向数据库的导入。
这个部分的讲解视频:见原文
三、可视化代码

3.1 大标题

由于pyecharts组件没有专门用作标题的图表,我决定灵活运用Line组件实现大标题。
首先,找到一张星空图作为大屏背景图:

然后,在Line组件中加入js代码,加载背景图:
# 设置背景图片
line3.add_js_funcs(
    """
    var img = new Image(); img.src = './static/bg2.png';
    """
)大标题效果如下:

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

绘制词云图,需要先进行中文分词。既然分词,就要先设置停用词,避免干扰词影响分析结果。
这里采用哈工大停用词作为停用词词典。
# 停用词列表
with open('hit_stopwords.txt', 'r') as f:
    stopwords_list = f.readlines()
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=,
       )# 增加数据
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技术进行情感打分及判定结果:
for comment in cmt_list:    sentiments_score = SnowNLP(comment).sentiments    if 0
页: [1]
查看完整版本: 【可视化大屏】用Python开发「淄博烧烤」话题事件的微博热评舆情分析大屏