任务背景:
调用API接口数据,抽取我们所需类型的数据,并写入指定mysql数据库。
先从宏观上看这个任务,并对任务进行分解:
step1:需要学习python下的通过url读取数据的方式;
step2:数据解析,也是核心部分,数据格式从python角度去理解,是字典?列表?还是各种嵌套?
step3:连接mysql数据库,将数据写入。
从功能上看,该数据获取程序可以分为3个方法,即step1对应方法request_data(),step2对应方法parse_data(),step3对应data_to_db()。
第一轮,暂不考虑异常,只考虑正常状态下的功能实现。
1、先看request_data():
import requests def request_data(url): req = requests.get(url, timeout=30) # 请求连接 req_jason = req.json() # 获取数据 return req_jason
入参:url地址;return:获取到的数据。
2、然后看parse_data():
不同的API接口下的数据格式各不相同,需要先理清,打开之后密密麻麻一大串,有的可能连完整的一轮数据间隔在哪都不知道,这时候可以巧用符号{ [ , ] }辅助判断。
梳理之后,发现本接口下的数据格式为,最外层为字典,我们所需的数据在第一个key“data”下,data对应的value为列表,列表中的每个元素为字典,字典中的部分键值
即为我们需要的内容。这样,就明确了我们的数据结构为字典套列表,列表再套字典的格式,最后一层的字典还存在一键多值(比如“weather”)的情况。
当然,还有懒人方法,就是百度json在线解析格式化。
摘取部分数据如下:{"data":[{"timestamp_utc":"2020-08-31T08:00:00","weather":{"icon":"c02d","code":802,
wind_dir":336,"clouds_hi":0,"precip":0.0625},{"timestamp_utc":"2020-08-31T08:00:00","weather":{"icon":"c02d","code":802,},
wind_dir":336,"clouds_hi":0,"precip":0.0625],"city_name":"Dianbu","lon":117.58,"timezone":"Asia\/Shanghai","lat":31.95,"country_code":"CN"}
def parse_data(req_jason): data_trunk = req_jason['data']# 获取data键值下的列表 time_now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") #获取当前时刻 for i in range(len(data_trunk)): data_unit = data_trunk[i] # 依次获取列表下第i个元素即字典 del data_unit['weather'] # 删除该字典中不需要的一键多值的key和value,不删除的话会影响后续的dataframe转换,但是,如果该键值需要的话,需要采取其他处理方式 df = pd.DataFrame([data_unit]) # 将删除键值后的字典转为datafrme list_need = ['timestamp_utc', 'wind_dir', 'precip','clouds_hi'] # 列出我们需要的列 df_need = df[list_need] # 保留df中需要的列 10 df_need.insert(0, 'update_time', time_now) #表格中还需额外增加获取数据的当前时间,并且需要放在dataframe的第一列
备注:数据插入数据库,有两种方式,一种是采用insert的sql语句,采用字典的形式插入,另一种是采用dataframe的方式,采用pandas中的to_sql方法。本案例选择了后者,所以在数据解析时,将字典数据转成dataframe格式。
入参:获取到的数据;return值:无
运行以后,发现这样的程序存在一些问题:就是这个for循环括起来的过多,导致写数据库时是一条条写入而不是一整块写入,会影响程序效率,所以需要对程序进行如下修改:
def parse_data(req_jason): data_trunk = req_jason['data']# 获取data键值下的列表 time_now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") #获取当前时刻 for i in range(len(data_trunk)): data_unit = data_trunk[i] # 依次获取列表下第i个元素即字典 del data_unit['weather'] # 删除该字典中不需要的一键多值的key和value,不删除的话会影响后续的dataframe转换,但是,如果该键值需要的话,需要采取其他处理方式 df = pd.DataFrame(data_trunk) # 将删除键值后的整个列表套字典转为datafrme list_need = ['timestamp_utc', 'wind_dir', 'precip','clouds_hi'] # 列出我们需要的列 df_need = df[list_need] # 保留df中需要的列 df_need.insert(0, 'update_time', time_now) #表格中还需额外增加获取数据的当前时间,并且需要放在dataframe的第一列
也就是从第7行之后跳出循环;
如果觉得for循环影响整体美观,也可以用map代替,将代码第4/5/6行改为如下代码,不过性能上来说可能还是for循环更好,具体对比可看其他博主的测试,或者自己测试下运行时间。
map(data_trunk.pop, ['weather'])
3. 最后就是data_to_sql():
def data_to_sql(df): table = 'request_data_api' engine = create_engine("mysql+pymysql://" + 'root' + ":" + '123' + "@" + 'localhost' + ":" + '3306' + "/" + 'test' + "") df.to_sql(name=table, con=engine, if_exists='append', index=False, index_label=False)
入参:dataframe类型数据。
当当当,正常部分已完成,就下来就需要想象各种异常以及处理对策。
第二轮,想象各种异常以及异常的记录与处理对策。
1.读取url后,获取不到数据 → 休息几秒,尝试再次重连获取
2.连接数据库异常 → 数据库可能关闭,尝试重新ping,
3.写入数据库的内容为空 → 记录异常,放弃入库
第三轮,让程序定时跑起来。
方法一:在代码中采用apscheduler下的cron功能(trigger='cron‘,类似linux下的crontab)实现定时运行(当然,apscheduler还有另一种trigger=‘interval'模式);
方法二:在linux下的crontab增加定时任务。
具体可以看别的帖子。
以上就是python 调用API接口 获取和解析 Json数据的详细内容,更多关于python 解析数据的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]