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 相关文章推荐
Python操作sqlite3快速、安全插入数据(防注入)的实例
Apr 26 Python
Python实现对比不同字体中的同一字符的显示效果
Apr 23 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
Aug 15 Python
Python内置模块logging用法实例分析
Feb 12 Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 Python
Python通过调用有道翻译api实现翻译功能示例
Jul 19 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
对Python3中bytes和HexStr之间的转换详解
Dec 04 Python
python基于递归解决背包问题详解
Jul 03 Python
python通过实例讲解反射机制
Oct 17 Python
Selenium及python实现滚动操作多种方法
Jul 21 Python
python树莓派通过队列实现进程交互的程序分析
Jul 04 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
php5中date()得出的时间为什么不是当前时间的解决方法
2008/06/30 PHP
php自动加载的两种实现方法
2010/06/21 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
php中青蛙跳台阶的问题解决方法
2018/10/14 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
vue中echarts3.0自适应的方法
2018/02/26 Javascript
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
运动检测ViBe算法python实现代码
2018/01/09 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
Pytorch的mean和std调查实例
2020/01/02 Python
英国最大的正宗复古足球衫制造商和零售商:TOFFS
2018/06/21 全球购物
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
如何选择使用结构还是类
2014/05/30 面试题
linux面试题参考答案(5)
2014/09/01 面试题
高分子材料个人求职信范文
2013/09/25 职场文书
护理专业本科生自荐信
2013/10/01 职场文书
校本教研工作制度
2014/01/22 职场文书
初级会计求职信范文
2014/02/15 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
工程质检员岗位职责
2015/04/08 职场文书
无工作证明怎么写
2015/06/15 职场文书
教师外出学习心得体会
2016/01/18 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
Go并发4种方法简明讲解
2022/04/06 Golang