import requests import re from bs4 import BeautifulSoup import json import time import pymysql class City: def __init__(self,tempjs={},time='',area='',city='无数据',confirmed=0,died=0,crued=0,confirmedRelative=0,cityCode=0): self.province=area self.relativeTime=time self.city=city self.confirmed=confirmed self.died=died self.crued=crued self.confirmedRelative=confirmedRelative self.cityCode=cityCode js={'city': '无数据', 'confirmed': 0, 'died': 0, 'crued': 0, 'confirmedRelative': 0, 'cityCode': 0} for k,v in tempjs.items(): if tempjs[k]!='': js[k]=v self.city=str(js["city"]) self.confirmed=int(js["confirmed"]) self.died=int(js["died"]) self.crued=int(js["crued"]) self.confirmedRelative=int(js["confirmedRelative"]) self.cityCode=int(js["cityCode"]) def get_db_tuple(self): return (self.province,self.city,self.confirmed,self.died,self.crued,self.confirmedRelative,self.relativeTime,self.cityCode) def insert_sql(self,con): sql="""insert into insideCity (province,city,confirmed,died,crued,confirmedRelative,relativeTime,cityCode) values(%s,%s,%s,%s,%s,%s,%s,%s) """ try: con.cursor().execute(sql,self.get_db_tuple()) con.commit() except Exception as e: print(e) print('Insert insideCity failed.') else: print('Inserted insideCity successfully') def __str__(self): if self.city=='境外输入': return "其它情况:{:<10}城市代码:{:<4}新增患者:{:<4}累积确诊:{:<4}累积死亡:{:<4}累积治愈:{:<4}".format(self.city,self.cityCode,self.confirmedRelative, self.confirmed,self.died,self.crued) return "城市名:{:<10}城市代码:{:<4}新增患者:{:<4}累积确诊:{:<4}累积死亡:{:<4}累积治愈:{:<4}".format(self.city,self.cityCode,self.confirmedRelative, self.confirmed,self.died,self.crued) class Provinces: def __init__(self): self.number=0 self.province=[] def addProvince(self,province): self.province.append(province) def printEveryProvince(self): for p in self.province: print(p) def __str__(self): return str(self.province) class Province: def __init__(self,tempjs={},confirmed=0,died=0,crued=0,relativeTime=0,confirmedRelative=0, diedRelative=0,curedRelative=0,asymptomaticRelative=0,asymptomatic=0, curConfirm=0,curConfirmRelative=0,icuDisable=0,area='',subList=[]): self.died=died self.confirmed=confirmed self.crued=crued self.relativeTime=relativeTime self.confirmedRelative=confirmedRelative self.diedRelative=diedRelative self.curedRelative=curedRelative self.asymptomaticRelative=asymptomaticRelative self.asymptomatic=asymptomatic self.curConfirm=curConfirm self.curConfirmRelative=curConfirmRelative self.icuDisable=icuDisable self.area=area self.subList=subList js={'confirmed': 0, 'died': 0, 'crued': 0, 'relativeTime': 0, 'confirmedRelative': 0, 'diedRelative': 0, 'curedRelative': 0, 'asymptomaticRelative': 0, 'asymptomatic': 0, 'curConfirm': 0, 'curConfirmRelative': 0, 'icuDisable': 0, 'area': '', 'subList':[]} for k,v in tempjs.items(): if tempjs[k]!='': js[k]=v #print(js) self.died=js['died'] self.confirmed=js['confirmed'] self.crued=js['crued'] self.relativeTime=js['relativeTime'] self.confirmedRelative=js['confirmedRelative'] self.diedRelative=js['diedRelative'] self.curedRelative=js['curedRelative'] self.asymptomaticRelative=js['asymptomaticRelative'] self.asymptomatic=js['asymptomatic'] self.curConfirm=js['curConfirm'] self.curConfirmRelative=js['curConfirmRelative'] self.icuDisable=js['icuDisable'] self.area=js['area'] self.subList=js['subList'] cities=js["subList"] localobj=time.localtime(int(self.relativeTime)) newtime=time.strftime("%Y-%m-%d %H:%M:%S",localobj) for c in cities: city=City(c,time=newtime,area=self.area) subList.append(city) def get_db_tuple(self): localobj=time.localtime(int(self.relativeTime)) newtime=time.strftime("%Y-%m-%d %H:%M:%S",localobj) return (self.died,self.confirmed,self.crued,newtime,self.confirmedRelative,self.diedRelative,self.curedRelative,self.asymptomaticRelative,self.asymptomatic,self.curConfirm,self.curConfirmRelative,self.icuDisable,self.area) def deleteProvince_sql(self,con): localobj=time.localtime(int(self.relativeTime)) cal=time.strftime("%Y-%m-%d %H:%M:%S",localobj)[0:10]+r"%" sql=""" delete from insideProvince where area='%s' and relativeTime like '%s' """%(self.area,cal) try: cursor=con.cursor() cursor.execute(sql) except Exception as e: print(e) print('delete deleteProvince failed.') else: print('delete deleteProvince successfully') def deleteCity_sql(self,con): localobj=time.localtime(int(self.relativeTime)) cal=time.strftime("%Y-%m-%d %H:%M:%S",localobj)[0:10]+r"%" sql=""" delete from insideCity where province='%s' and relativeTime like '%s' """%(self.area,cal) try: cursor=con.cursor() cursor.execute(sql) except Exception as e: print(e) print("delete %s'City failed."%self.area) else: print("delete %s'City successfully"%self.area) def insert_sql(self,con): sql="""insert into insideProvince (died,confirmed,crued,relativeTime,confirmedRelative, diedRelative,curedRelative,asymptomaticRelative, asymptomatic,curConfirm,curConfirmRelative,icuDisable,area) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) """ try: self.deleteProvince_sql(con) con.cursor().execute(sql,self.get_db_tuple()) con.commit() except Exception as e: print(e) print('Insert insideProvince failed.') else: print('Inserted insideProvince successfully') self.deleteCity_sql(con) for c in self.subList: localobj=time.localtime(int(self.relativeTime)) newtime=time.strftime("%Y-%m-%d %H:%M:%S",localobj) city=City(c,newtime,self.area) city.insert_sql(con) def printEveryCity(self): localobj=time.localtime(int(self.relativeTime)) newtime=time.strftime("%Y-%m-%d %H:%M:%S",localobj) for c in self.subList: city=City(c,time=newtime,area=self.area) print(city) def __str__(self): localobj=time.localtime(int(self.relativeTime)) newtime=time.strftime("%Y-%m-%d %H:%M:%S",localobj) return "省份:{:<4}现有患者:{:<4}现有新增患者:{:<4}累积无症状感染者:{:<4}新增无症状感染者:{:<4}累积确诊:{:<6}新增确诊:{:<4}累积治愈:{:<6}新增治愈:{:<4}累积死亡:{:<6}新增死亡:{:<4}累积重症:{:<4}更新时间:{:<10}".format(self.area,self.curConfirm,self.curConfirmRelative, self.asymptomatic,self.asymptomaticRelative,self.confirmed,self.confirmedRelative,self.crued,self.curedRelative,self.died,self.diedRelative, self.icuDisable,newtime) def getinsideData(): res=requests.get('https://voice.baidu.com/act/newpneumonia/newpneumonia/') res=res.text #script type="application/json" soup=BeautifulSoup(res,'html.parser') tag=soup.find('script',attrs={'id':'captain-config'}) tagstr=str(tag) findinland=re.findall('caseList".*"caseOutsideList',tagstr)[0] province=re.findall('\{"confirmed.*?subList":\[.*?\]\}',findinland) provinces=Provinces() for item in province: js=json.loads(item) p=Province(js) provinces.addProvince(p) #print(p) #p.printEveryCity() return provinces def printStart(): provinces=getinsideData().province for p in provinces: print(p) p.printEveryCity() print("+++++++++++++++++"*6) def mysqlStart(con): provinces=getinsideData().province for p in provinces: p.insert_sql(con)