处理json数据
上一此在介绍如何获取cookie时候已经说过,在网页开发者功能里面可以对网页进行抓包分析
1.那么问题来了,什么是json数据呢?
先介绍一下历史:
过去传统网站开发,网站就像电脑里面的文件目录,用户通过浏览器直接访问服务器内文件。
就像我们电脑的某个盘,随着使用时间变久,文件越来越多,会发现文件越来越难以管理。出现文件寻找难度大,文件损坏,污染数据等问题。
所以我们构建数据库作为服务器的数据管理内核,来支撑BS架构,数据管理更方便的同时,由于隔离了浏览器和数据的直接接触,安全性也大大提高。
我们可以简单类比数据库为一个函数(function),我们的浏览器类比主函数,当浏览器向数据库内传入某些关键参数时,数据库return一些数据。
那数据是怎么return的呢,体现在浏览器抓包中的json格式数据。
其形式为(其中每个obj可以进行扩充,形成了多层嵌套)
{“key1”:obj,“key2”:[“key1”:object,obj,obj…],“key3”:obj…}
如果我们想要获取其中的object,用什么方法比较好呢? 以python为例 观察其格式可以发现,它是字典(dic)和列表(list)两种数据格式构成的,因此我们可以用解析这两种数据的方法来解析。
python提供了json包来辅助我们进行解析,还是来看上面微博的例子。
假设我们已经完成这些事情:
- 正确向服务器发送参数
- 骗过服务器了,服务器向我们返回了正确的数据。
OK,那么进行下一步
2.如何解析json格式数据——微博为例
我们以一个任务为例,后面如果有需求再增加几个例子
比如我要获得微博总页数,那么思路应该是这样子的:
获得总微博数量
向上取整
解析json数据
把总微博数量除以每页的微博量
总页数
看一下网页的json结构:
如何生成这种json格式浏览图参看:
其中total即为总微博数量。
- 分析一下
total第一层被包裹在一个字典(dic)的键值(key):data里面
第二层还是在一个字典(dic)的键值(key):cardlistInfo里面
第三层为键值(key):total里面
如果有list加下标index即可,当然这个案例里并没有出现需要用到list的情况。
js[‘data’][‘cardlistInfo’].get(‘total’, 0)
所以本例可以这样写,get()里面的0代表total如果有列表选取第一个值。
开始代码:
在request函数模块里面,将返回的数据进行处理:
r = requests.get(url, params=params)
return r.json() #返回json数据
在下一步里面,js变量将接收来自上个模块返回的数据(即r.json())
js = self.get_json(params)
if js['ok']:
user_info['statuses_count'] = js['data']['cardlistInfo'].get('total', 0) #获取总条数
print('共{}条' .format(user_info['statuses_count']))
page_count = int(math.ceil(weibo_count / 10.0)) #总页数
page_count 即为总页数,此案例演示完毕