【Python从入门到进阶】31、使用JSONPath解析淘票票网站地区接口数据

news2024/11/27 14:35:21

接上篇《30、JSONPath的介绍和使用》
上一篇我们介绍了JSONPath的基础和具体使用,本篇我们来具体使用JSONPath,来解析淘票票网站的地区接口数据。

一、引言

1、JsonPath的作用和用途?

JsonPath是一种用于在JSON数据中进行查询和提取的表达式语言。它提供了一种简洁且灵活的方式来定位和访问JSON数据结构中的特定字段或信息,用于在JSON数据中定位、提取和操作所需的信息,类似于XPath用于XML的作用。它广泛应用于数据解析、API测试、数据过滤和转换等领域,为处理JSON数据提供了便捷和灵活的方式。

2、为什么选择淘票票网站地区接口数据作为示例?


选择淘票票网站地区接口数据作为示例有以下几个原因:

(1)实际应用性:淘票票是一个广泛使用的在线电影票预订平台,它的首页提供了一个选择所在地区的组件。通过解析该地区接口数据,童鞋们可以学习如何从真实的数据源中提取所需的信息,这与我们在日常项目中可能会遇到的情况相符。
(2)数据结构复杂性:淘票票网站的地区接口数据具有嵌套的JSON结构,其中包含不同层级的地区信息。通过解析这样的复杂数据结构,童鞋们可以学习如何处理和导航嵌套的JSON数据,并运用JsonPath表达式从中提取特定字段或信息。
(3)普适性:JsonPath是一种用于查询和提取JSON数据的通用工具,不依赖于特定的数据源或领域。通过使用淘票票网站的地区接口数据作为示例,童鞋们可以了解和掌握JsonPath的基本用法,然后将其应用于各种其他JSON数据的解析和操作场景。

综上所述,选择淘票票网站地区接口数据作为示例旨在提供一个实际、复杂且普适的数据源,以帮助读者更好地理解和应用JsonPath的解析能力。

二、淘票票网站地区接口简介

1、提供的API接口及其功能

