python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)


Posted in Python onApril 18, 2019

简介

有些 post 的请求参数是 json 格式的,这个前面发送post 请求里面提到过,需要导入 json模块处理。现在企业公司一般常见的接口因为json数据容易处理,所以绝大多数返回数据也是 json 格式的,我们在做判断时候,往往只需要提取其中

几个关键的参数就行,这时候我们就需要 json 来解析返回的数据了。首先来说一下笔者为何要单独写这么一篇,原因是:python 里面 bool 值是 True 和 False,json 里面 bool 值是 true和 false,并且区分大小写,这就尴尬了,明明都是 bool 值。

在python里面写的代码,传到json里,不用说肯定识别不了,所以需要把python的代码经过encode后成为 json 可识别的数据类型,反之json数据就需要decode后成为python代码可识别的数据类型。这个也是需要初学者注意,也算是个细微差和

一个坑人的地方吧,如果不注意很容易掉坑里啊。笔者就掉进去过,还好自救能力强,爬出来了,所以为了警醒后来者,就有了这篇随笔。

json 模块简介

1、Json 简介:Json,全名 JavaScript Object Notation,JSON(JavaScript Object Notation(记号、标记))是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。JSON采用完全独立

于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。JSON易于人阅读和编写,同时也易于机器解析和生成。常用于 http 请求中,接口

返回的数据中。

2、可以用 help(json),查看对应的源码注释内容

python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)

编码Encode(python->json)

1、为什么要 encode,笔者在开头就给各位小伙伴开门见山的说出来了,让各位带着问题来探索、来学习、来思考

2、举个简单例子,下图的实例中 dict 类型经过 json.dumps()后变成 str,True 变成了 true,False变成了 fasle

python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)

3、从json模块的对应源码中可以查看到,python 数据转化成 json可识别的数据,对应的表关系如下

python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)

解码 decode(json->python)

1、以博客园的登录成功结果:{"success":True}为例,我们其实最想知道的是 success 这个字段返回的是 True 还是 False,以便于我们对接口进行断言,以下是fiddler抓包博客园登录成功的结果

python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)

2、如果以 content 字节输出,返回的是一个字符串:{"success":true},这样获取后面那个结果就不方便了,导致断言也不方便

3、如果经过 json 解码后,返回的就是一个字典:{u'success': True},这样获取后面那个结果,就用字典的方式去取值:result2["success"],这样不言而喻断言也就简单方便了

4、由于博客园的登录机制的改变,我们这里接着上一篇的删除随笔的返回结果,给小伙伴们实战演练一下

5、用fiddler抓包,抓到删除新建随笔的请求,从抓包结果可以看出,返回结果是一个字符串:{"isSuccess":True},按照上边的步骤用代码实现

python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)

6、代码及结果(看到了吧,就是这么轻松被我们取到其value了,接下来就可以进行断言了)

python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)

7、从json模块的对应源码中可以查看到, json 数据转化成 python 可识别的数据,对应的表关系如下

python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)

8、参考代码

# coding:utf-8
import requests
# 先打开登录首页,获取部分cookie
url = "https://passport.cnblogs.com/user/signin"
headers = {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0"
      } # get方法其它加个ser-Agent就可以了
s = requests.session()
r = s.get(url, headers=headers,verify=False)
print (s.cookies)
# 添加登录需要的两个cookie
c = requests.cookies.RequestsCookieJar()
c.set('.CNBlogsCookie', 'XXX') # 填上面抓包内容
c.set('.Cnblogs.AspNetCore.Cookies','XXX') # 填上面抓包内容
c.set('AlwaysCreateItemsAsActive',"True")
c.set('AdminCookieAlwaysExpandAdvanced',"True")
s.cookies.update(c)
print (s.cookies)
result = r.content
print(result.decode('utf-8'))
# 登录成功后保存编辑内容
url2= "https://i.cnblogs.com/EditPosts.aspx?opt=1"
body = {"__VIEWSTATE": "",
    "__VIEWSTATEGENERATOR":"FE27D343",
    "Editor$Edit$txbTitle":"这是绕过登录的标题:北京-宏哥",
    "Editor$Edit$EditorBody":"<p>这里是中文内容:http://www.cnblogs.com/duhong/</p>",
    "Editor$Edit$Advanced$ckbPublished":"on",
    "Editor$Edit$Advanced$chkDisplayHomePage":"on",
    "Editor$Edit$Advanced$chkComments":"on",
    "Editor$Edit$Advanced$chkMainSyndication":"on",
    "Editor$Edit$lkbDraft":"存为草稿",
     }
r2 = s.post(url2, data=body, verify=False)
print (r.content.decode('utf-8'))

# 第三步:正则提取需要的参数值
import re
postid = re.findall(r"postid=(.+?)&", r2.url)
print(type(postid))
print (postid) # 这里是 list
# 提取为字符串
print (postid[0])
# 第四步:删除草稿箱
url3 = "https://i.cnblogs.com/post/delete"
json3 = {"postId": postid[0]}
r3 = s.post(url3, json=json3, verify=False)
result = r3.content #content数据是字节输出
print(type(result))
print(result)
#json是经过加码encode成对应python的数据类型
result1 = r3.json()
print (type(result1))
print(result1['isSuccess'])

小结

在实际工作中遇到问题要学会查资料,看其对应的官方文档以及源码,不仅可以起到事半功倍的作用,也可以锻炼自己解决问题的能力。这一点笔者深有体会!!!

以上所述是小编给大家介绍的python Json 数据处理详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
详解Django中六个常用的自定义装饰器
Jul 04 Python
python实现决策树分类
Aug 30 Python
Python中GIL的使用详解
Oct 03 Python
对python自动生成接口测试的示例讲解
Nov 30 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
python 输出列表元素实例(以空格/逗号为分隔符)
Dec 25 Python
pytorch:实现简单的GAN示例(MNIST数据集)
Jan 10 Python
jupyter notebook实现显示行号
Apr 13 Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 Python
python 实现弹球游戏的示例代码
Nov 17 Python
详解python数据结构和算法
Apr 18 #Python
python基础知识(一)变量与简单数据类型详解
Apr 17 #Python
关于python多重赋值的小问题
Apr 17 #Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
Apr 17 #Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 #Python
Python中如何导入类示例详解
Apr 17 #Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 #Python
You might like
php header Content-Type类型小结
2011/07/03 PHP
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
PDO::setAttribute讲解
2019/01/29 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
jquery.lazyload  实现图片延迟加载jquery插件
2010/02/06 Javascript
js局部刷新页面时间具体实现
2013/07/04 Javascript
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
2014/08/12 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
2015/06/08 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
js实现右键菜单功能
2016/11/28 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
vue中多路由表头吸顶实现的几种布局方式
2019/04/12 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
利用JS代码自动删除稿件的普通弹幕功能
2019/09/20 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
python实现每次处理一个字符的三种方法
2014/10/09 Python
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
基于Python实现扑克牌面试题
2019/12/11 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
预备党员政审材料
2014/02/04 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
2014年物资管理工作总结
2014/12/02 职场文书
给客户的检讨书
2014/12/21 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
学生会干部任命书
2015/09/21 职场文书
深入理解MySQL中MVCC与BufferPool缓存机制
2022/05/25 MySQL