您的位置:首页 > 编程语言 > Python开发

python爬虫难点解析——动态json数据处理

2020-06-03 05:47 781 查看

python爬虫难点解析——动态json数据处理

前言

在前面爬取诸多案例,我们已经学会了怎么处理静态的html。但是还有许多常见的动态数据,比如比赛的实时弹幕,商品的评论数据,电影的评分等等,这些数据是会经常繁盛改变的呃,很多网站就会用到JSon来传输数据。

因为Json非常轻量,它是使用key-value键值对的形式封装成对象,就像python的字典一样。

那么Json数据怎么处理呢,这次以一个实战为例,告诉你怎么处理Json数据

json数据格式介绍

JSON(JavaScript object Notation JavaScript对象表示法)是一种轻量级的数据交换格式

JSON建构于两种结构:json是JavaScript中的对象和数组中的对象,本质上来讲就是有特定结构的字符串,所以可以通过这两种结构表示各种复杂的结构

1.对象:对象在js中表示为“{}”括起来的内容,数据结构为{key:vaue,key:value…}的键值对结构,在面向对象的语言中,key为对象的属性,value为对应属性的值。所以很容易去理解。属性值value可以是数字 字符串 数组 对象

2.数组:数组在js中是中括号“[ ]”括起来的内容,数据结构为[ “java”,“javascript”,“vb”……]取值方式和所有语言一样 通过索引去获取,字段值的类型是:数字 字符串 数组 对象等

简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比”名称 / 值对”更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。

按照最简单的形式,可以用下面这样的 JSON 表示 “名称 / 值对” :{ “firstName”: “Brett” }
当需要表示一组值时,JSON 不但能够提高可读性,而且可以减少复杂性。

如:
{

"people":[

{"firstName": "111", ....},

{"firstName": "222",...},

{"firstName": "333",...}

]}

准备数据

以微信好友列表为例,打开微信网页版https://wx2.qq.com/,使用Chrome抓包可以查看具体的返回数据

可以看出,微信的每个好友都被封装成一个一个Json对象,最后被封装成Json数组,也就是MemberList。

具体的一个好友数据:

{
"Uin":0,
"UserName":"13482d24214c3971d9f8c352525c",
"NickName":"路人甲",
"HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=500080&username=@c482d142bc698bc3971d9f8c26335c5c&skey=@crypt_b0f5e54e_b80a5e6dffebd14896dc9c72049712bf",
"ContactFlag":1,
"MemberCount":1,
"MemberList":[

],
"RemarkName":"",
"HideInputBarFlag":0,
"Sex":1,
"Signature":"",
"VerifyFlag":0,
"OwnerUin":0,
"PYInitial":"XSB",
"PYQuanPin":"xiaoshuaib",
"RemarkPYInitial":"",
"RemarkPYQuanPin":"",
"StarFriend":0,
"AppAccountFlag":0,
"Statues":0,
"AttrStatus":91131,
"Province":"广东",
"City":"广州",
"Alias":"",
"SnsFlag":48,
"UniFriend":0,
"DisplayName":"",
"ChatRoomId":0,
"KeyWord":"che",
"EncryChatRoomId":"",
"IsOwner":0
}

在这个Json对象里面有很多好友的信息。如头像,昵称,性别等

处理数据

对于Json数据的处理,python给我们提供了一个Json模块进行处理。Json模块主要有两个函数json.dumps()和json.loads()

提示:
所谓类文件对象指那些具有read()或者 write()方法的对象,例如,f = open(‘a.txt’,‘r’),其中的f有read()方法,所以f就是类文件对象。

json.dumps()

json.dumps()函数功能是将python对象转化为json

import json

data = {
'name': 'pengjunlee',
'age': 32,
'vip': True,
'address': {'province': 'GuangDong', 'city': 'ShenZhen'}
}

#将python字典类型转换为Json对象
json_str = json.dumps(data)
print(json_str)
#输出结果:{"name": "pengjunlee", "age": 32, "vip": true, "address": {"province": "GuangDong", "city": "ShenZhen"}}

json.loads()

json.loads()函数功能是将json数据转化为python对象
例如:

import json
jsondata = """
{
"Uin":0,
"UserName":"13482d24214c3971d9f8c352525c",
"NickName":"路人甲",
"HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=500080&username=@c482d142bc698bc3971d9f8c26335c5c&skey=@crypt_b0f5e54e_b80a5e6dffebd14896dc9c72049712bf",
"ContactFlag":1,
"MemberCount":1,
"MemberList":[

],
"RemarkName":"",
"HideInputBarFlag":0,
"Sex":1,
"Signature":"",
"VerifyFlag":0,
"OwnerUin":0,
"PYInitial":"XSB",
"PYQuanPin":"xiaoshuaib",
"RemarkPYInitial":"",
"RemarkPYQuanPin":"",
"StarFriend":0,
"AppAccountFlag":0,
"Statues":0,
"AttrStatus":91131,
"Province":"广东",
"City":"广州",
"Alias":"",
"SnsFlag":48,
"UniFriend":0,
"DisplayName":"",
"ChatRoomId":0,
"KeyWord":"che",
"EncryChatRoomId":"",
"IsOwner":0
}"""
#member 转换成python可以使用的字典对象
member = json.loads(jsondata)

#获取昵称
print(member.get("NickName"))
#输出结果:   路人甲

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: