python请求api获取json,python 获取json
任务背景:
调用API接口数据提取所需类型的数据,并写入指定的mysql数据库。
先从宏观上看这个任务,再把它分解:
第一步:需要学习如何用python从url读取数据。
Step2)数据分析也是核心部分。数据形式要从python的角度来理解。字典?列表?还是各种嵌套?
第三步:连接MySQL数据库并写入数据。
数据采集程序在功能上可以分为三种方法:对应step1的request_data(对应step2的parse_data)和对应step3的data_to_db。
第一轮不考虑异常,只考虑正常状态下的功能实现。
1.首先看request_data(:)
导入请求
efrequest_data(URL):
Req=requests.get(URL,timeout=30) #请求连接
Req _杰森=req。JSON(#获取数据
退货请求_jason
参考:url地址;返回:获得的数据。
2.然后检查parse_data(:)
不同的API接口有不同的数据格式,需要先整理出来。打开后排列密集,你可能连完整的数据区间在哪里都不知道。此时,可以巧妙地使用符号{[,]}来辅助判断。
经过整理,发现这个界面中数据格式的最外层是dictionary,我们需要的数据在初始键“data”下,数据对应的值是一个列表,列表中的所有元素都是dictionary,是字典中键值的一部分。
这是我们需要的。如上所述,已经发现我们的数据结构是一个字典集列表,它将字典重新格式化,在最低的字典中有一键多值(例如“天气”)。
当然,偷懒也有办法。百度json在线分析格式。
提取的部分数据如下。(数据(:(timestamp _ UTC):)2020-08-31t 0833600336000),(天气):)图标)33660
wind _ dir :336 , clouds _ hi :0 , precip :0.0625 } ,{ timestamp _ utc 3360 2020-08-31t 088-31t 080
Wind_dir:336, clouds_hi:0, precip:0.0625], city _ name: diagnosis bu , lon 336666600
efparse_data(req_Jason):
Data _ trunk=req _ Jason [data] #获取数据键值下的列表
Time _ now=datetime.datetime.now(。strftime (%y-%m-%d% h:% m3360% s ))来获取当前时间。
forIinrange(Len ) data_trunk):
依次获取字典作为data_unit=data_trunk[i] #列表中的第I个元素。
Del data_unit[weather] #从该字典中删除不必要的一键多值键和值。如果不删除,会影响后续的dataframe转换,但是如果需要键值,就需要做其他处理。
Df=PD.dataframe([data_unit])将删除了键值的字典转换为datafrme。
List_need=[timestamp_utc , wind_dir , precision , clouds_hi] #列出必需的列
Df_need=Df[list_need] # Add在保存df所需的10df_need.insert(0, update_time ,time_now)表的列中添加数据采集的当前时间。
注意:将数据插入数据库有两种方法:使用insert SQL语句以字典格式插入,或者使用熊猫to _ SQL方法的dataframe方法。在这种情况下,选择后者,因此在数据分析期间,字典数据被转换为dataframe格式。
参考:采集的数据;返回值:无
运行后发现这类程序存在一些问题。这意味着for循环太多,对数据库的写入只能是一次写入,不能是整个块,会影响程序的效率,所以程序必须做如下修改。
efparse_data(req_Jason):
Data _ trunk=req _ Jason [data] #获取数据键值下的列表
time_now=datetime.datetime.now()。strftime(%y-%m-
%d %H:%M:%S) #获取当前时间
对于范围内的I(len(data _ trunk)):
Data_unit=data_trunk[i] #依次获取列表下的第I个元素,也就是字典。
Del data_unit[weather] #删除本字典中不必要的键和一键多值的值。如果不删除,会影响后续的dataframe转换。但是,如果需要键值,就需要采取其他的处理方法。
Df=pd。DataFrame(data_trunk) #将删除了键值的整个列表字典转换为datafrme
List _ need=[timestamp _ UTC , wind _ dir , precision , clouds _ hi] #列出我们需要的列
Df_need=Df[list_need] #在df中保留必需的列
在df _ need.insert (0, update _ time ,time _ now) #表中,需要添加数据采集的当前时间,需要放在dataframe的第一列。
即在第7行后跳出循环;
如果觉得for循环影响整体美观,也可以换成map,将代码行4/5/6改为如下代码。但是,for循环在性能方面可能更好。具体对比,看其他博主的测试,或者自己测试运行时间。
地图(data_trunk.pop,[天气])
3.最后,data_to_sql():
定义数据到sql(df):
表=请求数据应用编程接口
engine=create _ engine( MySQL py MySQL:// root :123 @ localhost :3306 / test ?charset=utf8 )
df . to _ SQL(name=表,con=引擎,if_exists=append ,
index=False,index_label=False)
参数:dataframe类型的数据。
当正常部分已经完成后,就要设想各种异常情况,以及处理对策。
二、想象各种异常及其记录和处理对策。
1.看完网址,无法获取数据休息几秒钟,尝试重新连接再次获取。
2.与数据库的连接异常数据库可能已关闭,请再次尝试ping。
3.写入数据库的内容为空记录异常,放弃入库。
第三轮,让程序有规律的运行。
Fndgz:代码中采用了apscheduler下的cron函数(trigger= cron ,类似于linux下的crontab)来实现预定的操作(当然apscheduler还有另外一种trigger= interval 模式);
Xsdjy:在linux下向crontab添加调度任务。
具体可以看其他帖子。
这就是python调用API接口获取和解析Json数据的细节。关于python解析数据的更多信息,请关注云海天教程其他相关文章!
原文链接:https://www.cnblogs.com/xiamibao/p/13589798.html
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。