Python 爬虫实战:全国疫情数据实时爬取(动态可视化地图 + 数据预警)

一、项目概述

在疫情防控常态化的背景下,实时掌握全国疫情数据对于政府决策、医疗资源调配以及公众信息获取具有重要意义。本项目旨在通过 Python 爬虫技术,实时抓取全国疫情数据,并利用动态可视化地图直观展示疫情分布情况,同时构建数据预警系统,及时发现疫情异常波动,为疫情防控提供有力支持。

二、环境搭建与技术选型

(一)Python 环境配置

建议使用 Python 3.8+ 版本,并安装以下开发工具和库:

  1. 开发环境:PyCharm 或 VSCode,提供良好的代码编辑和调试功能。
  2. 依赖库:requests、json、csv、pandas、matplotlib、pyecharts、flask。

(二)技术选型及依赖库安装

  1. requests:用于发送 HTTP 请求,获取网页数据。
  2. pandas:强大的数据分析工具,方便对爬取的数据进行清洗和预处理。
  3. matplotlib:可视化展示疫情趋势图和统计图表。
  4. pyecharts:基于 Echarts 的 Python 库,用于绘制动态可视化地图。
  5. flask:轻量级 Web 框架,用于搭建数据展示平台。

使用 pip 命令安装所需库:

pip install requests pandas matplotlib pyecharts flask

三、疫情数据爬取

(一)目标页面分析

目标数据来源于腾讯新闻疫情接口,该接口以 JSON 格式返回全国各省市的疫情数据,包括累计确诊、现存确诊、死亡人数等关键指标。由于数据是通过异步请求加载的,需要通过网络抓包获取实际的请求 URL。

(二)爬虫代码实现

1. 发送请求

构造请求头,模拟浏览器行为,向目标 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
2. 数据解析

将获取到的 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
3. 数据提取与更新

从解析后的数据中提取关键信息,并将其存储到 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("疫情动态地图已生成")

五、数据预警系统

(一)预警规则设定

根据疫情数据的变化情况,设定以下预警规则:

  1. 单日新增确诊超过阈值:如果某省单日新增确诊超过设定的阈值(如 100 人),触发预警。
  2. 连续多日增长趋势:如果某省连续 3 天新增确诊呈上升趋势,触发预警。
  3. 累计确诊显著增加:如果某省累计确诊人数在短时间内显著增加(如增长超过 20%),触发预警。

(二)预警逻辑实现

通过对比历史数据和当前数据,实现预警逻辑。

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 爬虫技术实现了对全国疫情数据的实时爬取,并利用动态可视化地图直观展示了疫情分布情况。同时,构建了数据预警系统,能够及时发现疫情异常波动并发送通知,为疫情防控提供了有力支持。整个项目涵盖了数据获取、清洗、可视化展示和预警通知等多个环节,形成了完整的疫情数据监测解决方案。

(二)项目拓展方向

  1. 多数据源整合:整合更多权威疫情数据源,如国家卫健委、世界卫生组织等,丰富数据维度,提升分析准确性。
  2. 高级分析模型:引入机器学习算法,构建疫情发展趋势预测模型,提前预警潜在疫情风险。
  3. 移动应用开发:开发移动端应用,方便用户随时随地查看疫情动态和预警信息。
  4. 交互式数据查询:在 Web 展示平台上增加交互式查询功能,允许用户自定义查询条件,获取更精准的疫情数据。
  5. 数据更新优化:优化数据更新机制,实现数据的定时自动更新,确保展示信息的实时性和准确性。

Python 爬虫实战:全国疫情数据实时爬取(动态可视化地图 + 数据预警)_第1张图片

你可能感兴趣的:(python爬虫实战,python,爬虫,开发语言)