找回密码
 会员注册
查看: 30|回复: 0

Python爬虫(8)

[复制链接]

4

主题

0

回帖

13

积分

新手上路

积分
13
发表于 2024-9-9 09:04:10 | 显示全部楼层 |阅读模式
JsonPath介绍使用JsonPath是一种轻量级的查询库,可以从JSON文本数据中进行筛选和提取操作。有点类似于使用XPath在HTML数据中提取数据的功能。JsonPath也可以通过使用类似于XPath的表达式来访问JSON对象中的属性和元素,并支持通配符、筛选器和函数等操作。安装命令pipinstalljsonpath1官方文档http://goessner.net/articles/JsonPath1Jsonpath基本语法语法命令语法描述$json数据的根节点@json数据的当前节点.或[]获取当前节点的子节点…选取任意位置下符合条件的数据,用于跨界点获取数据*获取当前节点下的所有元素[]迭代器标示,用于选取数组下标[,]迭代器中可以输入多个索引值来选择数据?()可以进行过滤操作()支持表达式计算使用jsonpath筛选豆瓣的jjson数据:importrequestsfromjsonpathimportjsonpath#1、用户代理的构造headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/104.0.0.0Safari/537.36"}#2、确认目标urlurl="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、对列表中的数据进行遍历forjsoninjson_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)12345678910111213141516171819202122232425262728293031323334353637Json数据格式转换json数据的格式转换是使用json模块中的loads和dumps方法来进行实现。Json字符串===>json.loads()===>ython字典类型Python字典类型===>json.dumps()===>Json字符串测试代码importjson#1、定义json数据(json数据本质上是一个字符串)#这里建议先格式化json字符串的内容后(运用spidetools),再运行movie_data='''{"rating":["9.6","50"],"rank":1,"cover_url":"https://img2.doubanio.com\/view\/photo\/s_ratio_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)1234567891011121314151617181920212223Json文件的读与写json文件的读写与格式转换非常相似,也是使用json模块中的load和dump方法来进行实现。Json文件===>json.load()===>ython字典类型Python字典类型===>json.dump()===>Json文件PS:在对json文件进行读写时需要注意load、loads、dump、dumps的区分。其中带s的是用于转换格式的,不带s的才是读写文件的。测试代码importjsonimportrequests#1、用户代理的构造headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/104.0.0.0Safari/537.36"}#2、确认目标urlurl="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字符串写入到文件中(设置中文不进行编码)withopen('movie_data.json','w',encoding='utf-8')asfile: json.dump(response.json(),file,ensure_ascii=False)#5、读取json文件的字符串数据withopen('movie_data.json','r',encoding='utf-8')asfile: json_data=json.load(file)print('输出的格式为:',type(json_data))print('输出的内容为:',json_data)1234567891011121314151617181920
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 23:15 , Processed in 0.470850 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表