python 调用API接口 获取和解析 Json数据


Posted in Python onSeptember 28, 2020

任务背景:

调用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' + "?charset=utf8")
 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 解析数据的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python如何实现远程控制电脑(结合微信)
Dec 21 Python
python rsa 加密解密
Mar 20 Python
python 使用get_argument获取url query参数
Apr 28 Python
Python实现获取命令行输出结果的方法
Jun 10 Python
深入浅出分析Python装饰器用法
Jul 28 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
利用Python在一个文件的头部插入数据的实例
May 02 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
Python实现密钥密码(加解密)实例详解
Apr 26 Python
Python-for循环的内部机制
Jun 12 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
Jun 29 Python
Django缓存Cache使用详解
Nov 30 Python
记录一下scrapy中settings的一些配置小结
Sep 28 #Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
Sep 28 #Python
详解scrapy内置中间件的顺序
Sep 28 #Python
Python爬虫代理池搭建的方法步骤
Sep 28 #Python
浅析python 通⽤爬⾍和聚焦爬⾍
Sep 28 #Python
Scrapy 配置动态代理IP的实现
Sep 28 #Python
Scrapy中如何向Spider传入参数的方法实现
Sep 28 #Python
You might like
正则表达式语法
2006/10/09 Javascript
通过JavaScript或PHP检测Android设备的代码
2011/03/09 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
PHP实现Google plus的好友拖拽分组效果
2016/10/21 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
javascript 学习之旅 (3)
2009/02/05 Javascript
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
jQuery插件简单实现方法
2015/07/18 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
2016/06/08 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
jquery dataTable 后台加载数据并分页实例代码
2017/06/07 jQuery
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
使用p5.js临摹动态图形
2019/10/23 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
2020/08/07 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
2020/11/10 Javascript
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
python基础教程之popen函数操作其它程序的输入和输出示例
2014/02/10 Python
Python实现批量读取word中表格信息的方法
2015/07/30 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
python 切换root 执行命令的方法
2019/01/19 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
python实现手机销售管理系统
2019/03/19 Python
Flask-WTF表单的使用方法
2019/07/12 Python
CSS3 Backgrounds属性相关介绍
2011/05/11 HTML / CSS
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
马来西亚时装购物网站:ZALORA马来西亚
2017/03/14 全球购物
购房协议书
2014/04/11 职场文书
司机工作自我鉴定
2014/09/19 职场文书
小学语文教学随笔
2015/08/14 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书