Python爬虫(8)

JsonPath介绍使用

JsonPath是一种轻量级的查询库,可以从JSON文本数据中进行筛选和提取操作。有点类似于使用XPath在HTML数据中提取数据的功能。JsonPath 也可以通过使用类似于 XPath 的表达式来访问 JSON对象中的属性和元素,并支持通配符、筛选器和函数等操作。

安装命令

python 复制代码
pip install jsonpath

官方文档

python 复制代码
http://goessner.net/articles/JsonPath

Jsonpath基本语法

语法命令 语法描述
$ json数据的根节点
@ json数据的当前节点
.或[] 获取当前节点的子节点
... 选取任意位置下符合条件的数据,用于跨界点获取数据
* 获取当前节点下的所有元素
[] 迭代器标示,用于选取数组下标
[,] 迭代器中可以输入多个索引值来选择数据
?() 可以进行过滤操作
() 支持表达式计算

使用jsonpath筛选豆瓣的jjson数据:

python 复制代码
import requests
from jsonpath import jsonpath
# 1、用户代理的构造
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
# 2、确认目标url
url = "https://movie.douban.com/j/chart/top_list?
type=24&interval_id=100%3A90&action=&start=0&limit=20"
# 3、发送网络请求,获取响应对象
response = requests.get(url, headers=headers)
# 4、将响应的数据以json格式展示
json_data = response.json()
# print(json_data) 字典数据存放在列表中
# 5、对列表中的数据进行遍历
for json in json_data:
	print('=========================================================')
	# 6、对json数据进行筛选
	# 筛选出title信息,并取出值
	title = jsonpath(json, '$..title')[0]
	print('电影名称:', title)
	# 筛选电影评分
	score = jsonpath(json, '$..score')[0]
	print('电影评分:', score)
	# 筛选电影标签(列表数据)
	types = jsonpath(json, '$..types[*]') # 全部数据
	# types = jsonpath(json, '$..types[0,1]') # 范围数据
	# types = jsonpath(json, '$..types[(@.length-1)]')[0] # 最后一个数据
	print('电影标签:', types)
	# 筛选电影演员(列表数据)
	actors = jsonpath(json, '$..actors.*')
	print('电影演员:', actors)
	print('=========================================================')
# 从所有电影中筛选出演员人数大于40的电影数据
movie_list = jsonpath(json_data, '$..?(@.actor_count>40)')
print('电影人数大于40的电影:', movie_list)

Json数据格式转换

json数据的格式转换是使用json模块中的loads和dumps方法来进行实现。

Json字符串 ===>json.loads() ===>Python字典类型

Python 字典类型 ===> json.dumps() ===> Json 字符串

测试代码

python 复制代码
import json
# 1、定义json数据(json数据本质上是一个字符串)
# 这里建议先格式化json字符串的内容后(运用spidetools),再运行
movie_data = '''{"rating":
["9.6","50"],"rank":1,"cover_url":"https://img2.doubanio.com\/view\/photo\/s_rat
io_poster\/public\/p2578474613.webp","is_playable":true,"id":"1292063","types":
["剧情","喜剧","爱情","战争"],"regions":["意大利"],"title":"美丽人
生","url":"https:\/\/movie.douban.com\/subject\/1292063\/","release_date":"2020-
01-03","actor_count":29,"vote_count":1336248,"score":"9.6","actors":["罗伯托·贝尼
尼","尼可莱塔·布拉斯基","乔治·坎塔里尼","朱斯蒂诺·杜拉诺","赛尔乔·比尼·布斯特里克","玛丽萨·帕
雷德斯","霍斯特·布赫霍尔茨","利迪娅·阿方西","朱利亚娜·洛约迪切","亚美利哥·丰塔尼","彼得·德·席
尔瓦","弗朗西斯·古佐","拉法埃拉·莱博罗尼","克劳迪奥·阿方西","吉尔·巴罗尼","马西莫·比安
奇","恩尼奥·孔萨尔维","吉安卡尔洛·科森蒂诺","阿伦·克雷格","汉尼斯·赫尔曼","弗兰科·梅斯科利
尼","安东尼奥·普雷斯特","吉娜·诺维勒","理查德·塞梅尔","安德烈提多娜","迪尔克·范登贝格","奥梅
罗·安东努蒂","沈晓谦","张欣"],"is_watched":false}'''
# 2、将json转换为字典数据
dict_data = json.loads(movie_data)
print('数据类型为:', type(dict_data))
print('数据内容为:', dict_data)
# 3、将字典转换为json数据(中文会默认进行编码)
json_data = json.dumps(dict_data, ensure_ascii=False)
print('数据类型为:', type(json_data))
print('数据内容为:', json_data)

Json文件的读与写

json文件的读写与格式转换非常相似,也是使用json模块中的load和dump方法来进行实现。

Json 文件 ===> json.load() ===> Python 字典类型

Python 字典类型 ===> json.dump() ===> Json 文件

PS:

在对json文件进行读写时需要注意 load、loads 、dump、dumps的区分。其中带s的是用于转换格式的,不带s的才是读写文件的。

测试代码

python 复制代码
import json
import requests
# 1、用户代理的构造
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
# 2、确认目标url
url = "https://movie.douban.com/j/chart/top_list?
type=24&interval_id=100%3A90&action=&start=0&limit=20"
# 3、发送网络请求,获取响应对象
response = requests.get(url, headers=headers)
# 4、将json字符串写入到文件中(设置中文不进行编码)
with open('movie_data.json', 'w', encoding='utf-8') as file:
	json.dump(response.json(), file, ensure_ascii=False)
# 5、读取json文件的字符串数据
with open('movie_data.json', 'r', encoding='utf-8') as file:
	json_data = json.load(file)
print('输出的格式为:', type(json_data))
print('输出的内容为:', json_data)
相关推荐
wrx繁星点点13 分钟前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
真的想不出名儿17 分钟前
Java基础——反射
java·开发语言
努力编程的阿伟36 分钟前
【Java SE语法】抽象类(abstract class)和接口(interface)有什么异同?
java·开发语言
丕羽37 分钟前
【Pytorch】基本语法
人工智能·pytorch·python
包饭厅咸鱼1 小时前
QML----复制指定下标的ListModel数据
开发语言·数据库
bryant_meng1 小时前
【python】Distribution
开发语言·python·分布函数·常用分布
红黑色的圣西罗1 小时前
Lua 怎么解决闭包内存泄漏问题
开发语言·lua
yanlou2331 小时前
KMP算法,next数组详解(c++)
开发语言·c++·kmp算法
小林熬夜学编程1 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
墨墨祺1 小时前
嵌入式之C语言(基础篇)
c语言·开发语言