JSON数据提取

JSON 数据提取

JSON 数据格式

定义

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。

作用

获取方式

  • ajax 请求接口
  • 切换手机移动h5端
  • app抓包获取
  • 等等

格式化方式

  • 安装 chrome 插件 JSONView
  • 在chrome中的请求详情中使用 preview 查看
  • 使用在线JSON格式化工具,例如:https://www.bejson.com/

JSON 模块使用

方法介绍

  • json.loads json字符串 转 Python数据类型
  • json.dumps Python数据类型 转 json字符串
  • json.load json文件 转 Python数据类型
  • json.dump Python数据类型 转 json文件
    • ensure_ascii=False 实现让中文写入的时候保持为中文
    • indent=空格数 通过空格的数量进行缩紧

代码演练

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 导入模块
import json
# json.loads json字符串 转 Python数据类型
json_string = '''
{
"name": "crise",
"age": 18,
"parents": {
"monther": "妈妈",
"father": "爸爸"
}
}
'''
print("json_string数据类型:",type(json_string))
data = json.loads(json_string)
print("data数据类型:",type(data))
print(data)
print("*" * 100)
# json.dumps Python数据类型 转 json字符串
data = {
"name": "crise",
"age": 18,
"parents": {
"monther": "妈妈",
"father": "爸爸"
}
}
print("data数据类型:",type(data))
json_string = json.dumps(data)
print("json_string数据类型:",type(json_string))
print(json_string)
print("*"*100)
# json.load json文件 转 Python数据类型
with open('data.json','r',encoding='utf-8') as f:
data = json.load(f)
print("data数据类型:", type(data))
print(data)
print("*"*100)
# json.dump Python数据类型 转 json文件
data = {
"name": "crise",
"age": 18,
"parents": {
"monther": "妈妈",
"father": "爸爸"
}
}
with open('data_out.json','w',encoding='utf-8') as f:
json.dump(data,f,ensure_ascii=False,indent=2)

JsonPath

介绍

用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java。
本质: 通过一种语法规则快速从 JSON 数据中提取数据。类似于 正则表达式 通过一定规则从 text 文本内容提取数据。

环境搭建

在线调试地址
在线调试环境说明
调试测试数据
{
"store": {
"book": [
{ "category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{ "category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{ "category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}

语法规则

语法
描述
案例
$
根节点
@
现行节点
.
取子节点
$.store.book
..
取子孙节点
$..book
[]
设置筛选条件
$..book[0]
[,]
支持多选选择内容
$..book[1,3]
()
支持表达式计算
$..book[(@.length - 1)]
?()
支持过滤操作
$..book[?(@.price<10)]

jsonpath 代码演练

模块安装
pip install jsonpath
需求
http://www.lagou.com/lbs/getAllCitySearchLabels.json 接口返回数据中提取所有的城市信息
实现步骤
  1. 1.
    网络获取数据
  2. 2.
    把响应数据转换成python数据类型
  3. 3.
    使用 jsonpath 提取数据

代码实现

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 网络获取数据
import requests
import json
import jsonpath
url = "http://www.lagou.com/lbs/getAllCitySearchLabels.json"
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
response = requests.get(url,headers=headers)
html = response.text
print(html)
# 把响应数据转换成python数据类型
data = json.loads(html)
# 使用 jsonpath 提取数据
cities = jsonpath.jsonpath(data,'$..name')
print(cities)

总结

  • JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式
  • JSON相关的方法
    • json.loads json字符串 转 Python数据类型
    • json.dumps Python数据类型 转 json字符串
    • json.load json文件 转 Python数据类型
    • json.dump Python数据类型 转 json文件
  • jsonpath 是一种语法规则快速从 JSON 数据中提取数据。
  • jsonpath 基本语法
    • $ 根节点
    • . 下一个节点
    • .. 子孙节点
    • [] 筛选条件,可以编写下标