python对json的操作及实例解析

Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。(来自百度百科)

python关于json文档的网址https://docs.python.org/3.6/library/json.html?highlight=json#module-json

json是JavaScript程序编写数据结构的原生方式,在Python中,字典的格式和json格式在显示上是一样的,但是字典是dict,而json是str
Python的json模块主要包含两大函数。
json.dumps把一个Python对象编码转换成json字符串
json.loads把json格式字符串解码转换成Python对象

一 Encode过程

是把python对象转换成json对象的一个过程,常用的两个函数是dumps和dump函数。两个函数的唯一区别就是dump把python对象转换成json对象生成一个fp的文件流,而dumps则是生成了一个字符串:

import json
dic1 = {'type':'dic1','username':'sunchengquan','age':25}
json_dic1 = json.dumps(dic1)
print(json_dic1)
json_dic2 = json.dumps(dic1,sort_keys=True,indent =4,separators=(',', ': '),
ensure_ascii=True )
print(json_dic2)

运行结果
{"type": "dic1", "username": "sunchengquan", "age": 25}
{
    "age": 25,
    "type": "dic1",
    "username": "sunchengquan"
}

json.dumps(参数)
skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似\uXXXX的显示数据,设置成False后,就能正常显示
indent:应该是一个非负的整型,如果是0,或者为空,则一行显示数据,否则会换行且按照indent的数量显示前面的空白,这样打印出来的json数据也叫pretty-printed json
separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。
sort_keys:将数据根据keys的值进行排序

二 Decode过程

是把json对象转换成python对象的一个过程,常用的两个函数是loads和load函数。区别跟dump和dumps是一样的

import json
#将python对象test转换json对象
test = [{'type':'dic1','username':'孙成全','age':25},(2,3),1]
print(type(test))
python_to_json = json.dumps(test,ensure_ascii=False)
print(python_to_json)
print(type(python_to_json))

# 将json对象转换成python对象
json_to_python = json.loads(python_to_json)
print(json_to_python)
print(type(json_to_python))

运行结果
<class 'list'>
[{"type": "dic1", "username": "孙成全", "age": 25}, [2, 3], 1]
<class 'str'>
[{'type': 'dic1', 'username': '孙成全', 'age': 25}, [2, 3], 1]
<class 'list'>
import json
#将python对象test转换json对象
test = [{'type':'dic1','username':'sunchengquan','age':25},(2,3),1]
python_to_json = json.dumps(test,ensure_ascii=False)
# 将json对象转换成python对象
json_to_python = json.loads(python_to_json)
print(json_to_python[0]['username'])

运行结果
sunchengquan

注意:python的json模块不支持单引号,所以类似”{‘a’:’A’,’b’:[2,4],’c’:3.0}”的字符串是会报错

实例:下载json数据并解析

ajax动态请求、异步刷新生成的json数据
这里我们以爬取淘宝评论为例子讲解一下如何去做到的。
这里主要分为了三步:
一 获取淘宝评论时,ajax请求链接(url)
二 获取该ajax请求返回的json数据
三 使用python解析json数据

步骤一:获取淘宝评论时,ajax请求链接(url)

这里我使用的是Firefox浏览器来完成的。打开淘宝链接,在搜索框中搜索一个商品,比如“鞋子”,这里我们选择第一项商品。然后跳转到了一个新的网页中。在这里由于我们需要爬取用户的评论,所以我们点击累计评价。
这里写图片描述

然后我们就可以看到用户对该商品的评价了,这时我们在网页中右击选择查看元素
我们在用户评论中,翻到底部 点击下一页或者第二页,我们在网络中看到动态添加了几项,我们选择开头为https://rate.tmall.com/list_detail_rate.htm?itemId=552369102522的一项。
这里写图片描述

然后点击该选项,我们可以在右边选项框中看到有关该链接的信息,我们要复制请求网址中的链接内容。我们在浏览器的地址栏中输入刚才我们获得url链接,打开后我们会发现页面返回的是我们所需要的数据,不过显得很乱,因为这是json数据。

这里写图片描述

步骤二:获取该ajax请求返回的json数据
我们就要获取url中的json数据了。我所使用的python编辑器是pycharm,下面看一下python代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-
#date:2017-10-07
__author__ = 'sunchengquan'
__project__ = 'XXXXXX'
__doc__ = 'XXXXXX'
__mail__ ='1641562360@qq.com'

import re
import json
import requests

