爬虫——JSON数据处理

第三节:JSON数据处理

在爬虫开发中,JSON(JavaScript Object Notation)是最常见的数据格式之一,特别是在从API或动态网页中抓取数据时。JSON格式因其结构简单、可读性强、易于与其他系统交互而广泛应用于前端与后端的数据传输。在这一节中,我们将深入探讨JSON格式的基本概念、如何解析和提取JSON数据,结合最新技术和实用技巧,帮助开发者高效处理JSON数据。


1. JSON格式简介

1.1 什么是JSON?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于文本且独立于语言,但它使用易于人类阅读和编写的文本格式,同时也易于机器解析和生成。JSON是跨语言的数据交换格式,在Web开发中被广泛使用。JSON数据表示结构化信息,通常用于API响应、配置文件或数据库中。

1.2 JSON的基本结构

JSON的数据结构是由两种主要类型的元素组成:对象(Object)数组(Array)

  • 对象(Object):以大括号{}表示,一组由键值对组成的数据结构,键(Key)必须是字符串,值(Value)可以是任何类型的数据。

    例如:

    {"name": "John","age": 30,"city": "New York"
    }

    这里的"name", "age", 和 "city"是对象的键,"John", 30, "New York"是对应的值。

  • 数组(Array):以方括号[]表示,一组有序的值,可以是任何类型的对象,包括数字、字符串、布尔值、其他数组或对象等。

    例如:

    ["apple","banana","cherry"
    ]

    这里是一个包含字符串的数组。

1.3 JSON中的数据类型

JSON支持的基本数据类型包括:

  • 字符串(String):用双引号括起来的文本。
  • 数字(Number):可以是整数或浮动小数。
  • 布尔值(Boolean)truefalse
  • 数组(Array):用[]表示的有序数据集合。
  • 对象(Object):用{}表示的键值对集合。
  • null:表示空值。

例如,以下是一个包含各种数据类型的JSON示例:

{"name": "Alice","age": 25,"isStudent": false,"address": {"street": "123 Main St","city": "Wonderland"},"courses": ["Math", "Physics", "Chemistry"],"grades": null
}
1.4 JSON的特点与应用
  • 可扩展性:JSON的数据结构灵活,支持嵌套对象和数组,因此可以表示复杂的关系型数据。
  • 易于解析:JSON具有良好的跨语言支持,很多编程语言(包括Python、JavaScript、Ruby等)都内置了JSON库,支持JSON的快速解析和生成。
  • 广泛应用:JSON是Web API中最常见的返回数据格式,尤其是RESTful API和现代Web应用中的数据交换格式。

2. JSON数据的解析与提取

在爬虫开发中,获取到JSON数据后,如何将其解析为可操作的数据结构,并从中提取出有用的信息,是每个开发者都需要掌握的基本技能。本节将详细介绍如何在Python中解析JSON数据,并提供多种实用的方法来提取其中的信息。

2.1 使用Python内置的json库解析JSON

Python标准库提供了json模块,用于处理JSON数据的编码和解码。json模块可以将JSON字符串转换为Python对象(如字典、列表等),也可以将Python对象转换为JSON格式。

2.1.1 加载和解析JSON

解析JSON数据的常见方法是使用json.loads()(将JSON字符串解析为Python对象)和json.load()(从文件中加载并解析JSON)。以下是解析JSON字符串的示例:

import json# 示例JSON字符串
json_string = '{"name": "John", "age": 30, "city": "New York"}'# 将JSON字符串解析为Python字典
data = json.loads(json_string)print(data)
print(data["name"])  # 输出 'John'

解释

  • json.loads()用于将JSON字符串解析为Python字典。
  • 解析后的数据data是一个字典类型,可以像操作字典一样访问其中的键值。
2.1.2 从文件中读取并解析JSON

如果JSON数据存储在文件中,我们可以使用json.load()来读取并解析文件中的内容:

import json# 从文件中读取JSON数据并解析
with open('data.json', 'r') as file:data = json.load(file)print(data)

解释

  • json.load()直接将文件中的JSON数据解析为Python对象。
  • 使用with open()语句可以确保文件正确关闭。
2.2 解析嵌套的JSON数据

JSON数据结构通常是嵌套的,也就是说,JSON对象的值可以是另一个对象或数组。因此,开发者需要能够深入解析嵌套结构。

以下是解析嵌套JSON数据的示例:

import json# 示例嵌套的JSON字符串
json_string = '''
{"name": "Alice","address": {"street": "123 Main St","city": "Wonderland"},"courses": ["Math", "Physics"]
}
'''# 解析JSON
data = json.loads(json_string)# 访问嵌套对象
print(data["address"]["city"])  # 输出 'Wonderland'
print(data["courses"][0])  # 输出 'Math'

解释

  • data["address"]["city"]访问了嵌套在address对象中的city属性。
  • data["courses"][0]访问了数组courses中的第一个元素。
2.3 提取JSON数据中的特定信息

有时我们只需要提取JSON数据中的一部分内容,而不是全部数据。可以通过遍历JSON对象、使用条件判断和过滤等方法提取特定的字段。

