Python爬虫以及matplotlib中文乱码的解决办法

一、待解决问题

1、如何展示Python的爬虫能力?

2、如何展示Python的绘图能力?

老规矩,先看看最终呈现的效果。

这个例子特别感谢如下两位同行:

1、提供疫情分析的源码:https://blog.csdn.net/xufive/article/details/104093197

2、解决matplotlib中文乱码的问题:https://blog.csdn.net/qq_41689620/article/details/85218329

二、爬取数据

如代码所示,爬取数据之前,你必须要知道数据来源,有了数据来源之后,通过浏览器获取JSON格式的数据即可完成本步骤。

def catch_daily():
    """抓取每日确诊和死亡数据"""

    url = 'https://view.inews.qq.com/g2/getOnsInfo?name=wuwei_ww_cn_day_counts&callback=&_=%d' % int(time.time() * 1000)
    data = json.loads(requests.get(url=url).json()['data'])
    data.sort(key=lambda x: x['date'])

    date_list = list()  # 日期
    confirm_list = list()  # 确诊
    suspect_list = list()  # 疑似
    dead_list = list()  # 死亡
    heal_list = list()  # 治愈
    for item in data:
        month, day = item['date'].split('/')
        date_list.append(datetime.strptime('2020-%s-%s' % (month, day), '%Y-%m-%d'))
        confirm_list.append(int(item['confirm']))
        suspect_list.append(int(item['suspect']))
        dead_list.append(int(item['dead']))
        heal_list.append(int(item['heal']))

    return date_list, confirm_list, suspect_list, dead_list, heal_list

三、数据展示

数据展示就主要靠matplotlib库了,它的强大目前还未完全展示,后续应该会经常用到。

def plot_daily():
    """绘制每日确诊和死亡数据"""

    date_list, confirm_list, suspect_list, dead_list, heal_list = catch_daily()  # 获取数据


    plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']

    plt.figure('疫情统计图表', facecolor='#f4f4f4', figsize=(10, 8))
    plt.title('疫情曲线', fontsize=20)

    plt.plot(date_list, confirm_list, label='确诊')
    plt.plot(date_list, suspect_list, label='疑似')
    plt.plot(date_list, dead_list, label='死亡')
    plt.plot(date_list, heal_list, label='治愈')

    plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))  # 格式化时间轴标注
    plt.gcf().autofmt_xdate()  # 优化标注(自动倾斜)
    plt.grid(linestyle=':')  # 显示网格
    plt.legend(loc='best')  # 显示图例
    plt.savefig('2020疫情曲线.png')  # 保存为文件
    plt.show()

四、小插曲-matplotlib中文乱码

刚开始的时候,运行本文的代码会出现乱码。如下图所示,这显然是我们不愿意看到的。

Python爬虫以及matplotlib中文乱码的解决办法_第1张图片

通过网上查询资料发现有好多各式各样的解决方案,但Mac环境下有个极好用的办法,那就是加入以下代码:

lt.rcParams['font.sans-serif'] = ['Arial Unicode MS']

就是有了它,才有了我们真正想看到的数据呈现。

就这样告一段落了,特别感谢前面引用的两篇文章,特意粘贴最终的代码,下一步要考虑解决在地图中的展示了。

# -*- coding: utf-8 -*-

import time
import json
import requests
from datetime import datetime
import numpy as np
import matplotlib
import matplotlib.figure
from matplotlib.font_manager import FontProperties
from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.patches import Polygon
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

plt.rcParams['font.sans-serif'] = ['FangSong']  # 设置默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像时'-'显示为方块的问题


def catch_daily():
    """抓取每日确诊和死亡数据"""

    url = 'https://view.inews.qq.com/g2/getOnsInfo?name=wuwei_ww_cn_day_counts&callback=&_=%d' % int(time.time() * 1000)
    data = json.loads(requests.get(url=url).json()['data'])
    data.sort(key=lambda x: x['date'])

    date_list = list()  # 日期
    confirm_list = list()  # 确诊
    suspect_list = list()  # 疑似
    dead_list = list()  # 死亡
    heal_list = list()  # 治愈
    for item in data:
        month, day = item['date'].split('/')
        date_list.append(datetime.strptime('2020-%s-%s' % (month, day), '%Y-%m-%d'))
        confirm_list.append(int(item['confirm']))
        suspect_list.append(int(item['suspect']))
        dead_list.append(int(item['dead']))
        heal_list.append(int(item['heal']))

    return date_list, confirm_list, suspect_list, dead_list, heal_list



def plot_daily():
    """绘制每日确诊和死亡数据"""

    date_list, confirm_list, suspect_list, dead_list, heal_list = catch_daily()  # 获取数据


    plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']

    plt.figure('疫情统计图表', facecolor='#f4f4f4', figsize=(10, 8))
    plt.title('疫情曲线', fontsize=20)

    plt.plot(date_list, confirm_list, label='确诊')
    plt.plot(date_list, suspect_list, label='疑似')
    plt.plot(date_list, dead_list, label='死亡')
    plt.plot(date_list, heal_list, label='治愈')

    plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))  # 格式化时间轴标注
    plt.gcf().autofmt_xdate()  # 优化标注(自动倾斜)
    plt.grid(linestyle=':')  # 显示网格
    plt.legend(loc='best')  # 显示图例
    plt.savefig('2020疫情曲线.png')  # 保存为文件
    plt.show()




if __name__ == '__main__':
    plot_daily()
    

 

你可能感兴趣的:(数据科学家,人工智能)