简介
有些 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), 查看对应的源码注释内容
编码 Encode(python->JSON)
1, 为什么要 encode, 笔者在开头就给各位小伙伴开门见山的说出来了, 让各位带着问题来探索, 来学习, 来思考
2, 举个简单例子, 下图的实例中 dict 类型经过 JSON.dumps() 后变成 str,True 变成了 true,False 变成了 fasle
3, 从 JSON 模块的对应源码中可以查看到, python 数据转化成 JSON 可识别的数据, 对应的表关系如下
解码 decode(JSON->python)
1, 以博客园的登录成功结果:{"success":True} 为例, 我们其实最想知道的是 success 这个字段返回的是 True 还是 False, 以便于我们对接口进行断言, 以下是 fiddler 抓包博客园登录成功的结果
2, 如果以 content 字节输出, 返回的是一个字符串:{"success":true}, 这样获取后面那个结果就不方便了, 导致断言也不方便
3, 如果经过 JSON 解码后, 返回的就是一个字典:{u'success': True}, 这样获取后面那个结果, 就用字典的方式去取值: result2["success"], 这样不言而喻断言也就简单方便了
4, 由于博客园的登录机制的改变, 我们这里接着上一篇的删除随笔的返回结果, 给小伙伴们实战演练一下
5, 用 fiddler 抓包, 抓到删除新建随笔的请求, 从抓包结果可以看出, 返回结果是一个字符串:{"isSuccess":True}, 按照上边的步骤用代码实现
6, 代码及结果 (看到了吧, 就是这么轻松被我们取到其 value 了, 接下来就可以进行断言了)
7, 从 JSON 模块的对应源码中可以查看到, JSON 数据转化成 python 可识别的数据, 对应的表关系如下
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'])
小结
在实际工作中遇到问题要学会查资料, 看其对应的官方文档以及源码, 不仅可以起到事半功倍的作用, 也可以锻炼自己解决问题的能力. 这一点笔者深有体会!!!
来源: https://www.cnblogs.com/du-hong/p/10688197.html