【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

一、事件背景

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

【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

至今已有2.5亿次观看量,瞬间冲上热搜。

二、微热点分析

以下数据来源:微热点

【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

二、自开发Python舆情分析

2.1 Python爬虫

从博文URL地址中找出id。

目标链接地址的id参数值就是id:

原文查看

把id带入到我的Python爬虫代码中,下面展示部分爬虫代码。

关键逻辑,就是max_id的处理:

if page == 1:  # 第一页,没有max_id参数
    url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id_type=0'.format(weibo_id, weibo_id)
else:  # 非第一页,需要max_id参数
    if max_id == '0':  # 如果发现max_id为0,说明没有下一页了,break结束循环
        print('max_id is 0, break now')
        break
    url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id_type=0&max_id={}'.format(weibo_id,
                                                                                            weibo_id,
                                                                                            max_id)

如果是第一页,不用传max_id参数。

如果非第一页,需要传max_id参数,它的值来自于上一页的r.json()[‘data’][‘max_id’]

首先,向页面发送请求:

r = requests.get(url, headers=headers)  # 发送请求
print(r.status_code)  # 查看响应码
print(r.json())  # 查看响应内容

以下是解析数据的处理逻辑:

[En]

Here is the processing logic for parsing the data:

datas = r.json()['data']['data']
for data in datas:
    page_list.append(page)
    id_list.append(data['id'])
    dr = re.compile(r'<[^>]+>', re.S)  # &#x7528;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#x6E05;&#x6D17;&#x8BC4;&#x8BBA;&#x6570;&#x636E;
    text2 = dr.sub('', data['text'])
    text_list.append(text2)  # &#x8BC4;&#x8BBA;&#x5185;&#x5BB9;
    time_list.append(trans_time(v_str=data['created_at']))  # &#x8BC4;&#x8BBA;&#x65F6;&#x95F4;
    like_count_list.append(data['like_count'])  # &#x8BC4;&#x8BBA;&#x70B9;&#x8D5E;&#x6570;
    source_list.append(data['source'])  # &#x8BC4;&#x8BBA;&#x8005;IP&#x5F52;&#x5C5E;&#x5730;
    user_name_list.append(data['user']['screen_name'])  # &#x8BC4;&#x8BBA;&#x8005;&#x59D3;&#x540D;
    user_id_list.append(data['user']['id'])  # &#x8BC4;&#x8BBA;&#x8005;id
    user_gender_list.append(tran_gender(data['user']['gender']))  # &#x8BC4;&#x8BBA;&#x8005;&#x6027;&#x522B;
    follow_count_list.append(data['user']['follow_count'])  # &#x8BC4;&#x8BBA;&#x8005;&#x5173;&#x6CE8;&#x6570;
    followers_count_list.append(data['user']['followers_count'])  # &#x8BC4;&#x8BBA;&#x8005;&#x7C89;&#x4E1D;&#x6570;