url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=552369102522&spuId=853893286&sellerId=701751992&order=3&currentPage=1&append=0&content=1&tagId=&posi=&picture=&ua=098%23E1hvv9vJvJgvUpCkvvvvvjiPP2SWljn8nLLhsjrCPmPhzjt8PLqw6jDUR2SW6jiURIhCvCLNqtoaWxdNzA2kZM1wCYM1zQjwQUhCvvsNvVxYZDdNzAmkraACvpvWzQmDSxE4zYG97u5wdphvmpvZEQfH1oLg4FyCvvpvvvvvRphvCvvvvvmCvpvWzQ2HcPB4zYG9RBdwdphvmpvZmpEd4AoZj86Cvvyvm8GmwzWwEBVrvpvBUvQT940rHEHx84GuUZWE3wervpvEvv2Q9fAG2mqYiQhvCvvv9UUCvpvVvmvvvhCvmphvLvkD69vjcWL9a4QB%2BFZc%2BEj6sCywJxcXS47BhC3qVUcnDOmOezIUDajxALwpEcqhtjc6eX1z7tj61WkfV7Q4S47B9CkaU6bnDO2hjC0tvpvIvvvvvhCvvvvvvUUdphvv%2B9vv9krvpvQvvvmm86CvmVWvvUUsphvUIgyCvvOWvvVvaZRivpvUvvmvbqZr%2F%2FZPvpvhJ2X572yCvvpvvvvv3QhvCvvhvvmrvpvBUv9wvyCvvWMD84GuUZWE3wervpvEvvASvFwzCm7kdphvmpvUfpUhCCQiPT6Cvvyv22UmwjvwXN%2FrvpvEvvsKv3O7EjvE9phv2nGv1xQ07rMNUhybzUhCvvsNvWxGaldNzACBIaQtvpvhvvvvvUhCvvsNvmXazxdNzA2XZnACvpvWzQmDSB34zYG975dw&isg=Ag4O1UVS26FtwG4En5NuROh9XuQQJ7YR1hBPrjhRe5DJm471oBzumTMZpfwJ&needFold=0&_ksTS=1507359613080_4232&callback=jsonp4233';
content = requests.get(url)
print(content.text)    #打印出来的内容就是我们之前在网页中获取到的json数据

运行结果

