当前位置: 首页 > news >正文

Python爬虫(8)

JsonPath介绍使用

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

pip install jsonpath

官方文档

http://goessner.net/articles/JsonPath

Jsonpath基本语法

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

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

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 字符串

测试代码

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的才是读写文件的。

测试代码

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)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL --- 用户管理
  • C语言 | Leetcode C语言题解之第327题区间和的个数
  • vscode插件中的图标怎么设置
  • 理解Go语言中多种并发模式
  • 2024年6月 青少年机器人技术等级考试理论综合试卷(二级)
  • 文件共享服务NFS(服务名nfs,端口tcp/2049)
  • Codeforces 874 div3 A-G
  • pytorch setattr vs. add_module区别
  • 【日常记录-MySQL】MySQL设置root用户密码
  • 英语文化中的音乐分类及其发展历史(Classical、Jazz、Rock、Pop、Electronic、Country、RB、Hip-Hop)
  • 虚拟dom-Diff算法
  • 通过docker-compose 部署misskey 服务器
  • 开发输出防护栏以检测GPT-4o幻觉
  • 基于springboot3实现单点登录(二):认证服务端搭建
  • 【递归】什么是递归-C语言为例
  • android 一些 utils
  • Bytom交易说明(账户管理模式)
  • canvas 绘制双线技巧
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Markdown 语法简单说明
  • nodejs:开发并发布一个nodejs包
  • php面试题 汇集2
  • rc-form之最单纯情况
  • react-native 安卓真机环境搭建
  • ReactNative开发常用的三方模块
  • Sass Day-01
  • 关于字符编码你应该知道的事情
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 一天一个设计模式之JS实现——适配器模式
  • Java性能优化之JVM GC(垃圾回收机制)
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • $forceUpdate()函数
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (solr系列:一)使用tomcat部署solr服务
  • (vue)页面文件上传获取:action地址
  • (超详细)语音信号处理之特征提取
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (译)2019年前端性能优化清单 — 下篇
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转) Face-Resources
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .“空心村”成因分析及解决对策122344
  • .md即markdown文件的基本常用编写语法
  • .NET MVC第三章、三种传值方式
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .net反混淆脱壳工具de4dot的使用
  • .NET开发人员必知的八个网站
  • .NET框架
  • .net连接oracle数据库
  • .NET业务框架的构建
  • @DataRedisTest测试redis从未如此丝滑