python爬虫之json模块和jsonpath模块(5)

1、json模块

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。JSON是一种取代XML的数据结构,与xml相比,它更小巧,但描述能力却不差。

1.1 模块的导入

json是python的内置模块,可以直接导入,如:
语法格式:import json


扩展:

  1. 官方使用文档:http://docs.python.org/library/json.html

  2. Json在线解析网站:http://www.json.cn/#
    该网站可以将json类型的数据整理成标准格式,方便解析和编辑,除此之外,还有许多好用功能

1.2 json格式原理

JSON就是一串字符串,只不过元素会使用特定的符号标注;简单来说就是由javascript中的对象和数组两种结构组成,通过这两种结构可以表示各种复杂的结构,介绍如下:

  1. 对象
    对象在js中表示为{ }括起来的内容,数据结构为 { key:value, key:value, ... }的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是数字、字符串、数组、对象这几种。
  2. 数组
    数组在js中是中括号[ ]括起来的内容,数据结构为 ["Python", "javascript", "C++", ...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。

1.3 json模块的使用

json模块提供了四个功能:dumpsdumploadsload,用于字符串 和 python数据类型间进行转换。

1.3.1 json.loads()方法

作用:把json格式的字符串转为Python数据类型

# 导入模块
import json

# json中数组结构的字符串
strList = '[1, 2, 3, 4]'
# 将json中数组结构的字符串转为python中列表类型的数据
res1 = json.loads(strList)
print(res1) # 输出结果:[1, 2, 3, 4]
print(type(res1)) # 输出结果:<class 'list'> 

# json中对象结构的字符串
strDict = '{"city": "北京", "name": "大猫"}'
# 将json中对像结构的字符串转为python中字典类型的数据
res2 = json.loads(strDict)
print(res2) # 输出结果:{'city': '北京', 'name': '大猫'}
print(type(res2)) # 输出结果:<class 'dict'>

1.3.2. json.dumps()方法

作用:把 python 类型的数据 转为 json 类型的字符串

# 导入模块
import json

# python中字典类型的数据
item = {'name':'QQ','app_id':1}

# 将其转为json字符串
res = json.dumps(item)
print(res) # 输出结果:{"name": "QQ", "app_id": 1}
print(type(res)) # 输出结果:<class 'str'>
# 可以看到转换后的字典数据,虽然形式上看起来还是字典,
# 但实际上他的数据类型已经变为字符串了

1.3.3. json.dump()方法

作用:把python数据类型转为 json格式的字符串
该方法一般用于保存数据,进行文件操作的时候使用

# 导入模块
import json

# python中的字典数据
item = {'name': 'QQ', 'app_id': 1}
# 将字典数据保存为json格式的字符串
with open('小米.json','a') as f:
    json.dump(item, f)

1.3.4. json.load() 方法

作用:读取存放json类型数据的文件,并将json数据转为python类型的数据

# 导入模块
import json

# 读取json文件数据,并将其转为python类型的数据
with open('D:\\spider_test\\xiaomi.json','r') as f:
    data = json.load(f)

# 打印转换后的数据    
print(data)

1.4 json模块总结

  1. 爬虫最常用json模块方法
    1.1、数据抓取 - json.loads(html)
    将响应内容由: json 转为 python
    1.2、数据保存 - json.dump(item_list,f)
    将抓取的数据保存到本地 json文件

  2. 爬虫抓取数据常用保存方式
    1、txt文件
    2、csv文件
    3、Excel文件
    4、json文件
    5、MySQL数据库
    6、MongoDB数据库
    7、Redis数据库

2、JsonPath模块(了解)

JsonPath 是一种信息抽取类库,是从JSON类型文档中抽取指定信息的工具,多种编程语言都拥有该库,包括:Javascript, Python, PHP 和 Java。

2.1 模块的下载

JsonPath 对于 JSON 来说,相当于 XPATH 对于 XML。它是一个第三方库需要下载才能使用;方法如下:

  1. 方法1(推荐):pip 下载
    命令:pip install jsonpath

  2. 方法2(不推荐):官网下载
    下载地址:https://pypi.python.org/pypi/jsonpath
    安装方法:
    1、通过上方地址,下载好jsonpath的安装包
    2、将下载好的压缩包解压之后执行其中的 python setup.py install

官方使用文档:http://goessner.net/articles/JsonPath

2.2 JsonPath与XPath语法对比

Json结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。

XPathJSONPath描述
/$根节点
.@现行节点
/.or[]取子节点
..取父节点,Jsonpath未支持
//..就是不管位置,选择所有符合条件的条件
**匹配所有元素节点
@根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要。
[][]迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
|[,]支持迭代器中做多选。
[]?()支持过滤操作.
()支持表达式计算
()分组,JsonPath不支持

2.2 jsonpath模块的使用

jsonpath模块通常用于解析爬取的json类型的网站数据,我们只需要掌握基本的方法即可,不需要学习所有的语法。

基本使用步骤:

  1. 导入jsonpath模块下的jsonpath方法

语法格式:from jsonpath import jsonpath

  1. 使用jsonpath方法获取json数据的内容;其中$ 表示根节点,.. 表示跳过任意层级,. 表示下一个层级

语法格式:jsonpath(目标数据,'语法规则')

如:

# 导入模块
from jsonpath import jsonpath
# 目标数据
data = {'state': 1, 'message': 'success', 'content': {'data': {'allCitySearchLabels': {'A': [{'id': 723, 'name': '安阳', 'parentId': 545, 'code': '171500000', 'isSelected': False}]}}}}
# 获取json数据中name对应的值
res = jsonpath(data,'$..name') # 使用jsonpath下的$..title规则,直接拿到内层嵌套的title对应的内容
print(res) # 输出结果:['安阳']

扩展

因为jsonpath会将解析到的所有数据以列表的形式返回,所以当使用 $..title规则进行匹配时,会将所有符合规则的内容返回;这时若只想得到其中一个数据,则需要先查询到其上一级,在通过 .键 的方式得到对应当额值

# 导入模块
from jsonpath import jsonpath
# 目标数据
data = {'state': 1, 'message': 'success', 'content': {'data': {'allCitySearchLabels': {'A': [{'id': 723, 'name': '安阳', 'parentId': 545, 'code': '171500000', 'isSelected': False}]}}}}
# 获取json数据中的id对应的值
res = jsonpath(data,'$..A[0].id')
print(res)

总结:

  1. jsonpath方法可以直接无视json格式数据的嵌套,通过规则;直接用字典取值的方式,求得其中所有对应的的内容,并以列表形式返回;若没有数据则返回False
  2. 我们获取的网页数据都是字符串,只是有的是json格式的字符串,而jsonpath解析的就是这种格式的字符串;但jsonpath是python的模块,所以在使用前需要将json格式的字符串转为python的数据对象,然后就可以用jsonpath方法对其进行解析了

案例

我们以拉勾网城市JSON文件 http://www.lagou.com/lbs/getAllCitySearchLabels.json 为例,获取所有城市。

# 导入模块
import requests
import jsonpath
import json

# 目标站点:得到该链接下所有城市的名称
url = 'http://www.lagou.com/lbs/getAllCitySearchLabels.json'
# 身份信息
h = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.43',
    'cookie':'sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218a5deea8cf458-0ff8c1fd272813-7f5d5470-1327104-18a5deea8d011d6%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_utm_source%22%3A%22m_cf_seo_zyj_zhw%22%2C%22%24os%22%3A%22Windows%22%2C%22%24browser%22%3A%22Chrome%22%2C%22%24browser_version%22%3A%22116.0.0.0%22%7D%2C%22%24device_id%22%3A%2218a5deea8cf458-0ff8c1fd272813-7f5d5470-1327104-18a5deea8d011d6%22%7D; LGUID=20230904100357-a6c77e57-1b9c-4a1d-9ca0-638785c9980d; JSESSIONID=ABAABJAABCDABBCDB4685DEF3AB7F49925A4292349016A7'
}
# 请求数据
response = requests.get(url,headers=h)
# 得到源码字符串数据
html = response.text

# 把json格式字符串转换成python对象
jsonobj = json.loads(html)
print(jsonobj)

# 利用jsonpath模块中的方法,从根节点开始,匹配name节点,得到name对应的值
citylist = jsonpath.jsonpath(jsonobj,'$..name')
print (citylist)
print (type(citylist))

# 保存数据
# 1、生成文件对象
fp = open('city.json','w',encoding='utf-8')
# 将得到的数据转为json类型
content = json.dumps(citylist, ensure_ascii=False)
print(content)
# 将内容存入文件中
fp.write(content)
# 关闭文件
fp.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盲敲代码的阿豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值