Python的json库使用

  • 什么是json
  • 为什么要学json库
  • json的格式化验证
  • json库如何使用
  • 实际使用


什么是json

JSON(JavaScript Object Notation, JS 对象表示法) 是一种轻量级的数据交换格式。json独立于任何语言,具有自我描述性,更容易理解。相较于XML更小、更快、更易解析。

为什么要学json库

写爬虫时时常遇到一些情况,F12中看的到的内容用requests库请求到的却看不到,很有可能是使用了Ajax,即异步加载json和XML。
XML很容易,他与html格式相同,如同html使用你喜欢的库进一步解析提取有用信息即可,但json的格式不同,需要额外学习。
当然,无关爬虫,json作为一种数据存储格式也是一个不错的选择。
Python的数据格式和json的很像,但类型不一样,转换一下就可以很好的使用和存储。

json的格式化验证

从网页上获取到的json文件不是直接呈现给用户看的,但如果我们只获取了这么一个json,他是一行字符,没错就是一行,所以很难分清他们的嵌套关系。
短一点的可以用这个网站直接格式化,使用折迭一步一步定位到你所需要的信息。而长达十几万字符的,虽然也不是不行,但我更喜欢把他保存到本地json文件里用vscode看,也很方便在各个文件里切换,怎么选择看个人习惯吧。那么vscode的格式化则需要下载一个插件叫做JSON Tools,作者叫Erik Lynd。打开json文件,ctrl+alt+M即可格式化。

json库如何使用

import json

方法

功能

json.dump(obj,fp)

将python数据类型转换并保存的json格式的文件中

json.dumps(obj)

将python数据类型转换为json格式的字符串

json.load(fp)

从json格式的文件中读取数据并转换为python的类型

json.loads(s)

将json格式的字符串转换为python的类型

实际使用

比如bilibili的评论区内容就是用的json格式,通过一些方法,我们拿到了某一视频第一页的内容的链接,https://api.bilibili.com/x/v2/reply?pn=1&type=1&oid=374193461,进一步requests.get()请求到。这是一大串文本,基本是些字典和列表相互嵌套。注意这已经是json格式的了,如果再次使用dump到本地格式化则会多出很多\,所以直接open一个json文件write下来即可

python json库比较内容 python中json库_json


很容易看出这是一个字典嵌套数组,数组我没展开,里面又是一些字典,里面有各种各样的信息,用户名、UID(现在改叫MID了)、性别、个性签名、头像的src、评论内容等等,而我只需要评论内容,直接ctrl+F,得出他在data(dict)-replies(list)-content(dict)-message里,弄清楚他的结构就好办了,用json.loads()或者你用json.load()本地的json文件后,当作Python的数据结构来筛选就行

python json库比较内容 python中json库_json格式_02


实际上bilibili的评论区比这复杂多了,翻页、楼中楼、楼中楼的翻页,更多的就不一一详解了。

接下来讲dump,假如你已经爬完所有的评论,想看看有没有评论有说到bgm是什么,那么直接终端ctrl+F搜关键词bgm就行甚至不用保存到本地,但如果你需要对筛选后的数据进一步处理还是保存到json文件里吧。
为什么不直接txt,,,虽然也可以进一步处理,但是,,,算了我都懒得码字赘述,只能说你喜欢怎么搞就怎么搞好了,你要是愿意存数据库都行。
一般的话,还是存一些k-y流的数据,就是字典嘛

json.dump(dict_title_url,open(path_json,'w',encoding='utf8'),ensure_ascii=False,indent=4)

解释一下,这行代码是我以前用过的

变量名

解释

dict_title_url

一个Python的字典,标题-网址的字典

path_json

保存到本地的路径

‘w’

只写

encoding=‘utf8’

编码报错

ensure_ascii=False

乱码问题

indent=4

格式化

sort_keys=True

没用到,是用来给key排序的,有插件不写也没事

至于json.dumps(),那我是真的不知道有啥用,本身就是Python的数据类型写出json给谁交互啊…