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 相关文章推荐
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
Python与R语言的简要对比
Nov 14 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
Nov 30 Python
Python3简单实例计算同花的概率代码
Dec 06 Python
ubuntu安装sublime3并配置python3环境的方法
Mar 15 Python
详细介绍pandas的DataFrame的append方法使用
Jul 31 Python
python多进程(加入进程池)操作常见案例
Oct 21 Python
Python hashlib加密模块常用方法解析
Dec 18 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
Mar 24 Python
python实现扫雷小游戏
Apr 24 Python
浅谈Python中的模块
Jun 10 Python
Python利用FlashText算法实现替换字符串
Mar 31 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
PHP实现MVC开发得最简单的方法――模型
2007/04/10 PHP
pdo中使用参数化查询sql
2011/08/11 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
解析mysql 表中的碎片产生原因以及清理
2013/06/22 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
2014/07/28 PHP
php+ajax无刷新上传图片的实现方法
2016/12/06 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
2016/02/29 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
详解使用python crontab设置linux定时任务
2016/12/08 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
Python如何输出整数
2020/06/07 Python
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
安全生产责任书
2014/03/12 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
《家》读后感:万惜拯救,冷暖自知
2019/09/25 职场文书
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android