</[^>

最后,还有保存数据的处理逻辑:

[En]

Finally, there is the processing logic for saving data:

df = pd.DataFrame(
    {
        'id': [weibo_id] * len(time_list),
        '&#x8BC4;&#x8BBA;&#x9875;&#x7801;': page_list,
        '&#x8BC4;&#x8BBA;id': id_list,
        '&#x8BC4;&#x8BBA;&#x65F6;&#x95F4;': time_list,
        '&#x8BC4;&#x8BBA;&#x70B9;&#x8D5E;&#x6570;': like_count_list,
        '&#x8BC4;&#x8BBA;&#x8005;IP&#x5F52;&#x5C5E;&#x5730;': source_list,
        '&#x8BC4;&#x8BBA;&#x8005;&#x59D3;&#x540D;': user_name_list,
        '&#x8BC4;&#x8BBA;&#x8005;id': user_id_list,
        '&#x8BC4;&#x8BBA;&#x8005;&#x6027;&#x522B;': user_gender_list,
        '&#x8BC4;&#x8BBA;&#x8005;&#x5173;&#x6CE8;&#x6570;': follow_count_list,
        '&#x8BC4;&#x8BBA;&#x8005;&#x7C89;&#x4E1D;&#x6570;': followers_count_list,
        '&#x8BC4;&#x8BBA;&#x5185;&#x5BB9;': text_list,
    }
)
if os.path.exists(v_comment_file):  # &#x5982;&#x679C;&#x6587;&#x4EF6;&#x5B58;&#x5728;&#xFF0C;&#x4E0D;&#x518D;&#x8BBE;&#x7F6E;&#x8868;&#x5934;
    header = False
else:  # &#x5426;&#x5219;&#xFF0C;&#x8BBE;&#x7F6E;csv&#x6587;&#x4EF6;&#x8868;&#x5934;
    header = True
&#x4FDD;&#x5B58;csv&#x6587;&#x4EF6;
df.to_csv(v_comment_file, mode='a+', index=False, header=header, encoding='utf_8_sig')
print('&#x7ED3;&#x679C;&#x4FDD;&#x5B58;&#x6210;&#x529F;:{}'.format(v_comment_file))

篇幅有限,请求头、cookie、循环页码、数据清洗等其他细节不再赘述。

【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

2.2 可视化大屏

首先,来看看最后的大屏互动:

[En]

First of all, take a look at the final large screen interaction:

这个大屏,包含了5个图表:

  1. 大标题-Line
  2. 词云图-Wordcloud
  3. 条形图-Bar
  4. 饼图-Pie
  5. 地图-Map

接下来,我们将依次解释代码实现。

[En]

Next, we will explain the code implementation in turn.

2.2.1 大标题

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

line3 = (
    Line(init_opts=opts.InitOpts(width="1000px",  # &#x5BBD;&#x5EA6;
                                 height="625px",  # &#x9AD8;&#x5EA6;
                                 bg_color={"type": "pattern", "image": JsCode("img"),
                                           "repeat": "repeat", }))  # &#x8BBE;&#x7F6E;&#x80CC;&#x666F;&#x56FE;&#x7247;
        .add_xaxis([None])  # &#x63D2;&#x5165;&#x7A7A;&#x6570;&#x636E;
        .add_yaxis("", [None])  # &#x63D2;&#x5165;&#x7A7A;&#x6570;&#x636E;
        .set_global_opts(
        title_opts=opts.TitleOpts(title=v_title,
                                  pos_left='center',
                                  title_textstyle_opts=opts.TextStyleOpts(font_size=45,
                                                                          color='#51c2d5',
                                                                          align='left'),
                                  pos_top='top'),
        yaxis_opts=opts.AxisOpts(is_show=False),  # &#x4E0D;&#x663E;&#x793A;y&#x8F74;
        xaxis_opts=opts.AxisOpts(is_show=False))  # &#x4E0D;&#x663E;&#x793A;x&#x8F74;
)
&#x8BBE;&#x7F6E;&#x80CC;&#x666F;&#x56FE;&#x7247;
line3.add_js_funcs(
"""
    var img = new Image(); img.src = '&#x5927;&#x5C4F;&#x80CC;&#x666F;.jpg';
"""
)
line3.render('&#x5927;&#x6807;&#x9898;.html')
print('&#x9875;&#x9762;&#x6E32;&#x67D3;&#x5B8C;&#x6BD5;:&#x5927;&#x6807;&#x9898;.html')

【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

然后用add_js_funcs代码把此图片设置为整个大屏的背景图。

【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

2.2.2 词云图

首先,清理评论数据:

[En]

First, clean out the comment data:

cmt_list = df['&#x8BC4;&#x8BBA;&#x5185;&#x5BB9;'].values.tolist()  # &#x8F6C;&#x6362;&#x6210;&#x5217;&#x8868;
cmt_list = [str(i) for i in cmt_list]  # &#x6570;&#x636E;&#x6E05;&#x6D17;
cmt_str = ' '.join(cmt_list)  # &#x8F6C;&#x6362;&#x6210;&#x5B57;&#x7B26;&#x4E32;

然后,将清理后的数据带入Word云图函数,核心代码:

[En]

Then, bring the cleaned data into the word cloud graph function, the core code:

wc = WordCloud(init_opts=opts.InitOpts(width=chart_width, height=chart_height, theme=theme_config, chart_id='wc1'))
wc.add(series_name="&#x8BCD;&#x6C47;",
       data_pair=data,
       word_gap=1,
       word_size_range=[5, 30],
       mask_image='&#x5F20;&#x5929;&#x7231;&#x80CC;&#x666F;&#x56FE;.png',
       )  # &#x589E;&#x52A0;&#x6570;&#x636E;
wc.set_global_opts(
    title_opts=opts.TitleOpts(pos_left='center',
                              title="&#x5F20;&#x5929;&#x7231;&#x8BC4;&#x8BBA;-&#x8BCD;&#x4E91;&#x56FE;",
                              title_textstyle_opts=opts.TextStyleOpts(font_size=20)  # &#x8BBE;&#x7F6E;&#x6807;&#x9898;
                              ),
    tooltip_opts=opts.TooltipOpts(is_show=True),  # &#x4E0D;&#x663E;&#x793A;&#x5DE5;&#x5177;&#x7BB1;
)
wc.render('&#x5F20;&#x5929;&#x7231;&#x8BCD;&#x4E91;&#x56FE;.html')  # &#x751F;&#x6210;html&#x6587;&#x4EF6;
print('&#x6E32;&#x67D3;&#x5B8C;&#x6210;:' + '&#x5F20;&#x5929;&#x7231;&#x8BCD;&#x4E91;&#x56FE;.html')

【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

2.2.3 条形图

针对评论数据的TOP10高频词,绘制出条形图。
核心代码:

bar = Bar(
    init_opts=opts.InitOpts(theme=theme_config, width=chart_width, height=chart_height,
                            chart_id='bar_cmt'))  # &#x521D;&#x59CB;&#x5316;&#x6761;&#x5F62;&#x56FE;
bar.add_xaxis(x_data)  # &#x589E;&#x52A0;x&#x8F74;&#x6570;&#x636E;
bar.add_yaxis("&#x6570;&#x91CF;", y_data)  # &#x589E;&#x52A0;y&#x8F74;&#x6570;&#x636E;
bar.reversal_axis()  # &#x8BBE;&#x7F6E;&#x6C34;&#x5E73;&#x65B9;&#x5411;
bar.set_series_opts(label_opts=opts.LabelOpts(position="right"))  # Label&#x51FA;&#x73B0;&#x4F4D;&#x7F6E;
bar.set_global_opts(
    legend_opts=opts.LegendOpts(pos_left='right'),
    title_opts=opts.TitleOpts(title=v_title, pos_left='center'),  # &#x6807;&#x9898;
    toolbox_opts=opts.ToolboxOpts(is_show=False, ),  # &#x4E0D;&#x663E;&#x793A;&#x5DE5;&#x5177;&#x7BB1;
    xaxis_opts=opts.AxisOpts(name="&#x6570;&#x91CF;", axislabel_opts={"rotate": 0}),  # x&#x8F74;&#x540D;&#x79F0;
    yaxis_opts=opts.AxisOpts(name="&#x5173;&#x952E;&#x8BCD;",
                             axislabel_opts=opts.LabelOpts(font_size=9, rotate=0),  # y&#x8F74;&#x540D;&#x79F0;
                             ))
bar.render(v_title + ".html")  # &#x751F;&#x6210;html&#x6587;&#x4EF6;
print('&#x6E32;&#x67D3;&#x5B8C;&#x6210;:' + v_title + '.html')

【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

2.2.4 饼图(玫瑰图)

首先,针对评论数据,用snownlp库做情感分析判定。

for comment in v_cmt_list:
    tag = ''
    sentiments_score = SnowNLP(comment).sentiments
    if sentiments_score < 0.4:  # &#x60C5;&#x611F;&#x5206;&#x5C0F;&#x4E8E;0.4&#x5224;&#x5B9A;&#x4E3A;&#x6D88;&#x6781;
        tag = '&#x6D88;&#x6781;'
        neg_count += 1
    elif 0.4 <= sentiments_score <="0.6:" # 情感分在[0.4,0.6]直接判定为中性 tag="&#x4E2D;&#x6027;" mid_count +="1" else: 情感分大于0.6判定为积极 pos_count score_list.append(sentiments_score) 得分值 tag_list.append(tag) 判定结果 df['情感得分']="score_list" df['分析结果']="tag_list" code></=>

然后,将统计数据带入饼图函数,该函数是核心代码的一部分:

[En]

Then, bring the statistics into the pie chart function, part of the core code:

&#x753B;&#x997C;&#x56FE;
pie = (
    Pie(init_opts=opts.InitOpts(theme=theme_config, width=chart_width, height=chart_width, chart_id='pie1'))
        .add(series_name="&#x60C5;&#x611F;&#x5206;&#x5E03;",  # &#x7CFB;&#x5217;&#x540D;&#x79F0;
             data_pair=[['&#x6B63;&#x80FD;&#x91CF;', pos_count],  # &#x6DFB;&#x52A0;&#x6570;&#x636E;
                        ['&#x4E2D;&#x6027;', mid_count],
                        ['&#x8D1F;&#x80FD;&#x91CF;', neg_count]],
             rosetype="radius",  # &#x662F;&#x5426;&#x5C55;&#x793A;&#x6210;&#x5357;&#x4E01;&#x683C;&#x5C14;&#x56FE;
             radius=["30%", "55%"],  # &#x6247;&#x533A;&#x5706;&#x5FC3;&#x89D2;&#x5C55;&#x73B0;&#x6570;&#x636E;&#x7684;&#x767E;&#x5206;&#x6BD4;&#xFF0C;&#x534A;&#x5F84;&#x5C55;&#x73B0;&#x6570;&#x636E;&#x7684;&#x5927;&#x5C0F;
             )  # &#x52A0;&#x5165;&#x6570;&#x636E;
        .set_global_opts(  # &#x5168;&#x5C40;&#x8BBE;&#x7F6E;&#x9879;
        title_opts=opts.TitleOpts(title=v_title, pos_left='center'),  # &#x6807;&#x9898;
        legend_opts=opts.LegendOpts(pos_left='right', orient='vertical')  # &#x56FE;&#x4F8B;&#x8BBE;&#x7F6E;&#x9879;,&#x9760;&#x53F3;,&#x7AD6;&#x5411;&#x6392;&#x5217;
    )
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")))  # &#x6837;&#x5F0F;&#x8BBE;&#x7F6E;&#x9879;
pie.render(v_title + '.html')  # &#x751F;&#x6210;html&#x6587;&#x4EF6;
print('&#x6E32;&#x67D3;&#x5B8C;&#x6210;:' + v_title + '.html')

【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

2.2.5 地图

把评论者的IP归属地统计求和,求和后的总数分布在地图上。

df['&#x8BC4;&#x8BBA;&#x8005;IP&#x5F52;&#x5C5E;&#x5730;'] = df['&#x8BC4;&#x8BBA;&#x8005;IP&#x5F52;&#x5C5E;&#x5730;'].astype(str).str.replace('&#x6765;&#x81EA;', '')  # &#x6570;&#x636E;&#x6E05;&#x6D17;
loc_grp = df.groupby('&#x8BC4;&#x8BBA;&#x8005;IP&#x5F52;&#x5C5E;&#x5730;').count()['&#x8BC4;&#x8BBA;&#x5185;&#x5BB9;']
data_list = list(zip(loc_grp.index.tolist(), loc_grp.values.tolist()))

数据准备好后,将其带入MAP函数,这是核心代码的一部分:

[En]

After the data is ready, bring it into the map function, part of the core code:

f_map = (
    Map(init_opts=opts.InitOpts(width=chart_width,
                                height=chart_height,
                                theme=theme_config,
                                page_title=v_title,
                                chart_id='map1',
                                bg_color=None))
        .add(series_name="&#x8BC4;&#x8BBA;&#x6570;&#x91CF;",
             data_pair=v_data_list,
             maptype="china",  # &#x5730;&#x56FE;&#x7C7B;&#x578B;
             is_map_symbol_show=False)
        .set_global_opts(
        title_opts=opts.TitleOpts(title=v_title,
                                  pos_left="center", ),
        legend_opts=opts.LegendOpts(  # &#x8BBE;&#x7F6E;&#x56FE;&#x4F8B;
            is_show=True, pos_top="40px", pos_right="30px"),
        visualmap_opts=opts.VisualMapOpts(  # &#x8BBE;&#x7F6E;&#x89C6;&#x89C9;&#x6620;&#x5C04;
            is_piecewise=True, range_text=['&#x9AD8;', '&#x4F4E;'], pieces=[  # &#x5206;&#x6BB5;&#x663E;&#x793A;
                # {"min": 10000, "color": "#751d0d"},
                {"min": 121, "max": 150, "color": "#37561a"},
                {"min": 91, "max": 120, "color": "#006400"},
                {"min": 61, "max": 90, "color": "#4d9116"},
                {"min": 31, "max": 60, "color": "#77bb40"},
                {"min": 11, "max": 30, "color": "#b8db9b"},
                {"min": 0, "max": 10, "color": "#e5edd6"}
            ]),
    )
        .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', )
                         )
)
f_map.render(v_title + '.html')
print('&#x6E32;&#x67D3;&#x5B8C;&#x6210;:' + v_title + '.html')

【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

三、演示视频

效果演示:
https://www.zhihu.com/zvideo/1546516025184866304

四、完整源码

附完整源码:点击此处get完整源码!

推荐阅读:
【Python可视化大屏】全流程揭秘实现可视化数据大屏的背后原理!

Original: https://www.cnblogs.com/mashukui/p/16629887.html
Author: 马哥python
Title: 【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/498601/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球