2.3.1 从JSON数组中提取特定元素

假设我们从API响应中获取到一个包含多个对象的JSON数组,需要提取其中符合特定条件的元素:

import json# 示例JSON数组
json_string = '''
[{"name": "John", "age": 30},{"name": "Alice", "age": 25},{"name": "Bob", "age": 22}
]
'''# 解析JSON
data = json.loads(json_string)# 提取年龄大于25的人
for person in data:if person["age"] > 25:print(person["name"])

输出

John

解释

  • 通过遍历JSON数组,检查每个元素的age属性,并根据条件过滤出符合要求的元素。
2.3.2 提取嵌套JSON中的数据

如果我们要从一个复杂的嵌套JSON中提取某个字段,可以通过递归或循环的方式进行提取。例如,提取JSON数组中的所有name字段:

import json# 示例嵌套的JSON数组
json_string = '''
[{"person": {"name": "John", "age": 30}},{"person": {"name": "Alice", "age": 25}},{"person": {"name": "Bob", "age": 22}}
]
'''# 解析JSON
data = json.loads(json_string)# 提取所有的name字段
names = [item["person"]["name"] for item in data]print(names)  # 输出 ['John', 'Alice', 'Bob']

解释

  • 使用列表推导式遍历JSON数组,提取每个元素中的name字段。
2.4 使用JSONPath(第三方库)

对于复杂的JSON数据结构,Python中的jsonpath-ng库可以提供类似于XPath的查询功能,帮助我们高效提取特定的JSON数据。

安装jsonpath-ng库:

pip install jsonpath-ng

以下是一个使用jsonpath-ng进行查询的示例:

import json
from jsonpath_ng import jsonpath, parse# 示例JSON字符串
json_string = '''
{"store": {"book": [{"category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century"},{"category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour"},{"category": "fiction", "author": "Herman Melville", "title": "Moby Dick"}]}
}
'''# 解析JSON
data = json.loads(json_string)# 使用JSONPath查询所有书籍的标题
jsonpath_expr = parse('$.store.book[*].title')
titles = [match.value for match in jsonpath_expr.find(data)]print(titles)  # 输出 ['Sayings of the Century', 'Sword of Honour', 'Moby Dick']

解释

  • jsonpath-ng提供了一种灵活的查询方法,使得提取嵌套和复杂结构的JSON数据变得简单。

3. 总结

JSON数据处理是Web爬虫开发中不可或缺的技能,掌握JSON格式的基本结构及其解析方法是高效数据抓取的关键。Python中的json模块为处理JSON提供了简洁易用的接口,但对于复杂或大规模的JSON数据,使用jsonpath-ng等第三方库可以提高工作效率。

在处理JSON数据时,注意:

  • 理解JSON的结构,确保正确地访问嵌套对象和数组。
  • 使用合适的工具,如json模块、jsonpath-ng等,来优化JSON数据的解析和提取过程。
  • 优化性能,特别是处理大型JSON数据时,确保程序的效率和稳定性。

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony-1.启动流程

OpenHarmony启动流程 1.OpenHarmony 标准系统启动引导流程 OpenHarmony标准系统默认支持以下几个镜像: 每个开发板都需要在存储器上划分好分区来存放上述镜像,SOC启动时都由bootloader来加载这些镜像,具体过程包括以下几个大的步骤&#xf…

力扣刷题日记之150.逆波兰表达式求值

今天继续给大家分享一道力扣的做题心得今天这道题目是 150.逆波兰表达式求值 题目如下,题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation 1,题目分析 这道题说是一道中等难度的题目,其实如果理解了其中的…

Redis五大基本类型——String字符串命令详解(命令用法详解+思维导图详解)

目录 一、String字符串类型介绍 二、常见命令 1、SET 2、GET 3、MGET 4、MSET 使用MGET 和 使用多次GET的区别 5、DEL 6、SETNX SET、SET NX和SET XX执行流程 7、INCR 8、INCRBY 9、DECR 10、DECYBY 11、INCRBYFLOAT 12、APPEND 13、GETRANGE 14、SETRANGE …

如何知道表之间的关系(为了知识图谱的构建)

今天就简单点,把今天花时间做的一个程序说下。 我们在做常规知识图谱的时候,面临一个问题就是要知道关系是如何建立。如果表的数量比较少,人工来做还是比较容易的。 如果有非常多的表,并且这些表之间的关联关系都不清楚的情况下…

【软件测试】一个简单的自动化Java程序编写

文章目录 自动化自动化概念回归测试常见面试题 自动化测试金字塔 Web 自动化测试驱动 Selenium一个简单的自动化示例安装 selenium 库使⽤selenium编写代码 自动化 自动化概念 自动的代替人的行为完成操作。自动化在生活中处处可见 生活中的自动化可以减少人力的消耗&#x…

网络学习第四篇

引言: 我们在第三篇的时候出现了错误,我们要就行排错,那么我们要知道一下怎么配置静态路由实现ping通,这样子我们才知道下一跳到底是什么,为什么这样子做。 实验目的 理解和掌握静态路由的基本概念和配置方法。 实…

