ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

今日学习笔记:从Pyhton爬取数据,直接储存到SQL Server

2020-02-22 18:57:29  阅读:248  来源: 互联网

标签:Box 爬取 Server Pyhton json areaTree Data children append


  今天在上海东的大数据分析课程时,他介绍了如何利用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分就过线之后,心情异常复杂。。。因为没有带够笔芯,翻译题没做,导致丢掉至少六七十分,非常遗憾;另外,我翻译题没做也能差一点点过线,说明我还是有点实力在的?这学期要好好学英语了!今天还帮助了同学解决她们的代码问题。虽然解决情况不尽人意= =但是还是尽到了自己的能力责任(?)加油加油,努力努力,冲冲冲!

标签:Box,爬取,Server,Pyhton,json,areaTree,Data,children,append
来源: https://www.cnblogs.com/Sycblog/p/12346596.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有