目录

一、背景

 二、代码实现过程

      1、导包

       2、创建对象

      3、发送请求

      4、解析json数据

5、提取数据

6、写入csv文件

7、定义主方法

8、运行主方法

三、以下是完整代码


一、背景

1、近几年来,我国一直受着新冠疫情的侵扰,随着每天新冠信息的日夜更迭,我们该如何从新闻中挖掘到有效信息呢?所以大体有2部分,第一是进行数据采集  ,第二是进行数据分析和可视化。如果大家想知道数据分析和数据可视化的部分,可以点击这个链接,本篇讲述的是如何对新冠疫情数据进行采集

spark疫情数据分析 疫情数据python_spark疫情数据分析

 2、由于该数据没有在页面源代码里面,是异步加载的,我们可以进行网络抓包得到该数据,所以我们要向响应数据的网址发送请求

spark疫情数据分析 疫情数据python_开发语言_02

spark疫情数据分析 疫情数据python_spark疫情数据分析_03

 二、代码实现过程

        我们还是选择面向对象的思想来写,因为面向对象的思想能让代码更有逻辑,也更加整洁和高效。

      1、导包

        用requests库来发送请求,json库来提取数据,csv库来进行数据存储

# coding=utf-8
import requests
import json
import csv

       2、创建对象

        创建类对象,并构建全局变量:响应数据的目标网址,用请求头来进行反爬,发送post请求所带的参数

class COVID(object):
    def __init__(self):
        self.url='https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=localCityNCOVDataList,diseaseh5Shelf'
        self.headers={
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.56'
        }
        self.data={
            'modules': 'localCityNCOVDataList,diseaseh5Shelf'
        }

      3、发送请求

        创建get_data方法来发送post请求得到数据,并进行返回

def get_data(self):
        res=requests.post(url=self.url,headers=self.headers,data=self.data)
        text=res.text
        return text

      4、解析json数据

        由于响应的是json格式的数据,我们没有办法直接进行提取,所以我们将json数据转换为         python中的字典,并返回

@staticmethod
    def json_data(text):
        json_data=json.loads(text)
        return json_data

5、提取数据

从字典中提取我们想要的数据,城市、日期、高风险地区、本地新增、本地无症状、省份、更新时间,并用生成器进行返回

@staticmethod
    def parse_data(json_data):
        localCityNCOVDataList=json_data['data']['localCityNCOVDataList']
        for i in localCityNCOVDataList:
            data=i['city'],i['date'],i['highRiskAreaNum'],i['local_confirm_add'],i['local_wzz_add'],i['province'],i['mtime']
            yield data

6、写入csv文件

在csv文件中写入数据相应的字段,并对生成器进行遍历来依次写入数据

@staticmethod
    def write_csv(data):
        with open('COVID_19.csv', 'w',newline='') as f:
            writer = csv.writer(f)
            writer.writerow(['城市', '日期', '高风险地区', '本土确诊', '本土无症状', '所属省份', '更新时间'])
            for i in data:
                writer.writerow(i)
                print(i)

7、定义主方法

用主方法来运行以上的功能方法,最后只需要运行主方法就行了

def run(self):
        text =self.get_data()
        json_data=self.json_data(text)
        data=self.parse_data(json_data)
        self.write_csv(data)

8、运行主方法

创建实例对象并运行主方法

if __name__ == '__main__':
    covid=COVID()
    covid.run()

三、以下是完整代码

# coding=utf-8
import requests
import json
import csv
class COVID(object):
    def __init__(self):
        self.url='https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=localCityNCOVDataList,diseaseh5Shelf'
        self.headers={
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.56'
        }
        self.data={
            'modules': 'localCityNCOVDataList,diseaseh5Shelf'
        }

    def get_data(self):
        res=requests.post(url=self.url,headers=self.headers,data=self.data)
        text=res.text
        return text

    @staticmethod
    def json_data(text):
        json_data=json.loads(text)
        return json_data

    @staticmethod
    def parse_data(json_data):
        localCityNCOVDataList=json_data['data']['localCityNCOVDataList']
        for i in localCityNCOVDataList:
            data=i['city'],i['date'],i['highRiskAreaNum'],i['local_confirm_add'],i['local_wzz_add'],i['province'],i['mtime']
            yield data

    @staticmethod
    def write_csv(data):
        with open('COVID_19.csv', 'w',newline='') as f:
            writer = csv.writer(f)
            writer.writerow(['城市', '日期', '高风险地区', '本土确诊', '本土无症状', '所属省份', '更新时间'])
            for i in data:
                writer.writerow(i)
                print(i)

    def run(self):
        text =self.get_data()
        json_data=self.json_data(text)
        data=self.parse_data(json_data)
        self.write_csv(data)


if __name__ == '__main__':
    covid=COVID()
    covid.run()