LeetCode题解:17.电话号码的数字组合【Python题解超详细,回溯法、多叉树】,知识拓展:深度优先搜索与广度优先搜索

题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits "23" 输出…

Python爬虫项目 | 一、网易云音乐热歌榜歌曲

文章目录 1.文章概要1.1 实现方法1.2 实现代码1.3 最终效果 2.具体讲解2.1 使用的Python库2.2 代码说明2.2.1 创建目录保存文件2.2.2 爬取网易云音乐热歌榜单歌曲 2.3 过程展示 3 总结 1.文章概要 学习Python爬虫知识,实现简单的一个小案例,网易云音乐热…

消息中间件分类

消息中间件(Message Middleware)是一种在分布式系统中实现跨平台、跨应用通信的软件架构。它基于消息传递机制,允许不同系统、不同编程语言的应用之间进行异步通信。 常见的消息中间件类型包括: 1. JMS(Java Message S…

GoogleCloud服务器的SSH连接配置

首先,Google的服务器默认是通过自带的SSH网页端连接的,比较麻烦和容易断开,不是很好用,常见的解决办法有两种一种是通过修改ssh的配置,添加密码的方式进行连接,一种是通过配置公钥进行连接。 密码连接之前有…

31.3 XOR压缩和相关的prometheus源码解读

本节重点介绍 : xor 压缩value原理xor压缩过程讲解xor压缩prometheus源码解读xor 压缩效果 xor 压缩value原理 原理:时序数据库相邻点变化不大,采用异或压缩float64的前缀和后缀0个数 xor压缩过程讲解 第一个值使用原始点存储计算和前面的值的xor 如果XOR值为0&…

【图像压缩感知】论文阅读:Content-Aware Scalable Deep Compressed Sensing

tips: 本文为个人阅读论文的笔记,仅作为学习记录所用。本文参考另一篇论文阅读笔记 Title: Content-Aware Scalable Deep Compressed Sensing Journal: TIP 2022 代码链接: https://github.com/Guaishou74851/CASNet…

Neo4j Desktop 和 Neo4j Community Edition 区别

Neo4j Desktop 和 Neo4j Community Edition 的主要区别在于它们的用途、功能以及安装和管理方式。以下是这两者的详细对比: 1. Neo4j Desktop Neo4j Desktop 是一个图形化的桌面应用程序,主要为开发人员和个人使用提供了一个便捷的环境来安装、管理和运…

DAY120java审计第三方组件依赖库挖掘FastjsonShiroLog4jH2DB

组件漏洞判断插件 一、Tmall_demo-master(fastjson) 1、配置文件查找安装组件 1、JSON.parse(json) 2、JSON.parseObject 2、找可控的变量 3、利用组件漏洞 poc:propertyJson{"type":"java.net.Inet4Address","val":&q…

要查看你的系统是 x64(64位)还是 x86(32位),可以按照以下步骤操作

文章目录 1. 通过“系统信息”查看系统架构2. 通过“设置”查看系统架构3. 通过命令提示符查看系统架构4. 通过 PowerShell 查看系统架构5. 通过文件资源管理器查看系统架构总结 要查看你的系统是 x64(64位)还是 x86(32位)&…

通过JS删除当前域名中的全部COOKIE教程

有时候需要通过JS来控制一下网站的登录状态,就例如:网站登出功能,我们可以直接通过JS将所有COOKIE删除,COOKIE删除之后,网站自然也就退出了。 那么今天我就给大家分享一段JS的函数,通过调用这段函数就可以实现删除COO…

在Ubuntu22.04上源码构建ROS noetic环境

Ubuntu22.04上源码构建ROS noetic 起因准备环境创建工作目录并下载源码安装编译依赖包安装ros_comm和rosconsole包的两个补丁并修改pluginlib包的CMakeLists的编译器版本编译安装ROS noetic和ros_test验证 起因 最近在研究VINS-Mono从ROS移植到ROS2,发现在编写feat…

C++ 中的string类

本文主要通过文档形式使用C中string类的常见接口进行介绍&#xff0c;然后我们自己实现一个string类 标准库中的string 使用库中的string类时&#xff0c;必须包含头文件&#xff1a;#include<string>, 以及 using namespace std string 构造函数 首先我们来看构造函数…

html + css 自适应首页布局案例

文章目录 前言一、组成二、代码1. css 样式2. body 内容3.全部整体 三、效果 前言 一个自适应的html布局 一、组成 整体居中&#xff0c;宽度1200px&#xff0c;小屏幕宽度100% 二、代码 1. css 样式 代码如下&#xff08;示例&#xff09;&#xff1a; <style>* {…

Python知识点精汇!字符串:定义、截取(索引)和其内置函数

目录 一、字符串的定义 二、字符串的截取 1.截取干啥的 2.怎么用截取 3.打印多次 4.两个字符串拼接在一起 三、字符串内置函数 1.查询函数&#xff1a; &#xff08;1&#xff09;find(str,start,end) &#xff08;2&#xff09;index&#xff08;str,start,end&#…