Python爬虫之疫情统计


前言

己亥末,庚子春,荆楚大疫,染者数万计,众惶恐举国防,皆闭户,南山镇守江南都,率白衣郎中数万抗之,且九州一心,月余,疫尽去,国泰民安。

2020年,是特殊的一年,是我辈就算穷极一生也刻骨铭心的一年。

新年伊始,疫情肆虐,先有武汉封一座城,护一国人,而后有全国14亿人民足不出户,共抗疫情。工厂停工,学校停学,最可爱的战士连夜出征,奔赴前线;最美逆行者写下状纸,不计生死、不计报酬。短短数日,火神山雷神山医院在全国人民的关注下拔地而起,一省包一市,一批又一批医务人员从全国各地赶往支援,一车又一车的物质不断运往前线。无数感人的故事,正在整个神州大地上演。

无论什么时候,中华民族都是一个不屈的民族,一个团结的民族,一方有难,八方支援,因为我们是同胞,因为我们是一家人!中国抗疫,刚有起色,然而外面的世界,正在开始大崩坏...

疫情通报上每天更新的一串串数字,无一不令人触目惊心。

准备

首先选定爬虫目标网站,每天打开微信,看一看里面的置顶话题就是每天的疫情实况,本次就从这里抓取数据:

通过抓包发现,每一个省份或地区都有一个储存各地区数据的json文件,里面储存了疫情爆发以来每日的确诊、疑似、死亡等数据,而这个json文件url正是以各个地区名称结尾,下图以湖北为例。那么接下来就可以先爬取全国各地区名单,然后分别请求各地区存储数据的json文件即可。

其中对应关系为:

  • date: 日期
  • province: 省份
  • confirm: 累计确诊
  • dead: 累计死亡
  • heal: 累计治愈
  • newConfirm: 新增确诊
  • newHeal: 新增确治愈
  • newDead: 新增死亡

爬取全国各地区名单

抓包发现一个存储全国各地疫情状况的文件,可以从里面提取全国各地区的名单:

def get_pros():
  pros_url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=jQuery34105025976041749454_1585617083512&_=1585617083513'
  res = requests.get(pros_url,headers=headers)
  res.encoding = "utf-8"
  data = res.text.split('(')[-1].split(')')[0]
  pros_data = json.loads(json.loads(data)['data'])["areaTree"][0]['children']
  pros_list = []
  for province in pros_data:
    pros_list.append(province['name'])
  return pros_list

打印出来看一下,可以看到全国23个省、5个自治区、4个直辖市、2个特别行政区一共34个都拿到了

爬取各地区疫情统计

上面提到,每个地区都有一个存储该地区数据的文件,接口为https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province={该地区名字},现在可以写个循环,将上面获取的名单分别代入接口请求:
先打印湖北地区疫情爆发前三天的数据来看看效果:

接下来就该是爬取全国各地每天的疫情情况,并进行数据持久化了。先写一个函数,用来解析每个省份的数据并进行数据持久化

def parse_data(pro):
  api = "https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province={}".format(pro)
  res = requests.get(api,headers=headers)
  data = json.loads(res.text)['data']
  file_name = "{}疫情数据统计".format(pro)+ ".csv"
  f = open(file_name, "w")
  table_head = "日期,新增确诊,新增死亡,累计确诊,累计死亡,累计治愈\n"
  f.write(table_head)
  for day in data:
    day_data = str(day['date'])+','+str(day['newConfirm'])+','+str(day['newDead'])+','+str(day['confirm'])+','+str(day['dead'])+','+str(day['heal'])
    f.write(day_data+'\n')
  f.close()

每个省份的数据都写在一个独立的csv文件中

用excel打开看看:

以下是完整代码:

import requests
import json
from pprint import pprint

headers = {
  'authority': 'news.qq.com',
  'upgrade-insecure-requests': '1',
  'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36',
  'sec-fetch-dest': 'document',
  'accept': 'text/html,application/xhtml+xml,apclearplication/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
  'sec-fetch-site': 'none',
  'sec-fetch-mode': 'navigate',
  'sec-fetch-user': '?1',
  'accept-language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7',
  'cookie': 'pgv_pvid=761702606; pgv_pvi=7168081920; RK=hbJFHAm2+T; ptcz=ba2fd946cd11bb4d294283190e97959d82dc591888a18c00f8f84e18026fe939; ied_qq=o2251513837; tvfe_boss_uuid=df52dd4299ac9a2a; o_cookie=2251513837; ptui_loginuin=1046492537; luin=o2251513837; lskey=000100006b7bebe5ac0c545f74c9756ac1d040350f18d5c8ec78acd08a15e179d2e7e606da2df5b0336ca6d3; webwx_data_ticket=gSe03n3GCWmcsMI1h21yIBVZ; pgv_si=s2094803968'
}

def get_pros():
  pros_url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=jQuery34105025976041749454_1585617083512&_=1585617083513'
  res = requests.get(pros_url,headers=headers)
  res.encoding = "utf-8"
  data = res.text.split('(')[-1].split(')')[0]
  pros_data = json.loads(json.loads(data)['data'])["areaTree"][0]['children']
  pros_list = []
  for province in pros_data:
    pros_list.append(province['name'])
  return pros_list


def parse_data(pro):
  api = "https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province={}".format(pro)
  res = requests.get(api,headers=headers)
  data = json.loads(res.text)['data']
  file_name = "{}疫情数据统计".format(pro)+ ".csv"
  f = open(file_name, "w")
  table_head = "日期,新增确诊,新增死亡,累计确诊,累计死亡,累计治愈\n"
  f.write(table_head)
  for day in data:
    day_data = str(day['date'])+','+str(day['newConfirm'])+','+str(day['newDead'])+','+str(day['confirm'])+','+str(day['dead'])+','+str(day['heal'])
    f.write(day_data+'\n')
  f.close()


def main():
  pros = get_pros()
  for pro in pros:
    parse_data(pro)
    print(pro+"数据写入成功!")


if __name__ == '__main__':
    main()
https://file.ztongyang.cn/yang/picttures/QQqr.jpg https://file.ztongyang.cn/yang/picttures/wechatqr.png https://metu.ztongyang.cn/a/avatar.jpg avatar

南玖

生命不息,折腾不止

  网站咨询
  •   当前在线1人
  •   加载耗时28 ms
  •   文章数目40篇
  •   分类总数10个
  •   评论总数57条
  •   站点字数3.84 W
  •   运行时间62天
  访问信息
  •   
  •   2020-09-25 12:28:35 Fri
  •   ?浏览器
  •   操作系统
  热门文章