修改数据接口为腾讯疫情数据接口

This commit is contained in:
lzh
2021-08-01 17:49:19 +08:00
parent 8b59f380d9
commit 04e3ecba16
10 changed files with 715 additions and 216 deletions
@@ -1,78 +1,81 @@
from flask import Flask
from flask import render_template
from flask import jsonify
import time
from flask import Flask
from flask import jsonify
from flask import render_template
import utils
app = Flask(__name__)
#工具类,初始化参数为数据库名,数据库表名,数据库账号,数据库密码
u=utils.utils("myspider","epidemic","root","123456")
# 工具类,初始化参数为数据库名,数据库表名,数据库账号,数据库密码
u = utils.utils("myspider", "root", "123456")
@app.route('/')
def hello_world():
return render_template("main.html")
@app.route('/time')
def get_time():
time_str=time.strftime("%Y{}%m{}%d{}%X")
return time_str.format("","","")
time_str = time.strftime("%Y{}%m{}%d{}%X")
return time_str.format("", "", "")
@app.route('/c1')
def get_c1_data():
data=u.get_c1_data()
data = u.get_c1_data()
print(data)
return jsonify({"dignose":data[0],"heal":data[1],"dead":data[2],"newly_add":data[3]})
return jsonify({"dignose": data[0], "heal": data[1], "dead": data[2], "newly_add": data[3]})
@app.route('/c2')
def get_c2_data():
res=[]
data=u.get_c2_data()
for key,value in data.items():
res.append({"name":key,"value":value})
return jsonify({"data":res})
res = []
data = u.get_c2_data()
for key, value in data.items():
res.append({"name": key, "value": value})
return jsonify({"data": res})
@app.route('/l1')
def get_l1_data():
data = u.get_l1_data()
day = data.date.tolist()
dignose = data.confirm.tolist()
heal = data.heal.tolist()
dead = data.dead.tolist()
return jsonify({"days": day, "dignose": dignose, "heal": heal, "dead": dead})
data=u.get_l1_data()
day = []
for d in data.index:
day.append(d.strftime("%m-%d"))
print(day)
dignose=data.确诊.tolist()
heal=data.治愈.tolist()
dead=data.死亡.tolist()
return jsonify({"days":day,"dignose":dignose,"heal":heal,"dead":dead})
@app.route('/l2')
def get_l2_data():
data = u.get_l2_data()
day = []
for d in data.index:
day.append(d.strftime("%m-%d"))
dignose=data.确诊.tolist()
heal=data.治愈.tolist()
dead=u.get_l1_data().新增死亡.tolist()
return jsonify({"days":day,"dignose":dignose,"heal":heal,"dead":dead})
day = data.date.tolist()
dignose = data.confirm.tolist()
heal = data.heal.tolist()
dead = data.dead.tolist()
return jsonify({"days": day, "dignose": dignose, "heal": heal, "dead": dead})
@app.route('/r1')
def get_r1_data():
data=u.get_r1_data()
keys=list(data.keys())
values=list(data.values())
print(keys,values)
return jsonify({"keys":keys,"values":values})
data = u.get_r1_data()
keys = data.疫情地区.tolist()
values = data.确诊.tolist()
return jsonify({"keys": keys, "values": values})
@app.route('/r2')
def get_r2_data():
res=[]
myutil=utils.utils("myspider","world_epidemic","root","123456")
data=myutil.get_r2_data()
for key, value in data.items():
res = []
data = u.get_r2_data()
for key, value in zip(data.name,data.确诊):
res.append({"name": key, "value": value})
#还需要添加中国的总数据
china=int(u.get_c1_data()[0])
res.append({"name":"China","value":china})
# 还需要添加中国的总数据
china = int(u.get_c1_data()[0])
res.append({"name": "China", "value": china})
return jsonify({"data": res})
@@ -1,57 +1,135 @@
import requests
# -*- coding: utf-8 -*-
# @Time :2021/7/30 23:34
# @Author :lzh
# @File : new_spider.py
# @Software: PyCharm
import datetime
import pandas as pd
import json
import requests
from sqlalchemy import create_engine
url='https://voice.baidu.com/newpneumonia/get?target=trend&isCaseIn=0&stage=publish&callback=jsonp_1593074577909_83653'
r=requests.get(url).text
from translate import COUNTRIES_CH_EN_DICT
#标准化字符串为json格式
r=r.replace("jsonp_1593074577909_83653(","")
r=r[0:-2]
r=json.loads(r)
names=[]
dates=[]
dignose=[]
heal=[]
dead=[]
add=[]
#遍历每个地点
for place in r['data']:
# print(place['name'])
length=len(place['trend']['updateDate'])
place_name=(place['name'] for i in range(length))
names.extend(place_name)
#获取日期数据
dates.extend(place['trend']['updateDate'])
for trend in place['trend']['list']:
if(trend['name']=='确诊'):
dignose.extend(trend['data'])
if(trend['name']=='治愈'):
heal.extend(trend['data'])
if(trend['name']=='死亡'):
dead.extend(trend['data'])
if(trend['name']=='新增确诊'):
add.extend(trend['data'])
def traslate(word):
'''
将世界各国的中文名转化为英文
'''
return COUNTRIES_CH_EN_DICT.get(word, "未知地区")
#新增确诊数据如果存在缺失值,则将缺失值填充为0
diff=len(names)-len(add)
if(diff!=0):
add=add+[0 for i in range(diff)]
print(len(names),len(dates),len(dignose),len(heal),len(dead),len(add))
# 将数据保存至数据库中
df=pd.DataFrame({
"疫情地区":names,
"日期":dates,
"确诊":dignose,
"治愈":heal,
"死亡":dead,
"新增死亡":add
})
df['日期']=['2020.'+i for i in df['日期']]
df['日期']=df['日期'].str.replace(".","-")
df['日期']=pd.to_datetime(df['日期'])
conn = create_engine('mysql://root:123456@localhost:3306/myspider?charset=utf8')
pd.io.sql.to_sql(df,'epidemic',con=conn,if_exists = 'replace',index=None)
# %%
def save_data(df, table_name, if_exists="append", need_translate=False):
if need_translate:
df['name'] = df['疫情地区'].apply(traslate)
conn = create_engine('mysql://root:123456@localhost:3306/myspider?charset=utf8')
pd.io.sql.to_sql(df, table_name, con=conn, if_exists=if_exists, index=None)
def crawl_china_data():
url = "https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=chinaDayList,chinaDayAddList,nowConfirmStatis,provinceCompare"
data = requests.get(url)
data = data.json().get("data", {})
provinceCompare = data.get("provinceCompare") # 每个省份的总数据(每日更新)
chinaDayList = data.get("chinaDayList") # 最近一个月的全国疫情的总数据
chinaDayAddList = data.get("chinaDayAddList") # 最近一个月的全国疫情的新增数据
return provinceCompare, chinaDayList, chinaDayAddList
# %%
def crawl_countries_data():
url = "https://api.inews.qq.com/newsqa/v1/automation/modules/list?modules=FAutoforeignList"
data = requests.get(url)
data = data.json().get("data")
foreignList = data.get("FAutoforeignList", [])
return foreignList
def parse_china_daily_data(day_list, day_add_list):
"""
解析每日新增、每日累计数据
:param api_rtn_data:
:return:
"""
day_df = pd.DataFrame(day_list)
day_df["date"] = pd.to_datetime(day_df["y"] + "." + day_df["date"])
day_add_df = pd.DataFrame(day_add_list)
day_add_df["date"] = pd.to_datetime(day_add_df["y"] + "." + day_add_df["date"])
save_data(day_df, "china_day", "append")
save_data(day_add_df, "china_day_add", "append")
def parse_countries_total_data(api_rtn_data):
"""
解析每个省份的新增数据
:param api_rtn_data:
:return:
"""
dates = []
countries = []
dignose = []
heal = []
dead = []
add = []
for country in api_rtn_data:
countries.append(country.get("name", ""))
month, day = country.get("date").split(".")
month = month if "0" not in month else month[-1]
date = datetime.date(int(country.get("y")), int(month), int(day))
dates.append(date)
dignose.append(country.get("nowConfirm", 0))
heal.append(country.get("heal", 0))
dead.append(country.get("dead", 0))
add.append(country.get("confirmAdd", 0))
df = pd.DataFrame({
"疫情地区": countries,
"日期": dates,
"确诊": dignose,
"治愈": heal,
"死亡": dead,
"新增死亡": add
})
save_data(df, "world_epidemic", "replace", True)
return df
def parse_provinces_total_data(api_rtn_data):
dates = []
provinces = []
dignose = []
heal = []
dead = []
add = []
for province, total_data in api_rtn_data.items():
provinces.append(province)
date = datetime.datetime.now()
dates.append(date)
dignose.append(total_data.get("nowConfirm", 0))
heal.append(total_data.get("heal", 0))
dead.append(total_data.get("dead", 0))
add.append(total_data.get("confirmAdd", 0))
df = pd.DataFrame({
"疫情地区": provinces,
"日期": dates,
"确诊": dignose,
"治愈": heal,
"死亡": dead,
"新增死亡": add
})
save_data(df, 'china_total_epidemic')
return df
# %%
def main():
provinceCompare, chinaDayList, chinaDayAddList = crawl_china_data()
parse_china_daily_data(chinaDayList, chinaDayAddList)
parse_provinces_total_data(provinceCompare)
parse_countries_total_data(crawl_countries_data())
if __name__ == '__main__':
main()
print("爬取完成")
@@ -49,7 +49,7 @@ body{
}
#l1{
position: absolute;
width: 30%;
width: 25%;
height: 45%;
top: 10%;
left: 0%;
@@ -57,7 +57,7 @@ body{
}
#l2{
position: absolute;
width: 30%;
width: 25%;
height: 45%;
top: 55%;
left: 0%;
@@ -81,7 +81,7 @@ body{
}
#r1{
position: absolute;
width: 30%;
width: 35%;
height: 45%;
top: 10%;
right: 0%;
@@ -89,7 +89,7 @@ body{
}
#r2{
position: absolute;
width: 30%;
width: 35%;
height: 45%;
top: 55%;
right: 0%;
@@ -81,7 +81,7 @@ function get_r1_data(){
url:"/r1",
timeout:10000,
success:function (data) {
ec_right1_option.xAxis.data=data.keys
ec_right1_option.xAxis[0].data=data.keys
ec_right1_option.series[0].data=data.values
ec_right1.setOption(ec_right1_option)
},
@@ -114,4 +114,4 @@ get_l1_data()
get_l2_data()
get_r1_data()
get_r2_data()
setInterval(gettime,1000)
// setInterval(gettime,100000)
@@ -21,7 +21,7 @@ var ec_center_option = {
color: ['#e0ffff', '#9D3030']
},
show:true,
splitList:[{start:1,end:9},
splitList:[{start:0,end:9},
{start:10,end:99},
{start:100,end:999},
{start:1000,end:9999},
@@ -1,24 +1,46 @@
var ec_right1=echarts.init(document.getElementById("r1"),"dark")
var ec_right1 = echarts.init(document.getElementById("r1"), "dark")
var ec_right1_option = {
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
title: {
text: '非湖北地区确诊人数top5',
text: '全球地区确诊人数top5',
left: "left"
},
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
yAxis: {
type: 'value'
},
series: [{
data: [120, 200, 150, 80, 70, 110, 130],
type: 'bar',
showBackground: true,
backgroundStyle: {
color: 'rgba(220, 220, 220, 0.8)'
xAxis: [
{
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
axisTick: {
alignWithLabel: true
}
}
}]
],
yAxis: [
{
type: 'value'
}
],
series: [
{
name: '确诊数量',
type: 'bar',
barWidth: '60%',
data: [10, 52, 200, 334, 390, 330, 220]
}
]
};
ec_right1.setOption(ec_right1_option)
@@ -23,12 +23,12 @@
<div class="txt"><h2>累计确诊</h2></div>
<div class="txt"><h2>累计治愈</h2></div>
<div class="txt"><h2>累计死亡</h2></div>
<div class="txt"><h2>新增死亡</h2></div>
<div class="txt"><h2>现存确诊</h2></div>
</div>
<div id="c2">我是中2</div>
<div id="r1">我是右1</div>
<div id="r2">我是右2</div>
<div id="c2">大屏中间第二幅图——中国疫情地图</div>
<div id="r1">大屏右侧第一幅图——全球确诊top5国家</div>
<div id="r2">大屏中间第二幅图——世界疫情地图</div>
<script src="../static/js/ec_c2.js"></script>
<script src="../static/js/controller.js"></script>
<script src="../static/js/ec_l1.js"></script>
@@ -1,21 +0,0 @@
from pyecharts import Bar
# from snapshot_selenium import snapshot
# from pyecharts.render import make_snapshot
columns = ['大大的三个字', '这里一共是十个字的吧', '这里一共是十个字的吧(这里是七个字)', '其他', '十全十美的十个字啊', 'python仪表盘', '快乐三个字', '可乐续保三个字', '骑缝三个字',
'里面好玩三个字', '信用卡三个字', '没空理我的', '订单问问三个字', '紫金学习三个字', '袋鼠妈妈三个字', '楼面价微信交流群', '密码三个字', '看见了来看看了解是是是',
'大门口流量数据', '烤面筋解决三个字', '到读到蓝莓味']
# # 设置数据
data1 = [841, 0, 136, 0, 3317, 784, 1, 19, 691, 131, 21, 6461, 123, 0, 692, 0, 0, 0, 0, 0, 0]
data2 = [13056, 16614, 701, 0, 5815, 4274, 256, 689, 13838, 21723, 0, 16073, 28297, 0, 279, 463, 25261, 60400, 0, 2493,
16]
# # 设置柱状图的主标题与副标题
bar = Bar("这里是大标题", "这里上介绍文字",width=1200,height=600)
# # 添加柱状图的数据及配置项
def label_formatter(params):
return str(params.value)+"\t\t"
bar.add("外网", columns, data1, bar_category_gap='10%',label_formatter=label_formatter,xaxis_label_textsize=6,grid_bottom=500,label_text_size=8,is_label_show=True,xaxis_rotate=30)
bar.add("内网", columns, data2,bar_category_gap='10%',label_formatter=label_formatter,xaxis_label_textsize=6,grid_bottom=500,label_text_size=8,is_label_show=True, xaxis_rotate=30)
print(help(bar))
# # 生成本地文件(默认为.html文件)
bar.render('tesss.jpg')
# make_snapshot(snapshot, bar.render(), "003_Options配置项_自定义样式_保存图片.png")
@@ -0,0 +1,434 @@
COUNTRIES_EN_CH_DICT = {
"Somalia": "索马里",
"Liechtenstein": "列支敦士登",
"Morocco": "摩洛哥",
"W. Sahara": "西撒哈拉",
"Serbia": "塞尔维亚",
"Afghanistan": "阿富汗",
"Angola": "安哥拉",
"Albania": "阿尔巴尼亚",
"Andorra": "安道尔共和国",
"United Arab Emirates": "阿拉伯联合酋长国",
"Argentina": "阿根廷",
"Armenia": "亚美尼亚",
"Australia": "澳大利亚",
"Austria": "奥地利",
"Azerbaijan": "阿塞拜疆",
"Burundi": "布隆迪",
"Belgium": "比利时",
"Benin": "贝宁",
"Burkina Faso": "布基纳法索",
"Bangladesh": "孟加拉国",
"Bulgaria": "保加利亚",
"Bahrain": "巴林",
"Bahamas": "巴哈马",
"Bosnia and Herz.": "波斯尼亚和黑塞哥维那",
"Belarus": "白俄罗斯",
"Belize": "伯利兹",
"Bermuda": "百慕大",
"Bolivia": "玻利维亚",
"Brazil": "巴西",
"Barbados": "巴巴多斯",
"Brunei": "文莱",
"Bhutan": "不丹",
"Botswana": "博茨瓦纳",
"Central African Rep.": "中非",
"Canada": "加拿大",
"Switzerland": "瑞士",
"Chile": "智利",
"China": "中国",
"Côte dIvoire": "科特迪瓦",
"Cameroon": "喀麦隆",
"Dem. Rep. Congo": "刚果民主共和国",
"Congo": "刚果",
"Colombia": "哥伦比亚",
"Cape Verde": "佛得角",
"Costa Rica": "哥斯达黎加",
"Cuba": "古巴",
"N. Cyprus": "北塞浦路斯",
"Cyprus": "塞浦路斯",
"Czech Rep.": "捷克",
"Germany": "德国",
"Djibouti": "吉布提",
"Denmark": "丹麦",
"Dominican Rep.": "多米尼加",
"Algeria": "阿尔及利亚",
"Ecuador": "厄瓜多尔",
"Egypt": "埃及",
"Eritrea": "厄立特里亚",
"Spain": "西班牙",
"Estonia": "爱沙尼亚",
"Ethiopia": "埃塞俄比亚",
"Finland": "芬兰",
"Fiji": "斐济",
"France": "法国",
"Gabon": "加蓬",
"United Kingdom": "英国",
"Georgia": "格鲁吉亚",
"Ghana": "加纳",
"Guinea": "几内亚",
"Gambia": "冈比亚",
"Guinea-Bissau": "几内亚比绍",
"Eq. Guinea": "赤道几内亚",
"Greece": "希腊",
"Grenada": "格林纳达",
"Greenland": "格陵兰",
"Guatemala": "危地马拉",
"Guam": "关岛",
"Guyana": "圭亚那",
"Honduras": "洪都拉斯",
"Croatia": "克罗地亚",
"Haiti": "海地",
"Hungary": "匈牙利",
"Indonesia": "印度尼西亚",
"India": "印度",
"Br. Indian Ocean Ter.": "英属印度洋领土",
"Ireland": "爱尔兰",
"Iran": "伊朗",
"Iraq": "伊拉克",
"Iceland": "冰岛",
"Israel": "以色列",
"Italy": "意大利",
"Jamaica": "牙买加",
"Jordan": "约旦",
"Japan": "日本",
"Siachen Glacier": "锡亚琴冰川",
"Kazakhstan": "哈萨克斯坦",
"Kenya": "肯尼亚",
"Kyrgyzstan": "吉尔吉斯坦",
"Cambodia": "柬埔寨",
"Korea": "韩国",
"Kuwait": "科威特",
"Lao PDR": "老挝",
"Lebanon": "黎巴嫩",
"Liberia": "利比里亚",
"Libya": "利比亚",
"Sri Lanka": "斯里兰卡",
"Lesotho": "莱索托",
"Lithuania": "立陶宛",
"Luxembourg": "卢森堡",
"Latvia": "拉脱维亚",
"Moldova": "摩尔多瓦",
"Madagascar": "马达加斯加",
"Mexico": "墨西哥",
"Macedonia": "马其顿",
"Mali": "马里",
"Malta": "马耳他",
"Myanmar": "缅甸",
"Montenegro": "黑山",
"Mongolia": "蒙古",
"Mozambique": "莫桑比克",
"Mauritania": "毛里塔尼亚",
"Mauritius": "毛里求斯",
"Malawi": "马拉维",
"Malaysia": "马来西亚",
"Namibia": "纳米比亚",
"New Caledonia": "新喀里多尼亚",
"Niger": "尼日尔",
"Nigeria": "尼日利亚",
"Nicaragua": "尼加拉瓜",
"Netherlands": "荷兰",
"Norway": "挪威",
"Nepal": "尼泊尔",
"New Zealand": "新西兰",
"Oman": "阿曼",
"Pakistan": "巴基斯坦",
"Panama": "巴拿马",
"Peru": "秘鲁",
"Philippines": "菲律宾",
"Papua New Guinea": "巴布亚新几内亚",
"Poland": "波兰",
"Puerto Rico": "波多黎各",
"Dem. Rep. Korea": "朝鲜",
"Portugal": "葡萄牙",
"Paraguay": "巴拉圭",
"Palestine": "巴勒斯坦",
"Qatar": "卡塔尔",
"Romania": "罗马尼亚",
"Russia": "俄罗斯",
"Rwanda": "卢旺达",
"Saudi Arabia": "沙特阿拉伯",
"Sudan": "苏丹",
"S. Sudan": "南苏丹",
"Senegal": "塞内加尔",
"Singapore": "新加坡",
"Solomon Is.": "所罗门群岛",
"Sierra Leone": "塞拉利昂",
"El Salvador": "萨尔瓦多",
"Suriname": "苏里南",
"Slovakia": "斯洛伐克",
"Slovenia": "斯洛文尼亚",
"Sweden": "瑞典",
"Swaziland": "斯威士兰",
"Seychelles": "塞舌尔",
"Syria": "叙利亚",
"Chad": "乍得",
"Togo": "多哥",
"Thailand": "泰国",
"Tajikistan": "塔吉克斯坦",
"Turkmenistan": "土库曼斯坦",
"Timor-Leste": "东帝汶",
"Tonga": "汤加",
"Trinidad and Tobago": "特立尼达和多巴哥",
"Tunisia": "突尼斯",
"Turkey": "土耳其",
"Tanzania": "坦桑尼亚",
"Uganda": "乌干达",
"Ukraine": "乌克兰",
"Uruguay": "乌拉圭",
"United States": "美国",
"Uzbekistan": "乌兹别克斯坦",
"Venezuela": "委内瑞拉",
"Vietnam": "越南",
"Vanuatu": "瓦努阿图",
"Yemen": "也门",
"South Africa": "南非",
"Zambia": "赞比亚",
"Zimbabwe": "津巴布韦",
"Aland": "奥兰群岛",
"American Samoa": "美属萨摩亚",
"Fr. S. Antarctic Lands": "南极洲",
"Antigua and Barb.": "安提瓜和巴布达",
"Comoros": "科摩罗",
"Curaçao": "库拉索岛",
"Cayman Is.": "开曼群岛",
"Dominica": "多米尼加",
"Falkland Is.": "马尔维纳斯群岛(福克兰)",
"Faeroe Is.": "法罗群岛",
"Micronesia": "密克罗尼西亚",
"Heard I. and McDonald Is.": "赫德岛和麦克唐纳群岛",
"Isle of Man": "曼岛",
"Jersey": "泽西岛",
"Kiribati": "基里巴斯",
"Saint Lucia": "圣卢西亚",
"N. Mariana Is.": "北马里亚纳群岛",
"Montserrat": "蒙特塞拉特",
"Niue": "纽埃",
"Palau": "帕劳",
"Fr. Polynesia": "法属波利尼西亚",
"S. Geo. and S. Sandw. Is.": "南乔治亚岛和南桑威奇群岛",
"Saint Helena": "圣赫勒拿",
"St. Pierre and Miquelon": "圣皮埃尔和密克隆群岛",
"São Tomé and Principe": "圣多美和普林西比",
"Turks and Caicos Is.": "特克斯和凯科斯群岛",
"St. Vin. and Gren.": "圣文森特和格林纳丁斯",
"U.S. Virgin Is.": "美属维尔京群岛",
"Samoa": "萨摩亚"
}
# 中文-英文字典
COUNTRIES_CH_EN_DICT = {
"索马里": "Somalia",
"列支敦士登": "Liechtenstein",
"摩洛哥": "Morocco",
"西撒哈拉": "W. Sahara",
"塞尔维亚": "Serbia",
"阿富汗": "Afghanistan",
"安哥拉": "Angola",
"阿尔巴尼亚": "Albania",
"安道尔共和国": "Andorra",
"阿拉伯联合酋长国": "United Arab Emirates",
"阿根廷": "Argentina",
"亚美尼亚": "Armenia",
"澳大利亚": "Australia",
"奥地利": "Austria",
"阿塞拜疆": "Azerbaijan",
"布隆迪": "Burundi",
"比利时": "Belgium",
"贝宁": "Benin",
"布基纳法索": "Burkina Faso",
"孟加拉国": "Bangladesh",
"保加利亚": "Bulgaria",
"巴林": "Bahrain",
"巴哈马": "Bahamas",
"波斯尼亚和黑塞哥维那": "Bosnia and Herz.",
"白俄罗斯": "Belarus",
"伯利兹": "Belize",
"百慕大": "Bermuda",
"玻利维亚": "Bolivia",
"巴西": "Brazil",
"巴巴多斯": "Barbados",
"文莱": "Brunei",
"不丹": "Bhutan",
"博茨瓦纳": "Botswana",
"中非": "Central African Rep.",
"加拿大": "Canada",
"瑞士": "Switzerland",
"智利": "Chile",
"中国": "China",
"科特迪瓦": "Côte dIvoire",
"喀麦隆": "Cameroon",
"刚果民主共和国": "Dem. Rep. Congo",
"刚果": "Congo",
"哥伦比亚": "Colombia",
"佛得角": "Cape Verde",
"哥斯达黎加": "Costa Rica",
"古巴": "Cuba",
"北塞浦路斯": "N. Cyprus",
"塞浦路斯": "Cyprus",
"捷克": "Czech Rep.",
"德国": "Germany",
"吉布提": "Djibouti",
"丹麦": "Denmark",
"多米尼加": "Dominica",
"阿尔及利亚": "Algeria",
"厄瓜多尔": "Ecuador",
"埃及": "Egypt",
"厄立特里亚": "Eritrea",
"西班牙": "Spain",
"爱沙尼亚": "Estonia",
"埃塞俄比亚": "Ethiopia",
"芬兰": "Finland",
"斐济": "Fiji",
"法国": "France",
"加蓬": "Gabon",
"英国": "United Kingdom",
"格鲁吉亚": "Georgia",
"加纳": "Ghana",
"几内亚": "Guinea",
"冈比亚": "Gambia",
"几内亚比绍": "Guinea-Bissau",
"赤道几内亚": "Eq. Guinea",
"希腊": "Greece",
"格林纳达": "Grenada",
"格陵兰": "Greenland",
"危地马拉": "Guatemala",
"关岛": "Guam",
"圭亚那": "Guyana",
"洪都拉斯": "Honduras",
"克罗地亚": "Croatia",
"海地": "Haiti",
"匈牙利": "Hungary",
"印度尼西亚": "Indonesia",
"印度": "India",
"英属印度洋领土": "Br. Indian Ocean Ter.",
"爱尔兰": "Ireland",
"伊朗": "Iran",
"伊拉克": "Iraq",
"冰岛": "Iceland",
"以色列": "Israel",
"意大利": "Italy",
"牙买加": "Jamaica",
"约旦": "Jordan",
"日本": "Japan",
"锡亚琴冰川": "Siachen Glacier",
"哈萨克斯坦": "Kazakhstan",
"肯尼亚": "Kenya",
"吉尔吉斯坦": "Kyrgyzstan",
"柬埔寨": "Cambodia",
"韩国": "Korea",
"科威特": "Kuwait",
"老挝": "Lao PDR",
"黎巴嫩": "Lebanon",
"利比里亚": "Liberia",
"利比亚": "Libya",
"斯里兰卡": "Sri Lanka",
"莱索托": "Lesotho",
"立陶宛": "Lithuania",
"卢森堡": "Luxembourg",
"拉脱维亚": "Latvia",
"摩尔多瓦": "Moldova",
"马达加斯加": "Madagascar",
"墨西哥": "Mexico",
"马其顿": "Macedonia",
"马里": "Mali",
"马耳他": "Malta",
"缅甸": "Myanmar",
"黑山": "Montenegro",
"蒙古": "Mongolia",
"莫桑比克": "Mozambique",
"毛里塔尼亚": "Mauritania",
"毛里求斯": "Mauritius",
"马拉维": "Malawi",
"马来西亚": "Malaysia",
"纳米比亚": "Namibia",
"新喀里多尼亚": "New Caledonia",
"尼日尔": "Niger",
"尼日利亚": "Nigeria",
"尼加拉瓜": "Nicaragua",
"荷兰": "Netherlands",
"挪威": "Norway",
"尼泊尔": "Nepal",
"新西兰": "New Zealand",
"阿曼": "Oman",
"巴基斯坦": "Pakistan",
"巴拿马": "Panama",
"秘鲁": "Peru",
"菲律宾": "Philippines",
"巴布亚新几内亚": "Papua New Guinea",
"波兰": "Poland",
"波多黎各": "Puerto Rico",
"朝鲜": "Dem. Rep. Korea",
"葡萄牙": "Portugal",
"巴拉圭": "Paraguay",
"巴勒斯坦": "Palestine",
"卡塔尔": "Qatar",
"罗马尼亚": "Romania",
"俄罗斯": "Russia",
"卢旺达": "Rwanda",
"沙特阿拉伯": "Saudi Arabia",
"苏丹": "Sudan",
"南苏丹": "S. Sudan",
"塞内加尔": "Senegal",
"新加坡": "Singapore",
"所罗门群岛": "Solomon Is.",
"塞拉利昂": "Sierra Leone",
"萨尔瓦多": "El Salvador",
"苏里南": "Suriname",
"斯洛伐克": "Slovakia",
"斯洛文尼亚": "Slovenia",
"瑞典": "Sweden",
"斯威士兰": "Swaziland",
"塞舌尔": "Seychelles",
"叙利亚": "Syria",
"乍得": "Chad",
"多哥": "Togo",
"泰国": "Thailand",
"塔吉克斯坦": "Tajikistan",
"土库曼斯坦": "Turkmenistan",
"东帝汶": "Timor-Leste",
"汤加": "Tonga",
"特立尼达和多巴哥": "Trinidad and Tobago",
"突尼斯": "Tunisia",
"土耳其": "Turkey",
"坦桑尼亚": "Tanzania",
"乌干达": "Uganda",
"乌克兰": "Ukraine",
"乌拉圭": "Uruguay",
"美国": "United States",
"乌兹别克斯坦": "Uzbekistan",
"委内瑞拉": "Venezuela",
"越南": "Vietnam",
"瓦努阿图": "Vanuatu",
"也门": "Yemen",
"南非": "South Africa",
"赞比亚": "Zambia",
"津巴布韦": "Zimbabwe",
"奥兰群岛": "Aland",
"美属萨摩亚": "American Samoa",
"南极洲": "Fr. S. Antarctic Lands",
"安提瓜和巴布达": "Antigua and Barb.",
"科摩罗": "Comoros",
"库拉索岛": "Curaçao",
"开曼群岛": "Cayman Is.",
"马尔维纳斯群岛(福克兰)": "Falkland Is.",
"法罗群岛": "Faeroe Is.",
"密克罗尼西亚": "Micronesia",
"赫德岛和麦克唐纳群岛": "Heard I. and McDonald Is.",
"曼岛": "Isle of Man",
"泽西岛": "Jersey",
"基里巴斯": "Kiribati",
"圣卢西亚": "Saint Lucia",
"北马里亚纳群岛": "N. Mariana Is.",
"蒙特塞拉特": "Montserrat",
"纽埃": "Niue",
"帕劳": "Palau",
"法属波利尼西亚": "Fr. Polynesia",
"南乔治亚岛和南桑威奇群岛": "S. Geo. and S. Sandw. Is.",
"圣赫勒拿": "Saint Helena",
"圣皮埃尔和密克隆群岛": "St. Pierre and Miquelon",
"圣多美和普林西比": "São Tomé and Principe",
"特克斯和凯科斯群岛": "Turks and Caicos Is.",
"圣文森特和格林纳丁斯": "St. Vin. and Gren.",
"美属维尔京群岛": "U.S. Virgin Is.",
"萨摩亚": "Samoa"
}
@@ -1,70 +1,76 @@
import datetime
import traceback
import pandas as pd
import pymysql
from sqlalchemy import create_engine
import pandas as pd
import datetime
class utils:
def __init__(self,db_name,table_name,user,password):
self.db_name=db_name
self.table_name=table_name
self.user=user
self.password=password
self.data = self.querry()
def __init__(self, db_name, user, password):
self.db_name = db_name
self.user = user
self.password = password
self.data = self.query("epidemic")
def get_conn(self):
'''
:return:连接
'''
#创建连接
conn=pymysql.connect(host="127.0.0.1",port=3306,user=self.user,password=self.password,
db=self.db_name,charset="utf8")
cursor=conn.cursor()
return conn,cursor
# 创建连接
conn = pymysql.connect(host="127.0.0.1", port=3306, user=self.user, password=self.password,
db=self.db_name, charset="utf8")
cursor = conn.cursor()
return conn, cursor
def close_conn(self,conn,cursor):
def close_conn(self, conn, cursor):
cursor.close()
conn.close()
def querry(self):
#使用pandas从数据库中读取疫情数据
conn = create_engine('mysql://{}:{}@localhost:3306/{}?charset=utf8'.format(self.user,self.password,self.db_name))
sql="SELECT * FROM {}".format(self.table_name)
epidemic = pd.read_sql(sql, con=conn)
return epidemic
def query(self, table_name, use_sql=None):
"""
:param sql:
:return:epidemic: DataFrame
"""
# 使用pandas从数据库中读取疫情数据
try:
conn = create_engine('mysql://{}:{}@localhost:3306/{}?charset=utf8'.format(self.user, self.password, self.db_name))
sql = use_sql if use_sql else "select * from {}".format(table_name)
epidemic = pd.read_sql(sql, con=conn)
return epidemic
except Exception as e:
traceback.print_exc(e)
return None
def get_c1_data(self):
'''
获取c1的四个数据:累计确诊、累计治愈、累计死亡、新增死亡
:return:
'''
df=self.data
#获取最新数据
# 由于接口数据只能拿到前一天,因此我们的日期数据应该-1天
t = datetime.datetime.now() + datetime.timedelta(days=-1)
t= t.strftime('%Y-%m-%d')
today = df[df.日期 == t]
dignose=str(today.确诊.sum())
heal=str(today.治愈.sum())
dead=str(today.死亡.sum())
add=str(today.新增死亡.sum())
sql = "select date, confirm, nowConfirm,heal,dead from china_day order by date desc limit 1"
df = self.query("china_day", sql)
confirm = int(df["confirm"][0])
heal = int(df["heal"][0])
dead = int(df["dead"][0])
now_confirm = int(df["nowConfirm"][0])
return [dignose,heal,dead,add]
return [confirm, heal, dead, now_confirm]
def get_c2_data(self):
'''
获取中国各省的疫情数据
:return:
'''
#将地区-确诊人数以键值对的形式保存
dict={}
# 将地区-确诊人数以键值对的形式保存
dict = {}
# 获取最新数据
# 由于接口数据只能拿到前一天,因此我们的日期数据应该-1天
df=self.data
t = datetime.datetime.now() + datetime.timedelta(days=-1)
t = t.strftime('%Y-%m-%d')
today = df[df.日期 == t]
for p,v in zip(today.疫情地区,today.确诊):
dict[p]=v
# 从数据库中获取最近一次更新的数据
sql = "select distinct 疫情地区,日期,确诊 from china_total_epidemic order by 日期 desc limit 34"
df = self.query("china_total_epidemic", sql)
for p, v in zip(df.疫情地区, df.确诊):
dict[p] = v
return dict
def get_l1_data(self):
@@ -72,61 +78,38 @@ class utils:
获取疫情期间每日累计数据
:return:
'''
df=self.data
days=df.groupby("日期").sum()
return days
sql = "select date, confirm, heal,dead from china_day order by date desc"
df = self.query("", sql)
return df
def get_l2_data(self):
'''
获取疫情期间每日新增数据
:return:
'''
df=self.data
days=df.groupby("日期").sum().diff().dropna()
return days
sql = "select date, confirm,heal,dead from china_day_add order by date desc"
df = self.query("",sql)
return df
def get_r1_data(self):
'''
获取除湖北地区确诊人数最多的省份
:return:
'''
dict={}
df=self.data
t = datetime.datetime.now() + datetime.timedelta(days=-1)
t = t.strftime('%Y-%m-%d')
today = df[df.日期 == t]
#按确诊人数排序
today=today.sort_values(by='确诊',ascending=False)[:6]
for key,value in zip(today.疫情地区,today.确诊):
if key=='湖北':
continue
dict[key]=value
return dict
sql = "select 疫情地区,确诊 from world_epidemic order by 日期 desc limit 5"
df = self.query("",sql)
return df
def get_r2_data(self):
'''
获取世界各国的疫情数据
:return:
'''
#将地区-确诊人数以键值对的形式保存
dict={}
# 获取最新数据
# 由于接口数据只能拿到前一天,因此我们的日期数据应该-1天
df=self.data
t = datetime.datetime.now() + datetime.timedelta(days=-1)
t = t.strftime('%Y-%m-%d')
today = df[df.日期 == t]
for p,v in zip(today.name,today.确诊):
dict[p]=v
return dict
df = self.query("world_epidemic")
return df[["name","疫情地区","确诊"]]
if __name__ == "__main__":
u = utils("myspider", "root", "123456")
if __name__=="__main__":
u=utils("myspider","world_epidemic","root","123456")
print(list(u.get_r1_data().values()))
u.get_c1_data()