jsonp4233({"rateDetail":{"paginator":{"items":1660,"lastPage":83,"page":1},"rateCount":{"picNum":562,"shop":0,"total":1806,"used":153},"rateDanceInfo":{"currentMilles":1507361314881,"intervalMilles":12524771620,"showChooseTopic":false,"storeType":4},"rateList":[{"aliMallSeller":false,"anony":true,"appendComment":"","attributes":"","attributesMap":"","aucNumId":"","auctionPicUrl":"","auctionPrice":"","auctionSku":"颜色分类:黄棕色;尺码:42","auctionTitle":"","buyCount":0,"carServiceLocation":"","cmsSource":"天猫","displayRatePic":"","displayRateSum":0,"displayUserLink":"","displayUserNick":"a***3","displayUserNumId":"","dis.................................................................................

步骤三:使用python解析json数据

#!/usr/bin/python
# -*- coding: utf-8 -*-
#date:2017-10-07
__author__ = 'sunchengquan'
__project__ = 'XXXXXX'
__doc__ = 'XXXXXX'
__mail__ ='1641562360@qq.com'

import re #正则表达式需要的包
import json #解析json数据需要的包
import requests

url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=552369102522&spuId=853893286&sellerId=701751992&order=3&currentPage=1&append=0&content=1&tagId=&posi=&picture=&ua=098%23E1hvv9vJvJgvUpCkvvvvvjiPP2SWljn8nLLhsjrCPmPhzjt8PLqw6jDUR2SW6jiURIhCvCLNqtoaWxdNzA2kZM1wCYM1zQjwQUhCvvsNvVxYZDdNzAmkraACvpvWzQmDSxE4zYG97u5wdphvmpvZEQfH1oLg4FyCvvpvvvvvRphvCvvvvvmCvpvWzQ2HcPB4zYG9RBdwdphvmpvZmpEd4AoZj86Cvvyvm8GmwzWwEBVrvpvBUvQT940rHEHx84GuUZWE3wervpvEvv2Q9fAG2mqYiQhvCvvv9UUCvpvVvmvvvhCvmphvLvkD69vjcWL9a4QB%2BFZc%2BEj6sCywJxcXS47BhC3qVUcnDOmOezIUDajxALwpEcqhtjc6eX1z7tj61WkfV7Q4S47B9CkaU6bnDO2hjC0tvpvIvvvvvhCvvvvvvUUdphvv%2B9vv9krvpvQvvvmm86CvmVWvvUUsphvUIgyCvvOWvvVvaZRivpvUvvmvbqZr%2F%2FZPvpvhJ2X572yCvvpvvvvv3QhvCvvhvvmrvpvBUv9wvyCvvWMD84GuUZWE3wervpvEvvASvFwzCm7kdphvmpvUfpUhCCQiPT6Cvvyv22UmwjvwXN%2FrvpvEvvsKv3O7EjvE9phv2nGv1xQ07rMNUhybzUhCvvsNvWxGaldNzACBIaQtvpvhvvvvvUhCvvsNvmXazxdNzA2XZnACvpvWzQmDSB34zYG975dw&isg=Ag4O1UVS26FtwG4En5NuROh9XuQQJ7YR1hBPrjhRe5DJm471oBzumTMZpfwJ&needFold=0&_ksTS=1507359613080_4232&callback=jsonp4233';
web_content = requests.get(url).text # 获取网页中json数据
content = re.findall(r'\w+[(]{1}(.*)[)]{1}',web_content,re.S)# 正则表达式除去网页中json数据多余的部分
python_content = json.loads(content[0])
count = len(python_content['rateDetail']['rateList'])#获取用户评论数(这里只是当前页的)
for i in range(count):
    print(python_content['rateDetail']['rateList'][i]['rateContent'])

运行结果

D:\Anaconda3\python.exe "D:/PycharmProjects/python 定向爬虫/01.py"
美得很,比想象中的美!整天运动鞋换个风格。我觉得不要管什么皮鞋比运动鞋小一码什么的,我平时运动鞋42,这个依然42。毕竟运动鞋宽松这个太有型肯定相对小一点。所以保险起见我直接整42,实际证明完全正确。(说明一哈我脚面比较宽)
鞋子满意,穿着舒服,是真皮的,鞋子特别百搭衣服裤子,很酷的鞋子,鞋子穿了很久都被我穿脏了,图片鞋有点脏,可是也不影响它的帅气,哈哈。
鞋子颜色,实物要比图片稍微浅一些,穿起来还是挺好看的。看起来好像是皮的,总得来说,还是挺满意的。好评。
鞋子很好看,男朋友穿了说很舒服,而且灰色这个颜色也是出乎意料的好看,整体都很满意,希望马登越来越好!
收到鞋以后心里久久不能平静,在淘宝买了这么多年东西,第一次见到卖家将货品包装的如此上档次,鞋很有质感,有复古的味道又不失现代元素,整体还不错!特别要感谢的是兔兔妹纸,很耐心的帮我解决了售后问题,心情很不错!呵
这不是第一次买马叔家的鞋子了。今天拿到鞋子了,很满意。刚开始很纠结尺码的,因为之前买都是比正常码小,这次依然买比正常码小一码的,穿了刚刚好。鞋子皮质很软,穿着很舒服。室友问我要链接了。
才下单2天而已,今天就收到货了!连十一长假也没休呢!真是敬佩货运小哥,辛苦啦!鞋子买给老公穿的,颜色上很好搭,穿起来也舒服!
和图片没有色差,鞋底很软,上脚也舒服,就是容易出脚汗的话,有点味道
真心不错的鞋子   第一双拍大了一码!客服果果和可可一直耐心的解答解决方法!   不过没换!这么帅气的鞋子我送给我同事了&hellip;&hellip;直接果断有给自己买了一双40码的
此用户没有填写评论!
先说发货。第一天没发货,我很恼火,但是客服态度很好,想想算了,没退货,服务,不行,态度,满意!再说鞋,九十分吧,鞋底比橡胶底好,但又比发泡胶底差,舒适性一般,但是整体做工比较满意,还可以。最后说快递,申通快递就像一个零服务的小作坊,恶心到家。0分。
鞋子的质量和版型都不错,舒适度也比较高。一次满意的购物。
鞋子质量好,价格也很实惠。值得购买。特别是客服米菲,服务态度真的很好,无可挑剔,值得再次购买。米菲很好??
鞋子非常满意,比图片上的还要漂亮,超喜欢,下次还来这家店哦
包装以为是木头哈哈哈?,看着还是挺用心的,鞋子味道挺正,质感也不错,脚感还行,有点硬,估计穿几天几天就好了,一句话,还会再买马登的!
评价果然良心,包装太重了?,上档次,无色差,跟皮鞋码一样,但稍微大一点儿,完美,下次再来,灰色还是挺有气质的
穿着舒服,皮质较软,号和皮鞋一样  我的有点大
鞋子很好,材质摸着很舒服,穿起来感觉走了两步,感觉很有弹性。
鞋子很不错,物美价廉,穿着舒适,大方得体,就这个价位真的已经是物超所值了。店家也很热情,还会再来买的!!!
版型非常好,穿着舒服,就是国庆节物流有点慢,整体都很满意
Process finished with exit code 0
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值