我们打开淘票票网站首页(https://dianying.taobao.com/),可以看到最上面Logo右侧有一个地区的名称(默认是当前访问者网络所在地区):

点击该地区,下面会出现可供选择的所有地区,以拼音字母A-Z排序:

我们F12打开浏览器的开发者接口,选择“网络”或“NetWork”,然后重新刷新页面:

然后清空刷新页面后产生的请求数据:

然后鼠标第一次放在区域组件上面,就会看到网络控制台出现一个API接口调用记录:

这个“cityAction”就是获取所有地区的接口。他的请求头内容如下(包含地址,请求方式等):

这是一个get请求,请求参数如下:

其中“event_submit_doGetAllRegion”是一个重要参数,他决定服务端返不返回全部的地区信息,true是返回所有地区信息,false则不返回。
请求响应的信息如下:

可以看到确实是所有地区的json结构数据。

2、接口返回的数据结构和格式

我们单独将返回信息拷贝出来,因为json数据有两千多行,这里仅分析前半段结构(这里需要先把外面包裹的一层“jsonp129()”去除,因为其不是json结构中的内容):


这里我们要获取的目标是returnValue对象中的内容,而returnValue对象中又分为A-Z的子属性,每个子属性中有一个数组,数组的每个对象中的regionName就是以其父亲子属性名称为其拼音第一个首字母的地区名字。
如果我们使用python数据对象获取第一个地区的信息,大概是下面这样:

resultData.returnValue['A'][0].regionName

不过下面我们要通过jsonpath来实现类似的效果。

三、选择合适的库执行JsonPath解析

在Python中,有几个流行的库可以用于执行JsonPath解析操作。以下是其中一些选择和简要介绍:

●jsonpath-ng:这是一个功能强大的JsonPath库,提供了广泛的JsonPath表达式支持和灵活的查询功能。它具有较好的性能和完善的文档,易于使用。
●jsonpath_rw:这个库提供了一种基于类似XPath的语法的JsonPath实现。它支持元数据过滤和复杂的查询操作,适合处理大型JSON数据集。
●jsonpath:这是一个简单和轻量级的JsonPath库,适用于小规模的JsonPath查询。它易于使用,并且不需要额外的依赖。
●pyjq:虽然名字带有 "jq",但它实际上是一个能够使用JsonPath表达式进行高效查询的Python接口。它使用libjq C库的绑定,可以处理大型JSON数据集。
●jq 命令行工具:如果你更喜欢使用命令行工具而不是直接在Python代码中解析JsonPath,那么可以考虑使用jq工具。它是一个功能强大的命令行JSON处理工具,支持JsonPath语法以及其他强大的查询和转换功能。

根据项目的需求,我们不需要很复杂的jsonpath操作,可以选择轻量级的JsonPath库来实现本次需求。

四、动手解析淘票票网站地区接口数据

我们要保留好刚刚刷新淘票票地区接口的head信息,便于我们模拟浏览器操作,获取API接口数据。

创建好一个空白python文件后,首先我们引入json、urllib.request库和jsonpath库(没有安装jsonpath的话,可以在控制台执行“pip install jsonpath”命令安装):

import json
import urllib.request
from jsonpath import jsonpath

然后我们要通过urllib访问API,所以需要定义好url地址以及head头信息:

# 淘票票地区信息的API接口地址
url = "https://dianying.taobao.com/cityAction.json?activityId&_ksTS=1691221344373_128&jsoncallback=jsonp129&action" \
      "=cityAction&n_s=new&event_submit_doGetAllRegion=true"

# 请求头,需要Referer和Cookie
headers = {
    'Referer': 'https://dianying.taobao.com/',
    'Cookie': 't=c670bce12ae0f97a0d938e29a62f5fcd; cookie2=162530e99a5874e274c23b700d4e500f; v=0; '
              '_tb_token_=ee436331b88eb; cna=iYk3HY1ehAgCAX0uVUKT1YXd; xlly_s=1; '
              'isg=BICAfBKZ8I5LvYyLxEmbkMJCUQ5SCWTTjZih_foRLRsudSCfoxmOYxnLjd21RRyr; '
              'tfstk=dEYHnE2ckHSC6jOoEyQIJr'
              '-ZAkiOAJ_5bLUReaBrbOW6yBnBw4ukIKszyD_dqavNBeBp9wPBfKd4JenCyzbCPakxHq3A9B_'
              '5zOhskq32trKIHx3xkDPNrvDvyCN9ZGwIrmBoPElhDtVuKKfF0xZ1nBWgoCTNTBrBTOmtXFxGxOW0bo5vqz1ZwFr7VM51stCvPW3G.; '
              'l=fBOjVyfmNeIm63VjBOfZnurza779GIRAguPzaNbMi9fPOkCH5PuAW1OIkHTMCn'
              'GVFsV6J38PiVPBBeYBqlYsjqj4axom4PHmnmOk-Wf..',

}

这里的Referer和cookie是必须的,否则服务器会校验失败无法返回数据:

然后我们构建request对象,发送http请求,获取返回内容并打印:

# 创建request请求对象
req = urllib.request.Request(url=url, headers=headers)
# 发送HTTP请求并获取响应信息对象
response = urllib.request.urlopen(req)


# 获取响应的数据
content = response.read().decode('utf-8')
print(content)

运行程序我们会得到还没有解析的json数据:

那么接下来我们的目标,就是解析除我们获取到的中国所有地区名称
首先我先解决一个问题,就是把结果外面包裹的一层“jsonp129()”去除,这个我们使用python普通的字符串分割即可:

content = content.split('(')[1].split('(')[0]
content = content.replace(');', '')
print(content)

这里是先通过前括号分割,分割出“jsonp129”和后面带“)”的内容,然后取后面带“)”的内容再分割一次,左边第一个就是“jsonp129()”内部的内容了,然后再将最后的“);”字符替换为空字符(相当于去除它),就可以得到中间的json内容了。
两次分割和一次替换后的效果:

