Python|爬取每日疫情数据并使用matplotlib绘制图像进行分析

网页分析

某农带的专业Python课作业
提醒:每个人的代码风格都不一样,不要直接照抄,ITC会查重。

数据源 腾讯疫情实时追踪
打开网址,F12 进入开发者工具(刷新一下页面),如下,所有数据都可以通过接口获取:

国内数据接口:
https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=
各省历史数据接口:
https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?adCode=
国外数据接口:
https://api.inews.qq.com/newsqa/v1/automation/modules/list?modules=

数据获取

抓取数据

获取步骤:

  • 先定义接口调用函数
  • 通过接口名获取数据,然后直接获取response对象中的json文件
def get_json():
   """
   获取json数据
   :return: json数据
   """
   url = 'https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=statisGradeCityDetail,diseaseh5Shelf'
   headers = {
      'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36'
   }
   response = requests.get(url=url,headers=headers)
   json_data = response.json()['data']['diseaseh5Shelf']['areaTree'][0]['children']
   return json_data

解析json并写入excel

json文件实际上就是一个字典,我们通过相应的键来找到我们需要的值,也就是地区、新增确诊、治愈人数、死亡人数、现存人数和累计确诊人数,使用list来存储这些数据,随后将各省的数据写入excel库中。因为是作业,老师要求使用xlwt库来解决该问题,否则使用pandas库将会更好。

代码如下:

def parser_json(province_catch_data):
	"""
	解析json并将其写入excel
	:param province_catch_data: 爬取下来的json数据
	:return: 
	"""
	workbook = xlwt.Workbook()
	sheet1 = workbook.add_sheet('各省疫情基本情况')
	form_head = ['地区', '新增确诊', '治愈人数', '死亡人数', '现存人数', '累计确诊']
	for j in range(0, len(form_head)):
		sheet1.write(0, j, form_head[j])
	for i in range(len(province_catch_data)):
		province_data_list = []
		region = province_catch_data[i]['name']
		province_data_list.append(region)
		province_today = province_catch_data[i]['today']  # 省当日数据字典
		province_total = province_catch_data[i]['total']  # 省总数据字典
		new_confirm = province_today['confirm']  # 新增确诊
		province_data_list.append(new_confirm)
		heal = province_total['heal']  # 治愈人数
		province_data_list.append(heal)
		dead = province_total['dead']  # 死亡人数
		province_data_list.append(dead)
		now_confirm = province_total['nowConfirm']  # 现存确诊
		province_data_list.append(now_confirm)
		total_confirm = province_total['confirm']  # 累计确诊
		province_data_list.append(total_confirm)
		for k in range(len(province_data_list)):
			sheet1.write(i + 1, k, province_data_list[k])
	workbook.save('tjl.xls')

结果如下:

image-20221025161347955

读取excel并绘制图像

使用xlrd库读入数据并使用matplotlib绘制疫情折线图

def plot_excel(excelpath):
   """
   读取excel文件并使用matplotlib绘制
   :param excelpath: excel文件地址
   :return:
   """
   book = xlrd.open_workbook(excelpath)
   sheet0 = book.sheets()[0]  # 表格索引,从0开始
   regions = sheet0.col_values(0)
   x = regions[1:]
   new_confirms = sheet0.col_values(1)
   y = new_confirms[1:]
   plt.figure(dpi=300, figsize=(16, 8))
   plt.plot(x, y, "g", marker='D', markersize=5, label="新增确诊人数")
   # 绘制坐标轴标签
   plt.xlabel(regions[0])
   plt.ylabel(new_confirms[0])
   plt.xticks(rotation=45, fontsize=16)  # x轴刻度字体大小
   plt.yticks(fontsize=16)  # y轴刻度字体大小
   for a, b in zip(x, y):
      plt.text(a, b, int(b), ha='center', va='bottom', fontsize=16)
   plt.legend(loc='upper right')
   plt.title("各省新增确诊人数统计图")
   # 显示中文字体
   plt.rcParams["font.sans-serif"] = ["SimHei"]
   plt.rcParams['axes.unicode_minus'] = False
   plt.tight_layout()
   plt.show()

结果如下:

image-20221025161110348

因为是老师上课布置的作业,所以很多都懒得调整,需要的话可以自己钻研。

posted @ 2022-10-25 16:16  Weltㅤ  阅读(146)  评论(2编辑  收藏  举报