天天看点

《数据科学:R语言实现》——2.7 爬取网络数据

本节书摘来自华章计算机《数据科学:r语言实现》一书中的第2章,第2.7节,作者 丘祐玮(david chiu),更多章节内容可以访问云栖社区“华章计算机”公众号查看。

在本教程中,你需要给开发环境安装r,同时确保计算机可以访问互联网。

《数据科学:R语言实现》——2.7 爬取网络数据

2.页面出现后,如图9所示。我们可以安装加载rvest程序包:

《数据科学:R语言实现》——2.7 爬取网络数据
《数据科学:R语言实现》——2.7 爬取网络数据

4.使用浏览器的内置网页查看器,查看下列指标图中的具体报价位置(如图10中用红框标记):

《数据科学:R语言实现》——2.7 爬取网络数据

5.你可以移动鼠标查看具体报价,单击希望爬取的目标元素。如图11所示,

部分包含所有所需的信息:

《数据科学:R语言实现》——2.7 爬取网络数据

6.使用函数html_nodes抽取cell类中的元素:

《数据科学:R语言实现》——2.7 爬取网络数据

7.另外,我们可以使用cell__label类中的元素解析具体报价的标签,从爬取的html中抽取文本,并清理抽取文本中的空格和换行符:

《数据科学:R语言实现》——2.7 爬取网络数据

8.而且,我们可以使用cell__value类中的元素抽取具体报价的值,从爬取的html中抽取文本,同样清理空格和换行符:

《数据科学:R语言实现》——2.7 爬取网络数据

9.最后我们可以设定抽取的label作为value的名称:

《数据科学:R语言实现》——2.7 爬取网络数据
《数据科学:R语言实现》——2.7 爬取网络数据

11.然后我们使用网页查看器查看表元素的位置,如图13所示。

12.我们可以使用html_table,通过data-table类抽取表元素:

《数据科学:R语言实现》——2.7 爬取网络数据
《数据科学:R语言实现》——2.7 爬取网络数据

从网站上爬取数据最困难的是数据使用不同的格式进行发布和结构化。在开展工作之前,你需要完全理解数据在html中是如何结构化的。

由于html(hypertext markup language,超文本标记语言)拥有和xml类似的语法,我们可以使用xml程序来读取和解析html网页。但是,xml程序包只提供了xpath方法。它有如下两个缺点:

《数据科学:R语言实现》——2.7 爬取网络数据

由于这些原因,在解析html的时候,我们推荐使用css选择器,而不是xpath。

python用户可能对如何使用请求和beautifulsoup程序包快速爬取数据比较熟悉。rvest程序包就是r中用来实现类似功能的。它提供了简单有效的从html网页收集数据的能力。

然后,你可以把光标移动到devtools窗口的左上部分,选取inspect element图标(类似放大镜的符号)。接着,单击目标元素,devtools窗口会对选取区域的源代码进行高亮显示。你可以把光标移动到高亮区域,并右击。从弹出菜单中,单击copy css path抽取css路径。你也可以使用cell类,查看源代码,并观察选取的元素是如何在html代码中结构化的。

rvest的一个优点是它在设计之初就与magrittr兼容。因此我们可以使用管道操作符%>%把每个阶段的输出连接起来。 我们可以首先调用spx_quote获取输出源,然后把输出传给html_nodes。由于函数html_nodes使用css选择器来解析元素,因此函数会使用基础的,带有类型(例如div)、id(例如#header)和类(例如.cell)的选择器 。由于待抽取的元素拥有cell类,因此你应该在cell前放置一个点号(.)。

最后,我们应该从之前解析的节点中抽取标签和值。这里,我们首先抽取cell__label类中的元素,然后使用html_text抽取文本。我们可以使用函数gsub清理文本中的空格和换行符。类似地,我们使用同样的方法来抽取class__value的元素。因为我们从具体的报价中抽取了标签和值,我们就可以使用标签作为值的名称。现在我们已经把网络数据组织在了结构化的数据中。

我们也可以使用rvest采集表格数据。与标普500指数数据采集的过程类似,我们可以首先访问能源和石油市场指数网页,然后使用网络元素查看器找到表格数据元素位置。由于我们已经找到了data-table类中的元素,我们可以使用函数html_table来读取表格内容,并传给一个数据框。

《数据科学:R语言实现》——2.7 爬取网络数据

2.单击右上角图标打开selectorgadget,选取需要爬取的区域。被选区域会变成绿色,如图15所示。这个工具会展示区域的css路径,以及与路径匹配的元素数目:

《数据科学:R语言实现》——2.7 爬取网络数据

3.你可以粘贴抽取的css路径给html_nodes,作为输入参数来解析数据。

《数据科学:R语言实现》——2.7 爬取网络数据

2.然后,使用下列命令启动selenium单机服务器:

《数据科学:R语言实现》——2.7 爬取网络数据

3.如果你成功地启动了selenium单机服务器,你应该看到下列信息,如图17所示。它意味着你可以通过端口4444连接服务器了:

《数据科学:R语言实现》——2.7 爬取网络数据

4.现在,你可以使用下列命令安装加载rselenium:

《数据科学:R语言实现》——2.7 爬取网络数据

5.安装rselenium之后,注册驱动并连接selenium服务器:

《数据科学:R语言实现》——2.7 爬取网络数据

6.查看服务器的状态:

《数据科学:R语言实现》——2.7 爬取网络数据
《数据科学:R语言实现》——2.7 爬取网络数据

8.最后,我们可以使用css选取器爬取数据:

《数据科学:R语言实现》——2.7 爬取网络数据