基于R语言的自动数据收集:网络抓取和文本挖掘实用指南【1.8】

news2026/4/7 2:17:21
3.6 JSON文档示例在本节我们要熟悉数据交换标准JSON的优点。这个首字母缩写发音是“Jason”代表JavaScript对象标记JavaScript Object Notation。JSON的设计和XML如出一辙两者通常都是用来存储和交换人类可读的数据。很多流行网络应用提供的接口都提供JSON格式的数据。顾名思义JSON是一种源于JavaScript编程语言的数据格式。不过JSON本身是一种独立的语言包括R在内的很多现有编程语言都能够解析它。JSON已经变成用于提供网络数据的最流行的格式之一。因此对于本书的主题它是值得学习的。我们再从一个合成的例子开始然后更系统化地了解它的语法。在本章最后部分我们会学习JSON语法以及如何用R来访问JSON数据。图3-9的JSON代码存放了电影《夺宝奇兵》Indiana Jones前三集的一些基本信息。我们可以观察到JSON比XML的体量更轻。数据是保存在键值对key/value pair里的如name“Raiders of the Lost Ark”这样就不需要终止标签了。不同类型的括号大括号和方括号能够描述层级结构并区分无序和有序数据。和XML一样JSON数据结构在嵌套方面也可以任意复杂化。除了语法上的差别JSON和XML一样直观易懂尤其在像例子中的代码那样有缩进的情况下虽然对于合法JSON数据来说这样的缩进并不是必需的。3.7 JSON语法规则JSON语法很容易学习。我们只需要知道a如何使用括号划分数据的结构b键和值是如何识别和隔开的c有哪些数据类型以及如何使用它们。括号在划分文档结构的时候起了关键作用。正如我们在图3-9的范例数据中所见整个文档是包裹在大括号里的。这是因为indy movies是第一个对象它包含了放在一个数组也就是有序的序列里的三个电影记录。数组是用方括号框起来的。按顺序排列的每个电影也都是对象所以它们用大括号包起来。总体而言括号的用法如下1大括号“{”和“}”里包含对象。对象的用法很像XML里的元素能包含键值对的集合、其他对象或数组。2方括号“[”和“]”里包含数组。一个数组就是一个有序的对象或值的序列。实际数据存放在键值对中。键和值的规则如下1键放在双引号里数据则只有字符串类型的才能放在双引号里。JSON键值对的值部分支持一组不同的数据类型。如表3-4所列。JSON的语法就是这么多了。[1]从XML用户的角度来说要注意JSON不能做到的事情有不能添加注释不能区分缺失的值和空值没有命名空间也没有XML的DTD那样的内部校验语法。但是这从绝对意义上说并不会让JSON逊色于XML。它们只是基于不同的概念而已。JSON并不是一种标记语言甚至连文档格式都不算。它被设想为无版本的——世界上没有JSON 1.0这种东西——也不用指望它的语法有什么变化。它只是一种数据交换标准相当通用很多语言都能毫不费力地解析它。虽然在JSON数据里面没有太多可强调的东西但是有一些工具可以辅助人类读者访问JSON文档。在http://jsonformatter.curiousconcept.com/里的JSON Formatter格式化工具Validator校验工具就是网络上的很多工具之一这些工具能给输入的JSON数据自动产生缩进。这样能让JSON数据更容易阅读因为JSON数据经常是以无缩进无换行的形式出现的。这个工具还能帮助检查数据中的bug。如果你需要把XML转换成JSON数据可以考虑http://www.freeformatter.com/xml-to-json-converter.html或类似的工具。不过这样的转换并不是同构的需要设定一些规则来处理属性和命名空间等。在XML已经提供了流行的数据交换格式的情况下为什么JSON对于网络还是那么重要呢首先有一些技术特点让JSON比XML更优先。总体而言它更加轻量级这归功于它更简洁的语法以及它只允许有限的数据类型集合这个集合能兼容很多——如果不是大部分——已有的编程语言。关于兼容性JSON有另一个关键特性我们在本书只会讲解基本的JavaScript知识参见第6章而对于创建动态内容及用户和浏览器之间的交互JavaScript在互联网领域是主流的技术。JSON则是从根本上和JavaScript兼容的可以直接被解析为JavaScript对象。从实用角度看JSON貌似已经成为了最广泛使用的网络接口数据交换格式Twitter、YouTube还有很多或大或小的Web服务已经开始使用纯JSON接口了。[1] 这里有一些字符编码的细节问题我们没有深究。如果你想更深入一些细节在http://www.json.org/有更详细的信息。3.8 JSON和R的实践R有一套处理XML类型数据的标准工具集——XML组件而能够导入、导出和处理JSON数据的组件有好几个。其中第一个发布的组件是rjsonCouture-Beil 2013它在一些基于R的接口包里还在使用。不过当前更加完善的一个组件是RJSONIOTemple Lang 2013b我们在本节会用到它。最后我们还会讨论最近发布的组件jsonliteOoms and Temple Lang 2014它是在RJSONIO的基础上构建的改善了R对象和JSON字符串之间的映射。我们的讨论从查看RJSONIO组件开始。在它的当前版本1.0.3里组件提供了24个函数大部分通常不会直接调用。现在我们回头来看一下实际例子就是在indy.json文件里的数据。通过调用isValidJSON函数我们先来检查一下文档是否包含了合法的JSON数据看起来好像是这么回事。该组件的两个核心函数分别是fromJSON和toJSON。fromJSON读取JSON格式的内容并将其转换为R对象而toJSON则恰恰相反content是这个函数的主要参数。在我们的例子里indy.json是一个在工作目录中的文件但它也可以是通过getURL函数从网络上获取或者用readLines函数导入的一个字符串。fromJSON函数提供了其他几个有用的参数并且由于该组件有精心的维护其文档在R控制台通过fromJSON路径访问是很值得一读的。一个非常有用的参数是simplify它负责控制函数是否尝试把相同元素合并成向量。如果不合并每个元素就仍然是单独的列表元素。nullValue参数用于描述如何处理JSON的空值null。总体而言JSON的数据类型参见表3-4和R的数据类型小数、整数、字符、逻辑匹配得很好。不过空值在R里有所不同。NULL用来表示空对象NA用来表示缺失的值。因此nullValue参数有助于说明如何处理这种情况例如把它们转化为NA。下面的函数会把JSON数据结构映射为一个R的列表对象从现在开始我们可以用标准的R风格来处理数据了也就是说对列表进行分解或分组或把它或它的几部分强制转化为向量、数据框或其他结构。我们已经注意到当我们面对真实数据的时候一些貌似强大的函数如xmlToDataFrame其作用可能是有限的。数据框在表示简单的变量——值结构时是有用的但用于表示高度层级化的数据时就会变得非常复杂。相比之下JSON和XML可以表示复杂得多的数据结构。当JSON或XML数据加载到R中的时候用户经常要决定哪些信息子集是必要的并需要插入数据框中的。因此对于从JSON/XML到R的数据格式转换工作不可能有什么现成的通用函数。我们只能根据实际情况来创建子集的数据转换工具。在本书的例子里我们会需要尝试把前面的列表映射到一个数据框里面包括3个数据记录和几个变量。这里的问题在于actors和producers有好几个值。有一个办法是逐个变量提取信息最后再把它们合并到一起。这种方法如下所示这个方法首先把复杂的列表结构扁平化变成一个向量。recursive参数确保列表中的所有元素都被处理到。通过设置use.names参数为TRUE所有的键key名在扁平化后的向量里都是保留的所以我们可以用一个简单的正则表达式和stringr组件参见第8章的str_detect函数通过name来找到所有的原始键值对。这种方法也有其缺点。首先所有列表元素被强制转化为同一种模式大部分情况下产生的是字符向量。这对于name变量是有用的但对于years变量就不那么合适了。另外在需要提取很多变量的情况下这种分步骤的方法就比较烦琐。稍微好一点的办法是用sapply函数把[[操作符和变量名作为参数用来给元素分组相当于indy[[1]][[1]][[name]]、indy[[1]][[2]][[name]]以此类推这种方法相对于第一种方法的优点在于数据类型得以保留。最后要提取所有变量并直接把它们组织到一个数据框里我们必须考虑采样数据中某些变量不存在或在不同记录中结构不同的情况。例如制片人producers的数量有不同。进行如下的转换我们首先把列表中的元素扁平化。第二个命令就复杂一些。首先把每个列表元素变形把它们转化为数据框再利用plyr组件里的rbind.fill函数把这些数据框组合为单个数据框在此过程中要处理某些变量在某些数据框内不存在的情况。从结果可以看出我们还需要继续做一些数据整理的工作。例如注意制片人producer变量分裂成了好几个很明显导入JSON数据或对一般列表进行处理会是一件令人头疼的事。即使数据结构比上面的例子简单一些我们还是需要调用apply一类的函数。参考下面最后一个JSON导入的例子它来自一个简单的普通数据集我们可以通过下面的表达式把数据转化为普通的数据框我们通过fromJSON函数解析这段JSON数据并告诉解析器把null值设置为NA。为了在所有元素里保持列表结构我们还设置了simplify参数为FALSE。否则解析器会把第二个记录转换为一个字符向量这样data.frame这个apply函数就无效了。我们使用lapply函数把得到的列表转化为数据框并通过stringsAsFactorsFALSE参数让字符串保持不变。最后我们用一个对rbind的do.call调用把得到的数据框组合起来。结果看起来是可以接受的如果要进行反向转换也就是从R到JSON数据我们需要的函数是toJSON把JSON数据转换为R对象并不总能用现成的函数完成而需要对产生的对象进行一些后续处理但最近面世的jsonlite组件为这两套数据提供了更好的一致性。它是在RJSONIO组件的基础上创建的也提供了fromJSON和toJSON这两个主函数但是实现了不同的映射模式参见Ooms 2013。它有一套规则让来自外部源如某个接口的数据能够以保证一致性的方式进行转换。某些关于数组从JSON转化到R的重要惯例如下·如果数组里有至少一个值是字符型的整个数组都会编码为字符数据。·null值编码为NA。·true和false逻辑值在数值向量中分别编码为1和0在字符和逻辑向量中分别编码为TRUE和FALSE。还有一些惯例是关于向量、矩阵、列表和数据框的转换的。它们的文档见参考文献中的Ooms2013。对我们的目标来说关于JSON到R的转换规则最为重要因为这是常规数据抓取工作流程的一部分。请参考下面这一套从JSON数据到R对象的转换例子看一下前面提到的惯例是如何实际应用的jsonlite的一致性映射规则不仅能确保数据在向量层次被充分转换而且让JSON数据映射为R数据框的工作更加轻松。再利用jsonlite处理一下前面的普通人数据的例子你会发现JSON数据马上可以很方便地映射为预期的data.frame类型的R对象在《夺宝奇兵》的例子里Indy这个JSON数据也会被映射为一个列表。不过列表中唯一的元素是我们所需内容构成的数据框。我们可以直接把列表中的数据提取出来用于访问其中的变量简而言之只要是RJSONIO返回了一个列表而你需要数据框的情况下jsonlite在适当条件下都能够从JSON数据结构创建表格数据因为它的映射模式明确了表格数据存放在R里的基于列的方式和在JSON以及很多其他格式、语言或数据库里的基于行的方式参见Ooms 2013。当然jsonlite的功能并不能解决所有JSON到R转化的问题。不过在jsonlite里实现的规则设定有助于更一致地把JSON数据导入R。因此我们推荐在处理JSON数据的时候把该组件作为标准工具尽管它还处于早期版本。小结XML和JSON都是非常重要的网络数据交换标准因此会在本书的课程中多次出现例如在第4章和第14章的Twitter案例讨论里。了解如何处理这两种数据类型对网络数据采集的任务是大有帮助的。我们已经看到XML还可以作为很多其他格式的基础标准如GPX、KML、RSS、SVG、XHTML等。我们在网上遇到这些类型的数据时也能够用R把它们导入和处理。JSON是网络数据交换领域一种越来越流行的XML替代格式特别是在涉及网络服务/网络接口的情况下它的使用更为普遍。JSON脱胎于JavaScript可以被包括R在内的很多语言解析。延伸阅读相对本书对XML和JSON的基本介绍有很多教材有更深入的讲解。如果你喜欢网络相关的语言并打算深入Web开发领域你可以看看Harold和Means2004写的这本《XML in a Nutshell》或者Ray2003的相关文献。不过对于本书讲解的网络抓取工作来说更高深的XML知识并不是必要的。如果你想更深入JSON和JavaScriptJSON标准制定者Douglas Crockford2008写的这本《JavaScriptThe Good Parts》会是一本不错的入门书。如需快速了解它的全貌我们强烈推荐访问http://www.json.org/这个超棒的网站。习题1.描述XML和HTML之间的关系。2.把XML数据导入R有几种可行的方法每种方法的优点和缺点分别是什么3.在XML风格的文档中命名空间的用途是什么4.JSON语法的主要元素有哪些5.编写你能想出来最小的结构良好的XML文档。6.为什么XML里的符号需要用一个转义序列表示7.看一下3.2.2节的非法XML代码片段。里面的家庭结构可以如何在一个合法XML文档中表示从而让Jonathan能具备孩子和父亲的双重身份8.到你存放黑胶唱片、CD、DVD或蓝光碟的架子上随机找出三张盘。创建一个XML文档里面保存有关你选取的这几张盘的有用信息。9.自学Election Markup LanguageEMLa搞清楚EML的用途。b查找该语言的当前规格说明明确关键概念。c查找一个真实的EML文档把它加载到R里并把其中一些部分转化为本地数据结构。10.运用SVG文件。a处理ricon.svg文件给里面的图标加上一个黑框。重新定义图像的颜色、大小和字体。b把RSS图标重建为SVG文档。11.找出下面JSON片段的格式错误。12.将图3-1中的《James Bond》示例XML转化为合法的JSON。13.将图3-9中的《夺宝奇兵》示例数据转化为合法的XML。14.把indy.json文件导入R并提取所有budget键的值。15.XML文件potus.xml在本书配套材料中包含美国各届总统的个人传记。a使用DOM风格的XML解析器把该文档解析到名为potus的R对象中。检查源代码。occupation节点在字符串结尾含有多余的空格。找到合适的参数能让这些多余的空格在解析阶段被去掉。b该XML文件包含了salary节点。在解析文件的过程中丢弃它们。通过使用定制的处理器函数和字符串处理函数参见8.2节去掉occupation节点中的多余空格。c编写一个处理器用于提取hometown节点的值并将其传递给DOM风格的解析器。利用一个事件驱动的解析器重复上述过程并检查结果。[1] 本例是从Twitter流接口返回内容的缩减片段。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…