一、开发背景
您好,我是@马哥python说 ,一枚10年程序猿。
自从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向数据库的导入。
这个部分的解说视频:
仅用Python三行代码,完成数据库和excel之间的导入导出!
三、可视化代码
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 = [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), # 显现提示
)
词云图作用:
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文件里,如下:
制作玫瑰图,部分中心代码:
# 画饼图
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高频词(过滤掉停用词之后的):
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(。。。)
柱形图作用:
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(。。。)
折线图作用:
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', )
)
)
地图作用,如下:
当然,地图中的色彩,都是自己设置的十六进制色彩,可以依据自己的喜爱更改。
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主题
4.2 MACARONS主题
4.3 SHINE主题
4.4 WALDEN主题
4.5 WESTEROS主题
4.6 WHITE主题
4.7 WONDERLAND主题
更多色彩主题等候小伙伴去开掘!
五、技能总结
技能开发流程:
- requests 爬虫发送恳求
- json 解析返回数据
- re 正则表达式清洗文本
- pandas保存csv文件
- sqlalchemy 保存MySQL数据
- pyecharts 可视化开发
- snownlp 情感剖析
- jieba 中文分词
- pyecharts+page 组合大屏
- flask 启动网页服务
六、在线体验
为了便利我们体验可视化动态交互作用,我把此大屏布置到了服务器,请移步:
马哥python说 – 作用演示
七、演示视频
作用演示视频:
【大屏演示】Python可视化舆情大屏「淄博烧烤」
八、获取完整源码
附完整源码:【可视化大屏】“淄博烧烤”热评舆情剖析大屏
我是 @马哥python说 ,继续分享python源码干货中!