目录
一、背景
二、代码实现过程
1、导包
2、创建对象
3、发送请求
4、解析json数据
5、提取数据
6、写入csv文件
7、定义主方法
8、运行主方法
三、以下是完整代码
一、背景
1、近几年来,我国一直受着新冠疫情的侵扰,随着每天新冠信息的日夜更迭,我们该如何从新闻中挖掘到有效信息呢?所以大体有2部分,第一是进行数据采集 ,第二是进行数据分析和可视化。如果大家想知道数据分析和数据可视化的部分,可以点击这个链接,本篇讲述的是如何对新冠疫情数据进行采集
2、由于该数据没有在页面源代码里面,是异步加载的,我们可以进行网络抓包得到该数据,所以我们要向响应数据的网址发送请求
二、代码实现过程
我们还是选择面向对象的思想来写,因为面向对象的思想能让代码更有逻辑,也更加整洁和高效。
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()