爬虫——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.mzph.cn/news/886447.shtml

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

相关文章

SpringBoot集成itext导出PDF

添加依赖 <!-- PDF导出 --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.itextpdf</groupId>&l…

【快速解决】kafka崩了,重启之后,想继续消费,怎么做?

目录 一、怎么寻找我们关心的主题在崩溃之前消费到了哪里&#xff1f; 1、一个问题&#xff1a; 2、查看消费者消费主题__consumer_offsets 3、一个重要前提&#xff1a;消费时要提交offset 二、指定 Offset 消费 假如遇到kafka崩了&#xff0c;你重启kafka之后&#xff0…

查询DBA_FREE_SPACE缓慢问题

这个是一个常见的问题&#xff0c;理论上应该也算是一个bug&#xff0c;在oracle10g&#xff0c;到19c&#xff0c;我都曾经遇到过&#xff1b;今天在给两套新建的19C RAC添加监控脚本时&#xff0c;又发现了这个问题&#xff0c;在这里记录一下。 Symptoms 环境&#xff1a;…

用OMS进行 OceanBase 租户间数据迁移的测评

基本概念 OceanBase迁移服务&#xff08;&#xff0c;简称OMS&#xff09;&#xff0c;可以让用户在同构或异构 RDBMS 与OceanBase 数据库之间进行数据交互&#xff0c;支持数据的在线迁移&#xff0c;以及实时增量同步的复制功能。 OMS 提供了可视化的集中管控平台&#xff…

IDEA一键部署SpringBoot项目到服务器

安装Alibaba Cloud Toolkit插件 配置部署环境 1&#xff1a;设置服务名称 2&#xff1a;选择文件上传的类型 3:选择打包之后的jar文件 4: 添加需要上传的服务器信息 5:需要上传到服务器的地址 输入绝对路径 6: 选择上传文件后执行的脚本 可以参考另一篇文章 Linux启…

渗透测试之信息收集 DNS主机发现探测方式NetBIOS 协议发现主机 以及相关PorCheck scanline工具的使用哟

目录 主机发现 利用NetBIOS 协议发现主机 利用TCP/UDP发现主机 PorCheck scanline 利用DNS协议发现主机 主机发现 信息收集中的一项重要工作是发现内网中的主机、数据库、IP段网络设备、安全设备等资产&#xff0c;以便于更快地获取更多权限和密码&#xff0c;更加接近红…

打造专业问答社区:Windows部署Apache Answer结合cpolar实现公网访问

文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…

基于java的医院门诊信息管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

67页PDF |埃森哲_XX集团信息发展规划IT治理优化方案(限免下载)

一、前言 这份报告是埃森哲_XX集团信息发展规划IT治理优化方案&#xff0c;报告中详细阐述了XX集团如何优化IT治理结构以适应新的要求。报告还分析了集团管控模式的变化&#xff0c;提出了六大业务中心的差异化管控策略&#xff0c;并探讨了这些变化对IT治理模式的影响。报告进…

【AI大模型】ELMo模型介绍:深度理解语言模型的嵌入艺术

学习目标 了解什么是ELMo.掌握ELMo的架构.掌握ELMo的预训练任务.了解ELMo的效果和成绩.了解ELMo的优缺点. 目录 &#x1f354; ELMo简介 &#x1f354; ELMo的架构 2.1 总体架构 2.2 Embedding模块 2.3 两部分的双层LSTM模块 2.4 词向量表征模块 &#x1f354; ELMo的预…

【srm,招标询价】采购电子化全流程,供应商准入审核,在线询价流程管理(JAVA+Vue+mysql)

前言&#xff1a; 随着互联网和数字技术的不断发展&#xff0c;企业采购管理逐渐走向数字化和智能化。数字化采购平台作为企业采购管理的新模式&#xff0c;能够提高采购效率、降低采购成本、优化供应商合作效率&#xff0c;已成为企业实现效益提升的关键手段。系统获取在文末…

优选算法 - 4 ( 链表 哈希表 字符串 9000 字详解 )

一&#xff1a;链表 1.1 链表常用技巧和操作总结 1.2 两数相加 题目链接&#xff1a;两数相加 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* …

小鸡模拟器 1.8.11 | 街机怀旧重温经典游戏,支持手柄

小鸡模拟器是一款支持多种经典游戏机模拟的游戏应用&#xff0c;包括街机、索尼(SONY)、世嘉、任天堂等主流掌机游戏以及PSP、GBA、NDS、SFC(超级任天堂SNES)、FC(红白机NES)、MD(世嘉MEGA DRIVE)、PS1、PS2等。应用支持手柄完美操作&#xff0c;兼容安卓手柄&#xff0c;让玩家…

用go语言后端开发速查

文章目录 一、发送请求和接收请求示例1.1 发送请求1.2 接收请求 二、发送form-data格式的数据示例 用go语言发送请求和接收请求的快速参考 一、发送请求和接收请求示例 1.1 发送请求 package mainimport ("bytes""encoding/json""fmt""ne…

针对股票评论的情感分类器

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月16日13点39分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…

Transformer学习笔记(一)

Transformer学习笔记 基于 3B1B 可视化视频 自注意力机制 1.每个词的初始嵌入是一个高维向量&#xff0c;只编码该单词含义&#xff0c;与上下文没有关联 2.对初始向量进行位置编码&#xff0c;在高维向量中编码进位置信息&#xff08;单词在语言序列中的位置信息&#xff…

antd table表格设置最小宽度,列宽等比例显示

最近ui有个设计稿&#xff0c;表格要求如图&#xff1a; 由于本地antd table列宽column没有设置最小宽度minWidth属性&#xff0c;只有width属性&#xff0c;所以开发时我考虑按照列宽等比例计算后去设置width属性&#xff1b; 一、实现&#xff1a; 1.表头数组中设置minWidth…

算法沉淀一:双指针

目录 前言&#xff1a; 双指针介绍 对撞指针 快慢指针 题目练习 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.和为s的两个数 7.三数之和 8.四数之和 前言&#xff1a; 此章节介绍一些算法&#xff0c;主要从leetcode上的题来讲解&#xff…

若点集A=B则A必能恒等变换地变为B=A这一几何常识推翻直线(平面)公理

黄小宁 关键词&#xff1a;“更无理”复数 复平面z各点z的对应点z1的全体是z1面。z面平移变为z1面就使x轴⊂z面沿本身平移变为ux1轴。R可几何化为R轴&#xff0c;R轴可沿本身平移变为R′轴&#xff0c;R′轴可沿本身平移变为R″轴&#xff0c;...。直线公理和平面公理使几百年…

HelloMeme 上手即用教程

HelloMeme是一个集成空间编织注意力的扩散模型&#xff0c;用于生成高保真图像和视频。它提供了一个代码库&#xff0c;包含实验代码和预训练模型&#xff0c;支持PyTorch和FFmpeg。用户可以通过简单的命令行操作来生成图像和视频。 本文将详细介绍&#xff0c;如何在GPU算力租…