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

2.7 爬取网络数据

在多数情况下,数据并不会存在于数据库中,相反它们以各种形式遍布于互联网上。为了从这些数据源中挖掘更有价值的信息,我们需要知道如何在网络上访问和爬取数据。这里,我们会介绍如何使用rvest程序包从http://www.bloomberg.com/ 上收集财经数据。

准备工作

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

实现步骤

执行下列步骤,从http://www.bloomberg.com/ 爬取数据。

1.首先,访问下列链接,浏览彭博商业上的标普500指标:http://www.bloomberg.com/quote/SPX:IND

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

3.你可以使用rvest程序包中的函数HTML爬取和解析 http://www.bloomberg.com/ 中指向标普500指数的HTML网页:

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

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

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

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

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

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

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

10.接着,我们可以通过下列链接,访问能源和石油市场指数页面,如图12所示。(http://www.bloomberg.com/energy

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

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

运行原理

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

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

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

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

在本教程中,我们的目的是从 http://www.bloomberg.com/ 爬取标准普尔500财经数据的具体报价。第一步是保证我们可以通过互联网访问目标网页。我们需要安装和加载rvest程序包。安装和加载完成之后,我们可以使用HTML函数读取网页的源代码spx_quote。

确保我们可以读取HTML网页后,我们就可以开始解析HTML网页上的具体报价。但是,我们首先需要查看具体报价的CSS路径。有多种方法查看一个具体元素的CSS路径。最常用的方法是使用每一个浏览器内置的开发工具(按F12键或者FN+F12组合键来查看CSS路径。以谷歌的Chrome浏览器为例,你可以按下F12键打开开发工具。开发工具的窗口会展示在可视区域内(请参阅下列文档链接https://developer.chrome.com/devtools/docs/domand-styles#inspecting-elements)。

然后,你可以把光标移动到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来读取表格内容,并传给一个数据框。

更多技能

除了使用浏览器内置的网页查看器,我们也可以考虑使用SelectorGadget(http://selectorgadget.com/ ) 来查找CSS路径。SelectorGadget是一个强大而且易用的谷歌Chrome扩展,它允许用户只需单击几次就抽取出目标元素的CSS路径。

1.为了使用SelectorGadget,访问下列链接:https://chrome.google.com/webstore/detail/selectorgadget/mhjhnkcfbdhnjickkkdbjoemdmbfginb 。然后,单击绿色按钮(图14中的红框)给Chrome安装插件:

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

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

除了rvest,你也可以使用Rselenium连接R和Selenium ,来爬取网页。Selenium最初是支持用户给浏览器发送命令的,并通过脚本自动执行过程的一个网络应用。但是,你也可以使用Selenium来爬取互联网上的数据。下面的介绍展示了使用Rselenium爬取 http://www.bloomberg.com/ 的过程。

1.首先,访问下列链接,下载Selenium单机服务器(http://www.seleniumhq.org/download/)。

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

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

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

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

6.查看服务器的状态:

7.然后,我们换到http://www.bloomberg.com/

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

时间: 2024-08-29 12:09:02

《数据科学:R语言实现》——2.7 爬取网络数据的相关文章

《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.3 数据清洗和变量格式化

2.3 数据清洗和变量格式化 本节我们考虑如何将特征矩阵列表menResMat转换为合适的格式以便于数据分析.目前,这些数据值都是字符型,这对于诸如找到参赛者年龄的中位数这样的数据分析是无益的.但是,我们可以利用as.numeric()函数很容易地将年龄转换为数值型.我们需要将整个矩阵都转换为数值型矩阵吗?事实并非如此,比如将参赛者的名字转换为数值型就毫无意义.为此,我们需要创建一个可以允许拥有不同类型变量的数据框.现在我们有6个变量:参赛者姓名.居住地.年龄以及3种类型的时间.正如刚才所说,我

手把手 | 教你爬下100部电影数据:R语言网页爬取入门指南

前言 网页上的数据和信息正在呈指数级增长.如今我们都使用谷歌作为知识的首要来源--无论是寻找对某地的评论还是了解新的术语.所有这些信息都已经可以从网上轻而易举地获得. 网络中可用数据的增多为数据科学家开辟了可能性的新天地.我非常相信网页爬取是任何一个数据科学家的必备技能.在如今的世界里,我们所需的数据都在互联网上,使用它们唯一受限的是我们对数据的获取能力.有了本文的帮助,您定会克服这个困难. 网上大多数的可用数据并不容易获取.它们以非结构化的形式(HTML格式)表示,并且不能下载.因此,这便需要

如何让R语言通过RODBC库读写数据库的数据

如何让R语言能够读写SQL Server里的数据 一. 安装RODBC库 1.进入R语言的GUI界面(RGUI.EXE),在菜单栏选择"程序包/安装程序包"(如图) 2.在弹出的窗口里往下拉,选择RODBC如图,点击确定 3.在ODBC数据源管理器里将需要的数据库添加进去,这里笔者使用的是SQL Server2008,驱动程序选择Native Client10.0 3.在R语言窗口输入连接语句 > library(RODBC) **这里是载入RODBC库 > channel

python爬取页面数据错误,连续爬很多页数。我主要改变的是post里面的参数pageno

问题描述 python爬取页面数据错误,连续爬很多页数.我主要改变的是post里面的参数pageno 爬数据的时候,比如有800页数据要爬,爬到400多页会出现返回400错误,没有数据.但是如果将程序从400页到800再重新爬,又不会报错. 求解决方法

请问这个连接怎么爬取分页数据,找不到连接

问题描述 请问这个连接怎么爬取分页数据,找不到连接 这个地址要在ie下浏览才能好用,想用爬虫爬取出最近的数据,但是分页那部分好像已经封装了,请明白人帮忙看看,怎么个思路.http://www.ccgp-liaoning.gov.cn/bulletininfo.do?method=bdetail 解决方案 从请求中可以看到这个参数bulletininfotable_p=1就是分页的

利用twitter api爬取twitter数据有哪些限制?

问题描述 利用twitter api爬取twitter数据有哪些限制? 利用twitter提供的API来爬取twitter数据都有那些限制啊?例如之前每个用户限制一个小时150次可是现在貌似没有这个限制了,不过限速,小弟初学,想请教下,这样爬取twitter数据的官方限制都具体有哪些? 解决方案 http://www.zhihu.com/question/35497572 解决方案二: 从Twitter API采集twitter数据twitter apitwitter api的使用

爬取微博数据遇到的问题

问题描述 现在已经能够进行模拟登陆了.为什么只能查看到一个公众人物的相关信息,诸如易中天.王文京.曾志勇等,却不能通过模拟登陆查看到诸如我的同事相关的信息呢?自己真的是想得太简单了,请解决了的.碰到了此问题的帮忙解答下 解决方案 解决方案二:你是通过开放平台爬取微博数据的么?解决方案三:不是,自个写的爬虫,硬爬,没有借助开放的api.解决方案四:引用2楼beijing20120926的回复: 不是,自个写的爬虫,硬爬,没有借助开放的api. 可以拿出来展示,大家研究下~~解决方案五:引用3楼s0

PHP中4种常用的抓取网络数据方法

  本小节的名称为 fsockopen,curl与file_get_contents,具体是探讨这三种方式进行网络数据输入输出的一些汇总.关于 fsockopen 前面已经谈了不少,下面开始转入其它.这里先简单罗列一下一些常见的抓取网络数据的一些方法. 1. 用 file_get_contents 以 get 方式获取内容: ? 1 2 3 $url = 'http://localhost/test2.php'; $html = file_get_contents($url); echo $ht

PHP中4种常用的抓取网络数据方法_php技巧

本小节的名称为 fsockopen,curl与file_get_contents,具体是探讨这三种方式进行网络数据输入输出的一些汇总.关于 fsockopen 前面已经谈了不少,下面开始转入其它.这里先简单罗列一下一些常见的抓取网络数据的一些方法. 1. 用 file_get_contents 以 get 方式获取内容: $url = 'http://localhost/test2.php'; $html = file_get_contents($url); echo $html; 2. 用fo