然后我们把解析出的内容,拷贝到jsonpath分析工具上(在线版地址https://www.lddgo.net/string/jsonpath),然后准备测试我们的jsonpath解析语句:

我们要获取地区名称,首先要获取returnValue节点,然后获取到该节点的所有子元素,然后获取所有子元素中的regionName内容即可,所以这个jsonpath语句如下:

$.returnValue.*[*].regionName

效果:

如果获取某个首字母地区的,将第二层数据的*,改为需要的首字母,如获取C开头的地区,语法为:

$.returnValue.C[*].regionName

效果:

既然已经获验证语法正确了,我们就延续上面的代码,写出python版本的jsonpath解析:

# 解析 JSON 数据
json_data = json.loads(content)

# 进行 JSONPath 查询
regionNames = jsonpath(json_data, "$.returnValue.C[*].regionName")

# 打印匹配结果
for regionName in regionNames:
    print(regionName)

运行效果:

我们可以看到成功打印出了C开头的所有地区名称。
完整代码如下:

# _*_ coding : utf-8 _*_
# @Time : 2023-08-05 16:04
# @Author : 光仔December
# @File : jsonpath解析淘票票地区信息
# @Project : Python基础

import json
import urllib.request

from jsonpath import jsonpath

# 淘票票地区信息的API接口地址
url = "https://dianying.taobao.com/cityAction.json?activityId&_ksTS=1691221344373_128&jsoncallback=jsonp129&action" \
      "=cityAction&n_s=new&event_submit_doGetAllRegion=true"

# 请求头,需要Referer和Cookie
headers = {
    'Referer': 'https://dianying.taobao.com/',
    'Cookie': 't=c670bce12ae0f97a0d938e29a62f5fcd; cookie2=162530e99a5874e274c23b700d4e500f; v=0; '
              '_tb_token_=ee436331b88eb; cna=iYk3HY1ehAgCAX0uVUKT1YXd; xlly_s=1; '
              'isg=BICAfBKZ8I5LvYyLxEmbkMJCUQ5SCWTTjZih_foRLRsudSCfoxmOYxnLjd21RRyr; '
              'tfstk=dEYHnE2ckHSC6jOoEyQIJr'
              '-ZAkiOAJ_5bLUReaBrbOW6yBnBw4ukIKszyD_dqavNBeBp9wPBfKd4JenCyzbCPakxHq3A9B_'
              '5zOhskq32trKIHx3xkDPNrvDvyCN9ZGwIrmBoPElhDtVuKKfF0xZ1nBWgoCTNTBrBTOmtXFxGxOW0bo5vqz1ZwFr7VM51stCvPW3G.; '
              'l=fBOjVyfmNeIm63VjBOfZnurza779GIRAguPzaNbMi9fPOkCH5PuAW1OIkHTMCn'
              'GVFsV6J38PiVPBBeYBqlYsjqj4axom4PHmnmOk-Wf..',

}

# 创建request请求对象
req = urllib.request.Request(url=url, headers=headers)
# 发送HTTP请求并获取响应信息对象
response = urllib.request.urlopen(req)

# 获取响应的数据
content = response.read().decode('utf-8')
content = content.split('(')[1].split('(')[0]
content = content.replace(');', '')
print(content)

# 解析 JSON 数据
json_data = json.loads(content)

# 进行 JSONPath 查询
regionNames = jsonpath(json_data, "$.returnValue.C[*].regionName")

# 打印匹配结果
for regionName in regionNames:
    print(regionName)

五、解析过程总结

从淘票票网站地区接口数据中提取信息的过程可以简要总结为以下几个步骤:
1、发起API请求:构建正确的API请求,包括URL、请求方法和必要的参数。
2、获取响应数据:发送API请求并获取服务器返回的响应数据。
3、解析JSON数据:将响应数据解析为JSON格式,以便后续处理。
4、使用JsonPath表达式:编写合适的JsonPath表达式,选择所需的字段或信息。表达式可以定位到特定的层级、条件筛选或数组索引等。
5、提取信息:使用JsonPath库或工具执行JsonPath解析操作,提取目标信息。这可以是单个值、对象、数组或任何其他需要的数据结构。

通过以上步骤,你可以从淘票票网站地区接口数据中成功提取出所需的信息,并根据实际需求进行进一步处理、展示或存储。

至此,有关使用jsonpath解析淘票票地区接口信息的内容就全部学习完毕,下一篇我们来探讨BeautifulSoup技术的使用。

参考:尚硅谷Python爬虫教程小白零基础速通教学视频

转载请注明出处:https://guangzai.blog.csdn.net/article/details/132121833

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/844187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python测试框架pytest:测试用例、查找子集、参数化、跳过

Pytest是一个基于python的测试框架,用于编写和执行测试代码。pytest主要用于API测试,可以编写代码来测试API、数据库、UI等。 pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个优点: 简单灵活,容易上手。…

3D数字孪生技术在工业制造中的应用

工业生产是现代工业生产和城市化建设的重要组成部分,工业生产逐渐批量化和自动化,利用数字孪生3D可视化技术对工厂生产的环境、设备、管道和仪表等元素在虚拟世界中模拟和重建,实现工业生产的管理、规划、设计和运营数字化可视化管理。 提高生…

利用openTCS实现车辆调度系统(五)openTCS WEB接口及扩展

上一篇介绍了RMI接口的使用,但是RMI接口只有java可以使用,不能前端直接调用。openTCS最新版本中新增了很多WEB接口,openTCS启动后即可调用。web接口文档地址 默认地址前缀为:localhost:55200/v1 例如,获取车辆列表。 …

JVM系统优化实践(24):ZGC(一)

您好,这里是「码农镖局」CSDN博客,欢迎您来,欢迎您再来~ 截止到目前,算上ZGC,Java一共有九种类型的GC,它们分别是: 1、Serial GC 串行/作用于新生代/复制算法/响应速度优先/适用于单…

分享一个霓虹灯拨动开关

先看效果&#xff1a; 再看代码&#xff08;查看更多&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title> 霓虹灯拨动开关</title><style>* {border: 0;box-sizin…

【linux】安装pytorch3d

写在开头 不要看网上的博客安装&#xff0c;直接参考官方安装文档去安装。 坑 坑1&#xff1a;安装pytorch3d后torch.cuda用不了 使用下面的命令安装后 conda install pytorch3d会提示安装下面的包&#xff0c;注意pytorch和torchvision都是cpu版本的&#xff0c;这样就会…

以太网帧格式与吞吐量计算

以太网帧结构 帧大小的定义 以太网单个最大帧 6&#xff08;目的MAC地址&#xff09; 6&#xff08;源MAC地址&#xff09; 2&#xff08;帧类型&#xff09; 1500{IP数据包[IP头&#xff08;20&#xff09;DATA&#xff08;1480&#xff09;]} 4&#xff08;CRC校验&#xff…

【福建事业单位-资料分析】01 数学推理-基础-特征-非特征数列

【福建事业单位-资料分析】01 数学推理-基础-特征-非特征数列 一、基础数列总结 二、特征数列2.1 多重数列项数多&#xff0c;多于7项总结 2.2机械划分①小数;ab②大数字多&#xff08;三位数、四位数&#xff09;&#xff0c;达到一半或者以上总结 2.3分数数列大通分总结 2.4幂…

【MySQL】事务的多版本并发控制(MVCC)

目录 一、数据库并发的三种场景二、MVCC2.1 三个记录隐藏字段2.2 undo log&#xff08;撤销日志&#xff09;2.3 模拟MVCC2.3.1 模拟更新&#xff08;update&#xff09;2.3.1 模拟删除&#xff08;delete&#xff09;2.3.1 模拟插入&#xff08;insert&#xff09;2.3.1 模拟查…

bilibili的评论ip属地显示未知

现象 出于某些原因&#xff0c;我们在日常使用中的大部分平台都开启了IP地址显示&#xff0c;一般会显示当事人所在的地址&#xff0c;这其中就有一些奇怪的地址&#xff0c;&#xff08;在此不谈魔法&#xff09;就比如我最近在刷B站的时候&#xff0c;就在评论区发现了一些显…

C高级【day4】

思维导图&#xff1a; 写一个函数&#xff0c;获取用户的uid和gid并使用变量接收&#xff1a; #!/bin/bashfunction get_uid {my_uidid -umy_gidid -g }get_uid echo "当前用户的UID&#xff1a;$my_uid" echo "当前用户的GID&#xff1a;$my_gid"整理冒泡…

布隆过滤器,Guava实现布隆过滤器(本地内存),Redis实现布隆过滤器(分布式)

一、前言 利用布隆过滤器可以快速地解决项目中一些比较棘手的问题。如网页 URL 去重、垃圾邮件识别、大集合中重复元素的判断和缓存穿透等问题。不知道从什么时候开始&#xff0c;本来默默无闻的布隆过滤器一下子名声大噪&#xff0c;在面试中面试官问到怎么避免缓存穿透&#…

高级web前端开发工程师岗位的具体内容概述(合集)

高级web前端开发工程师岗位的具体内容概述1 职责&#xff1a; 1、负责前端页面开发和维护&#xff0c;并根据需求优化产品性能、用户体验、交互效果及各种主流浏览器以及各类型移动客户端的兼容适配工作; 2、配合产品经理和UI设计师&#xff0c;通过各种前端技术手段&#xf…

前端学习---vue2--指令修饰符详解

写在前面&#xff1a; 前端感觉系统学起来还行&#xff0c;我也不晓得我是咋快速入门1个月就开始看实习公司代码的。然后现在开始系统复习&#xff0c;然后感觉有的封装的还可以&#xff0c;不过就是我不晓得&#xff0c;像这个指令修饰符&#xff0c;其实说逻辑难写&#xff…

阿里、字节等大厂面试经历,过于真实了...

我一直想写点什么&#xff0c;但当时我觉得在得到几家大厂的offer之后再谈会更有说服力。但从目前的结果来看&#xff0c;结果并不十分令人满意。去年年底&#xff0c;我陆续面试了一些公司&#xff0c;比如迅雷、OPPO、阿里巴巴。当时&#xff0c;我并没有做任何准备&#xff…

ADS版图画封装学习笔记

ADS版图画封装 因为晶体管ATF54143在ADS中是没有封装的&#xff0c;所以要在ADS中画ATF54143的封装&#xff0c;操作步骤如下&#xff1a; 在ADS中新建layout&#xff0c;命名为ATF54143_layout&#xff0c; 根据datasheet知道封装的大小&#xff0c;进行绘制 在layout的con…

内网横向移动—资源约束委派

内网横向移动—资源约束委派 1. 资源约束委派1.1. 基于资源的约束委派的优势1.2. 约束性委派和基于资源的约束性委派配置的差别1.3. 利用条件1.3.1. 什么用户能够修改msDS-AllowedToActOnBehalfOfOtherIdentity属性1.3.2. 将机器加入域的域用户 2. 案例操作2.1. 获取目标信息2.…

题解:排序函数的应用,逻辑运算和算术运算之间的优先级

一、链接 5131. 按要求计算 二、题目 给定一个长度为 nn 的正整数序列 a1,a2,…,ana1,a2,…,an。 请你计算并输出 (min(a1,a2,…,an) xor a3)2(min(a1,a2,…,an) xor a3)2 的结果。 xorxor 表示按位异或。 输入格式 第一行包含整数 nn。 第二行包含 nn 个整数 a1,a2,……

了解文档管理软件在团队协作中的作用

在团队协作中&#xff0c;文档管理软件发挥着重要的作用。文档管理软件是一种使团队成员可以共享、编辑、审查和保存各种文档的工具。它以一种结构化的方式存储和组织文档&#xff0c;提供了团队成员之间的协同工作和知识共享的平台。 文档管理软件提供了一个集中的库&#xf…

前端工程化:模块化、包管理工具、打包工具(Webpack基本使用和优化)、前端性能监控

目录 1、模块化1. CommonJS/AMD/CMD1.1 背景1.2 CommonJS规范的核心变量1.3 exports(module.exports)和require本质1.4 exports和module.exports的关系/区别1.5 实际开发用&#xff1a;module.exports {}1.6 require(X)的查找规则&#xff08;1&#xff09;X是一个Node核心模块…