在疫情防控常态化的背景下,实时掌握全国疫情数据对于政府决策、医疗资源调配以及公众信息获取具有重要意义。本项目旨在通过 Python 爬虫技术,实时抓取全国疫情数据,并利用动态可视化地图直观展示疫情分布情况,同时构建数据预警系统,及时发现疫情异常波动,为疫情防控提供有力支持。
建议使用 Python 3.8+ 版本,并安装以下开发工具和库:
使用 pip 命令安装所需库:
pip install requests pandas matplotlib pyecharts flask
目标数据来源于腾讯新闻疫情接口,该接口以 JSON 格式返回全国各省市的疫情数据,包括累计确诊、现存确诊、死亡人数等关键指标。由于数据是通过异步请求加载的,需要通过网络抓包获取实际的请求 URL。
构造请求头,模拟浏览器行为,向目标 URL 发送请求。
import requests
def fetch_covid_data(url):
"""
发送请求获取疫情数据
Args:
url: 目标接口 URL
Returns:
网页响应内容
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36',
'Accept': 'application/json, text/javascript, */*; q=0.01'
}
try:
response = requests.post(url, headers=headers)
if response.status_code == 200:
return response.text
return None
except Exception as e:
print(f"请求失败:{e}")
return None
将获取到的 JSON 格式数据解析为 Python 字典,提取各省市的疫情数据。
import json
def parse_covid_data(text):
"""
解析疫情数据
Args:
text: 响应文本内容
Returns:
疫情数据字典
"""
try:
json_data = json.loads(text)
return json_data
except Exception as e:
print(f"数据解析失败:{e}")
return None
从解析后的数据中提取关键信息,并将其存储到 CSV 文件中,便于后续分析和展示。
import csv
def extract_and_save_data(json_data, filename='covid_data.csv'):
"""
提取关键数据并保存到 CSV
Args:
json_data: JSON 格式的疫情数据
filename: CSV 文件名
"""
try:
data_list = json_data['data']['list']
with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['省份', '累计确诊', '现存确诊', '死亡', '治愈', '更新时间'])
for item in data_list:
writer.writerow([
item['name'],
item['total_confirm'],
item['now_confirm'],
item['dead'],
item['heal'],
item['update_time']
])
print(f"数据已保存至 {filename}")
except Exception as e:
print(f"数据提取与保存失败:{e}")
利用 pyecharts 库绘制动态可视化地图,直观展示全国各省市的疫情分布情况。地图可以根据确诊人数的不同,使用不同颜色的区域进行标识,以便快速识别疫情严重地区。
from pyecharts.charts import Map
from pyecharts import options as opts
def draw_covid_map(data_file):
"""
绘制疫情动态可视化地图
Args:
data_file: 包含疫情数据的 CSV 文件
"""
# 读取数据
data = pd.read_csv(data_file)
# 准备数据对
data_pairs = [(province, int(confirm)) for province, confirm in zip(data['省份'], data['累计确诊'])]
# 绘制地图
map_chart = (
Map()
.add('累计确诊', data_pairs, 'china')
.set_global_opts(
title_opts=opts.TitleOpts(title='全国疫情动态地图'),
visualmap_opts=opts.VisualMapOpts(
max_=max([pair[1] for pair in data_pairs]),
min_=0,
range_color=['#ffffcc', '#ff4500'],
textstyle_opts=opts.TextStyleOpts(color='#000000')
)
)
)
# 渲染地图
map_chart.render('covid_map.html')
print("疫情动态地图已生成")
根据疫情数据的变化情况,设定以下预警规则:
通过对比历史数据和当前数据,实现预警逻辑。
def check_alert(data_file, threshold=100):
"""
检查疫情数据是否触发预警
Args:
data_file: 包含疫情数据的 CSV 文件
threshold: 单日新增确诊预警阈值
Returns:
触发预警的省份列表
"""
data = pd.read_csv(data_file)
alerts = []
for index, row in data.iterrows():
# 模拟新增确诊数据(实际应用中需要对比历史数据)
new_confirm = row['累计确诊'] - row['累计确诊_prev'] if '累计确诊_prev' in data.columns else 0
# 判断是否触发预警
if new_confirm > threshold:
alerts.append({
'province': row['省份'],
'new_confirm': new_confirm,
'alert_reason': f'单日新增确诊超过 {threshold} 人'
})
return alerts
将预警信息通过邮件或消息推送的方式发送给相关人员。
import smtplib
from email.mime.text import MIMEText
def send_alert_notification(alerts, smtp_config):
"""
发送预警通知
Args:
alerts: 触发预警的列表
smtp_config: SMTP 服务器配置
"""
if not alerts:
return
# 配置邮件内容
subject = '疫情数据预警通知'
body = '以下地区触发疫情预警:\n\n'
for alert in alerts:
body += f"- 地区:{alert['province']}\n"
body += f" 新增确诊:{alert['new_confirm']}\n"
body += f" 原因:{alert['alert_reason']}\n\n"
# 发送邮件
msg = MIMEText(body, 'plain', 'utf-8')
msg['Subject'] = subject
msg['From'] = smtp_config['from_email']
msg['To'] = ', '.join(smtp_config['to_emails'])
try:
server = smtplib.SMTP(smtp_config['smtp_server'], smtp_config['port'])
server.starttls()
server.login(smtp_config['from_email'], smtp_config['password'])
server.sendmail(smtp_config['from_email'], smtp_config['to_emails'], msg.as_string())
server.quit()
print("预警通知已发送")
except Exception as e:
print(f"发送预警通知失败:{e}")
将上述各模块整合,形成完整的爬取、分析和预警流程。
def main():
# 目标疫情数据接口 URL
url = 'https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=localCityNCOVDataList,diseaseh5Shelf'
# 爬取疫情数据
text = fetch_covid_data(url)
if text:
json_data = parse_covid_data(text)
if json_data:
# 提取并保存数据
extract_and_save_data(json_data)
# 绘制动态可视化地图
draw_covid_map('covid_data.csv')
# 检查数据预警
alerts = check_alert('covid_data.csv')
if alerts:
# 发送预警通知
smtp_config = {
'smtp_server': 'smtp.gmail.com',
'port': 587,
'from_email': '[email protected]',
'password': 'your_email_password',
'to_emails': ['[email protected]', '[email protected]']
}
send_alert_notification(alerts, smtp_config)
else:
print("无预警触发")
else:
print("数据解析失败")
else:
print("数据爬取失败")
if __name__ == '__main__':
main()
本项目通过 Python 爬虫技术实现了对全国疫情数据的实时爬取,并利用动态可视化地图直观展示了疫情分布情况。同时,构建了数据预警系统,能够及时发现疫情异常波动并发送通知,为疫情防控提供了有力支持。整个项目涵盖了数据获取、清洗、可视化展示和预警通知等多个环节,形成了完整的疫情数据监测解决方案。