本节书摘来自华章计算机《数据科学:R语言实现》一书中的第2章,第2.7节,作者 丘祐玮(David Chiu),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
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选取器爬取数据: