今天在上海东的大数据分析课程时,他介绍了如何利用Python获取新冠疫情的数据,并存储到SQL Server的过程。在先前的寒假预备课中,我们已经爬取过新冠疫情的数据,并存储在Excel中

接下来,回忆一下今天的学习历程。
首先,在Python中创建数据库表:
import pymssql
conn=pymssql.connect('127.0.0.1','sa','123','S071803229')
c=conn.cursor()
c.execute(
'''
IF OBJECT_ID('PYncov2019','U') IS NOT NULL DROP TABLE PYncov2019
CREATE TABLE PYNcov2019
(
ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
COUNTRY NVARCHAR(20),
PROVINCE NVARCHAR(20),
CITY NVARCHAR(20),
CONFIRMS INT,
HEALEDS INT,
DEATHS INT,
REPORTDT DATETIME
)
'''
)
conn.commit()
conn.close()
刚开始执行的时候,一直出现如下错误:(没有及时保存错误信息,只查到一部分 = 0 =)
20009, b'DB-Lib error message 20009, severity 9:\nUnable to connect:……
网上搜索大量信息,查到是因为网络协议没有开启,但是在尝试打开SQL SERVER 2017配置管理器的时候,居然打不开,还出现提示信息:
“无法连接到WMI提供程序,您没有权限或者该服务器无法访问。“
上网百度了一下出现这个错误的原因是一个文件的问题,这个文件的名为 sqlmgmproviderxpsp2up.mof ,查看一下是否存在这个文件,如果存在就去用cmd命令更新一下。WMI(Windows Management Instrumentation, Windows 管理规范)是一项核心的 Windows 管理技术;用户可以使用 WMI 管理本地和远程计算机。我想,之所以打不开配置管理器是对文件做了修改。
(原文链接:https://blog.csdn.net/zhou2s_101216/article/details/43939509)
于是乎, 以管理员身份运行“命令提示符”(在附件下面),进入后执行以下命令
1)cd /d C:\Program Files\Microsoft SQL Server\90\Shared
2)mofcomp "C:\Program Files\Microsoft SQL Server\90\Shared\sqlmgmproviderxpsp2up.mof"
(原文链接:https://blog.csdn.net/zhou2s_101216/article/details/43939509)
但是一直提示出错。于是猜想文件目录与我的不一致,所以把90改为140,在Program Files后加了(x86)(不清楚为什么会在x86里 - 。 -),最后得到成功。
再然后,打开配置管理器,居然发现配置管理器里面没有MSSQLSERVER的协议?(图片来自https://blog.csdn.net/asd051377305/article/details/77926638)

继续查找百度,得到的结论是组件没有安装完整。突然想到,之前海东老师在解决我的SQL SERVER SSIS 无法使用的问题时,尝试各种方法无法解决,于是乎安装了SSMS2017版,其他组件没有安装。由此想到,是否因为由此原因导致配置管理器没有协议?于是安装了SQL SERVER的完整组件(当然按照的要求去掉了一些不必要的组件),最后协议也出现了,启动后重启ssms,第一部分:创建数据库表就得到了解决。
第二部分,利用insert into将获取到的数据添加到指定的MS SQL SERVER的数据库表中。
import requests
import json
import openpyxl
import datetime
import time
Get_China=r"https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5"
class item:
def __init__(self):
self.country=list()#国家
self.province = list()#省份
self.area=list()#地区
self.confirm=list()#确诊
self.suspect=list()#疑似
self.heal=list()#治愈
self.dead=list()#死亡
Data_Box=item()#数据盒子
def GetHtmlText(url):
try:
res = requests.get(url,timeout = 30)
res.raise_for_status()
res.encoding = res.apparent_encoding
return res.text
except:
return "Error"
#获取Json
China = GetHtmlText(Get_China)
# print(China)
City_Count_json = json.loads(China)
City_Count_json = City_Count_json["data"]#将json数据中的data字段的数据提取处理
City_Count_json = json.loads(City_Count_json)#将提取出的字符串转换为json数据
#获取每日总信息
lastUpdateTime = City_Count_json["lastUpdateTime"]
chinaTotal_json = City_Count_json["chinaTotal"]#提取处其chinaTotal字段中的数据
confirmCount = str(chinaTotal_json["confirm"])
suspectCount = str(chinaTotal_json["suspect"])
deadCount = str(chinaTotal_json["dead"]) #GetTextCenter(China,r"\"deadCount\": ",r",\n") #疑似人数
cure = str(chinaTotal_json["heal"]) #GetTextCenter(China,r"\"cure\": ",r"\n") #治愈人数
print("更新时间:" + lastUpdateTime + "\n" + "确诊人数为:" + confirmCount + "人\n" + "死亡人数为:" +
deadCount + "人\n" + "疑似人数为:" + suspectCount + "人\n" + "治愈人数为:" + cure +
"人\n" )
######用于循环中备注信息,防止混淆变量名而出错,然而还是耗费了相当长的时间理清这些变量
#areaTree_json[i]["children"]省份
#areaTree_json[i]["children"][j]["name"]省份名
#areaTree_json[i]["children"][j]["children"][n]省份中的地区 list
#areaTree_json[i]["children"][j]["children"][n]省份中的地区 json
#areaTree_json[i]["children"][j]["children"][n]["name"]省份中的地区名
#areaTree_json[i]["children"][j]["children"][n]["total"]省份中的地区数据json {'confirm': 134, 'suspect': 0, 'dead': 0, 'heal': 4}
areaTree_json=City_Count_json["areaTree"]#包含国家、省份、地区的所有信息,且国家为首索引
def Get_Data_China():
country_len = len(areaTree_json)
for i in range(0,country_len):
if(areaTree_json[i]["name"]=="中国"): #如果为中国则说明具有省份信息
province_len = len(areaTree_json[i]["children"]) #获取省份长度
for j in range(0,province_len):
area_len=len(areaTree_json[i]["children"][j]["children"])#获取地区长度
for n in range(0,area_len):
total=areaTree_json[i]["children"][j]["children"][n]["total"] #获取地区的总体疫情情况+
Data_Box.country.append("中国")
Data_Box.province.append(areaTree_json[i]["children"][j]["name"])
Data_Box.area.append(areaTree_json[i]["children"][j]["children"][n]["name"])
Data_Box.confirm.append(total["confirm"])
Data_Box.dead.append(total["dead"])
Data_Box.heal.append(total["heal"]) #中国区域获取完毕
else:#外国区域
name=areaTree_json[i]["name"]
total=areaTree_json[i]["total"]
Data_Box.country.append(name)
Data_Box.province.append(name)
Data_Box.area.append(name)
Data_Box.confirm.append(total["confirm"])
Data_Box.suspect.append(total["suspect"])
Data_Box.dead.append(total["dead"])
Data_Box.heal.append(total["heal"]) #外国区域获取完毕
return len(Data_Box.area)
length=Get_Data_China()#获取信息并获取长度
# fmtsdate = datetime.date.today().strftime('%Y%m%d')
# fmtstime = time.strftime('%H:%M:%S')
#将数据库添加到MS SQL SERVER数据库中
import pymssql
conn=pymssql.connect('127.0.0.1','sa','123','S071803229')
c=conn.cursor()
for n in range(0,length):
c.execute(
"INSERT INTO PYNcov2019(COUNTRY,PROVINCE,CITY,CONFIRMS,HEALEDS,DEATHS,REPORTDT) values(%s,%s,%s,%d,%d,%d,%s)",(Data_Box.country[n],Data_Box.province[n],Data_Box.area[n],Data_Box.confirm[n],Data_Box.heal[n],Data_Box.dead[n],lastUpdateTime)
)
conn.commit()
conn.close()
期间出现了粗心的错误,例如在lastUpDateTime前面加上了Data_Box,显然是不对的,它并不属于Data_Box这个盒子的item。种种错误排除之后,数据也成功导入sql server。

最后一部分,使用dataframe.to_sql 方法进行数据添加。这部分也是顺水推舟,但是其中在安装sqlalchemy库的时候,出现安装不了的问题。原因是我的pip.ini文件中的https写成了http,系统认为是不安全的网站,修改完之后也成功安装,种种错误排除之后,成功导入数据到sql。
import requests
import json
import openpyxl
Get_China=r"https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5"
class item:
def __init__(self):
self.country=list()#国家
self.province = list()#省份
self.area=list()#地区
self.confirm=list()#确诊
self.suspect=list()#疑似
self.heal=list()#治愈
self.dead=list()#死亡
Data_Box=item()#数据盒子
def GetHtmlText(url):
try:
res = requests.get(url,timeout = 30)
res.raise_for_status()
res.encoding = res.apparent_encoding
return res.text
except:
return "Error"
#获取Json
China = GetHtmlText(Get_China)
# print(China)
City_Count_json = json.loads(China)
City_Count_json = City_Count_json["data"]#将json数据中的data字段的数据提取处理
City_Count_json = json.loads(City_Count_json)#将提取出的字符串转换为json数据
#获取每日总信息
lastUpdateTime = City_Count_json["lastUpdateTime"]
chinaTotal_json = City_Count_json["chinaTotal"]#提取处其chinaTotal字段中的数据
confirmCount = str(chinaTotal_json["confirm"])
suspectCount = str(chinaTotal_json["suspect"])
deadCount = str(chinaTotal_json["dead"]) #GetTextCenter(China,r"\"deadCount\": ",r",\n") #疑似人数
cure = str(chinaTotal_json["heal"]) #GetTextCenter(China,r"\"cure\": ",r"\n") #治愈人数
print("更新时间:" + lastUpdateTime + "\n" + "确诊人数为:" + confirmCount + "人\n" + "死亡人数为:" +
deadCount + "人\n" + "疑似人数为:" + suspectCount + "人\n" + "治愈人数为:" + cure +
"人\n" )
######用于循环中备注信息,防止混淆变量名而出错,然而还是耗费了相当长的时间理清这些变量
#areaTree_json[i]["children"]省份
#areaTree_json[i]["children"][j]["name"]省份名
#areaTree_json[i]["children"][j]["children"][n]省份中的地区 list
#areaTree_json[i]["children"][j]["children"][n]省份中的地区 json
#areaTree_json[i]["children"][j]["children"][n]["name"]省份中的地区名
#areaTree_json[i]["children"][j]["children"][n]["total"]省份中的地区数据json {'confirm': 134, 'suspect': 0, 'dead': 0, 'heal': 4}
areaTree_json=City_Count_json["areaTree"]#包含国家、省份、地区的所有信息,且国家为首索引
def Get_Data_China():
country_len = len(areaTree_json)
for i in range(0,country_len):
if(areaTree_json[i]["name"]=="中国"): #如果为中国则说明具有省份信息
province_len = len(areaTree_json[i]["children"]) #获取省份长度
for j in range(0,province_len):
area_len=len(areaTree_json[i]["children"][j]["children"])#获取地区长度
for n in range(0,area_len):
total=areaTree_json[i]["children"][j]["children"][n]["total"] #获取地区的总体疫情情况+
Data_Box.country.append("中国")
Data_Box.province.append(areaTree_json[i]["children"][j]["name"])
Data_Box.area.append(areaTree_json[i]["children"][j]["children"][n]["name"])
Data_Box.confirm.append(total["confirm"])
Data_Box.dead.append(total["dead"])
Data_Box.heal.append(total["heal"]) #中国区域获取完毕
else:#外国区域
name=areaTree_json[i]["name"]
total=areaTree_json[i]["total"]
Data_Box.country.append(name)
Data_Box.province.append(name)
Data_Box.area.append(name)
Data_Box.confirm.append(total["confirm"])
Data_Box.suspect.append(total["suspect"])
Data_Box.dead.append(total["dead"])
Data_Box.heal.append(total["heal"]) #外国区域获取完毕
return len(Data_Box.area)
length=Get_Data_China()#获取信息并获取长度
#将数据存放在列表中
ncov2019list=[]
for n in range(0,length):
ncov2019list.append((Data_Box.country[n],Data_Box.province[n],Data_Box.area[n],Data_Box.confirm[n],Data_Box.heal[n],Data_Box.dead[n],lastUpdateTime))
from pandas import DataFrame,Series
import pymssql
from sqlalchemy import create_engine
conn=pymssql.connect('127.0.0.1','sa','123','S071803229')
engine=create_engine('mssql+pymssql://sa:123@127.0.0.1/S071803229')
ncov2019df=DataFrame(ncov2019list,columns=['COUNTRY','PROVINCE','CITY','CONFIRMS','HEALEDS','DEATHS','REPORTDT'])
ncov2019df.to_sql('PYNcov2019',engine,if_exists='replace',index=False)
#成功导入
写在最后:今天是很复杂的一天。早上起晚了,查到六级成绩只差4分就过线之后,心情异常复杂。。。因为没有带够笔芯,翻译题没做,导致丢掉至少六七十分,非常遗憾;另外,我翻译题没做也能差一点点过线,说明我还是有点实力在的?这学期要好好学英语了!今天还帮助了同学解决她们的代码问题。虽然解决情况不尽人意= =但是还是尽到了自己的能力责任(?)加油加油,努力努力,冲冲冲!
来源:https://www.cnblogs.com/Sycblog/p/12346596.html