Python:爬取全国各省疫情数据并在地图显示
阅读原文时间:2023年07月10日阅读:2

代码:

import requests
import pymysql
import json
from pyecharts import options as opts
from pyecharts.charts import Map

def create():

# 连接数据库  
db = pymysql.connect(host = 'localhost', user = 'root', password ='258000', database = 'yiqing',charset='utf8')

# 使用 cursor() 方法创建一个游标对象 cursor  
cursor = db.cursor()

# 使用 execute() 方法执行 SQL,如果表存在则删除  
cursor.execute("DROP TABLE IF EXISTS proyiqing")

# 使用预处理语句创建表  
sql = """CREATE TABLE proyiqing (  
        Id INT PRIMARY KEY AUTO\_INCREMENT,  
        update\_time varCHAR(255),  
        provinse varchar(255),  
        today\_confirm varchar(255),  
        total\_confirm varchar(255),  
        now\_confirm varchar(255),  
        total\_dead varchar(255),  
        total\_heal varchar(255))"""  
#update\_time,provinse,today\_confirm,total\_confirm,now\_confirm,total\_dead,total\_heal  
cursor.execute(sql)

#关闭数据库连接  
db.close()

def insert(value):

# 连接数据库  
db = pymysql.connect(host = 'localhost', user = 'root', password ='258000', database = 'yiqing',charset='utf8')

# 使用 execute() 方法执行 SQL,如果表存在则删除  
cursor = db.cursor()

# 使用预处理语句插入数据  
sql = "INSERT INTO proyiqing(update\_time,provinse,today\_confirm,total\_confirm,now\_confirm,total\_dead,total\_heal) VALUES ( %s,%s,%s,%s,%s,%s,%s)"  
#update\_time,provinse,today\_confirm,total\_confirm,now\_confirm,total\_dead,total\_heal

try:  
    cursor.execute(sql, value)  
    db.commit()  
    print('插入数据成功')  
except:  
    db.rollback()  
    print("插入数据失败")  
db.close()

create() # 创建表

#目标网站
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
headers = {
'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36'
}

#请求资源,获取相应内容
r = requests.get(url, headers)

将响应信息进行json格式化

res = json.loads(r.text)
data = json.loads(res['data'])

#世界疫情
lists = ['截至时间:' + str(data['lastUpdateTime']) + '\n'
'全国确诊人数:' + str(data['chinaTotal']['confirm']) + '\n'
'今日新增确诊:' + str(data['chinaAdd']['confirm']) + '\n'
'全国疑似:' + str(data['chinaTotal']['suspect']) + '\n'
'今日新增疑似:' + str(data['chinaAdd']['suspect']) + '\n'
'全国治愈:' + str(data['chinaTotal']['heal']) + '\n'
'今日新增治愈:' + str(data['chinaAdd']['heal']) + '\n'
'全国死亡:' + str(data['chinaTotal']['dead']) + '\n'
'今日新增死亡:' + str( data['chinaAdd']['dead']) + '\n']
result = ''.join(lists)
with open('疫情查询.txt', 'w+', encoding="utf-8") as f:
f.write(result + '\n')

#更新时间
update_time = data['lastUpdateTime']

#保存全国各省现有确诊数据
province_detals = []
confirm_detals = []

#省份疫情
for pro in data['areaTree'][0]['children']:
provinse = pro["name"] #省名
today_confirm = pro["today"]["confirm"]
total_confirm = pro["total"]["confirm"]
now_confirm = pro["total"]["nowConfirm"]
total_dead = pro["total"]["dead"]
total_heal = pro["total"]["heal"]
province_detals.append(provinse)
confirm_detals.append(now_confirm)
#insert((update_time,provinse,today_confirm,total_confirm,now_confirm,total_dead,total_heal))#存入数据库

#建立一一对应关系
data_zip = zip(province_detals,confirm_detals)
data_list = list(data_zip)

#可视化 matplot 和 pyechart
map = Map(opts.InitOpts(width='1900px',height='800px')).add(series_name="中国疫情分布",
data_pair=data_list,#输入数据
maptype="china",#地图类型
is_map_symbol_show=False#显示标记
)

#不显示国家名称
map.set_series_opts(label_opts=opts.LabelOpts(is_show=False))

#设置全局配置项
map.set_global_opts(title_opts=opts.TitleOpts(title="中国疫情情况"),#设置图标题
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
pieces=[
{"min":1,"max": 10},
{"min": 10, "max": 20},
{"min": 20, "max": 30},
{"min": 30, "max": 40},
{"min": 40, "max": 50},
{"min": 50, "max": 60},
{"min": 60, "max": 70},
{"min": 70, "max": 80},
{"min": 80, "max": 90},
{"min": 90, "max": 100},
{"min": 100}]
)) #显示图例
map.render("中国疫情分布情况.html")

效果: