python爬虫难点解析——动态json数据处理
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")) #输出结果: 路人甲
- python爬虫解析库(Xpath、beautiful soup、Jsonpath)
- python爬虫解析json
- Python 3爬虫网易云(七)—— JSON简介与解析
- python爬虫解析json数据报错(unicode error) 'utf-8' codec can't decode byte 0xbb in position 0
- 神箭手云爬虫-爬取携程【国际】航班/机票信息-利用python解析返回的json文件将信息存储进Mysql数据库
- python爬虫 如何解析json文件 json文件的解析提取和jsonpath的应用
- python爬虫4——json数据处理
- python爬虫(爬取豆瓣电影)_动态网页,json解释,中文编码
- Python爬虫解析多级嵌套json
- Java 和 Python 解析动态 key 的 JSON 数据
- python爬虫--python解析json
- Python3.X 爬虫实战(动态页面爬取解析)
- Python爬虫——web前端基础XPath、Json和HTTP
- python爬虫:不同解析网页方式添加报头
- python并发爬虫实用工具tomorrow实用解析
- python-Json模块【解析Json】
- Python 解析 json 对象
- Python爬虫进阶必备 | RSA 加密案例解析汇总(一)
- Python解析Json数据小结
- java动态JSON数据解析