R 语言爬虫(使用 rvest 包)教程

您所在的位置:网站首页 r语言抓取网页数据 R 语言爬虫(使用 rvest 包)教程

R 语言爬虫(使用 rvest 包)教程

2023-09-18 09:27| 来源: 网络整理| 查看: 265

返回博客

R 语言爬虫(使用 rvest 包)教程

Augustas Pelakauskas

2022-10-283 min read

随着数字业务环境的快速发展,网络抓取的力量变得愈发不容忽视。通过网络抓取提取公共数据进行分析,以生成见解,从而改变和提升业务前景。

如果需要学习一门新的编程语言才能开始使用网络抓取,这可能令人望而却步。值得庆幸的是,越来越多的编程语言都有强大的库来帮助更方便地进行网页数据抓取。

数据和统计分析中最常用的编程语言之一是 R。它是一种开源编程语言,有许多开源库,大量用户都在用它来进行网络抓取。

尽管如此,R 语言对初学者来说还是很有挑战性,尤其是与 Python 等其他使用更为广泛的语言相比。重要的是要记住,R 主要是用于统计和数据分析,而 Python 则更为通用。如果您会 R 语言,那么从网页中抓取数据相对简单。可将网页转换为数据框或 CSV 文件以供进一步分析。

本教程将介绍 R 语言爬虫代码的基础知识。我们首先讲述如何抓取静态页面,然后重点讲述可用于从使用 JavaScript 呈现内容的动态网站中抓取数据的技术。了解如何构建R语言网络爬虫,rvest 爬虫。

安装要求

所需安装的组件分为两个部分:安装 R 和 RStudio,以及安装库。

安装 R 和 RStudio

第一阶段是准备 R 语言的开发环境。这将需要两个组件:R 和 RStudio。

下载和安装 R,请访问此页面。点选安装 base 就可以了。

或者,您可以使用包管理器,例如针对 Mac 的 Homebrew,或针对 Windows 的 Chocolatey。

如果是 macOS,运行以下:

brew install r

如果是 Windows,则运行以下:

choco install r.project

接下来是下载和安装 RStudio,前往此页面。选择 RStudio Desktop 免费版本就可以。

如果您更喜欢包管理器,请使用以下命令,用于 macOS 的 Homebrew 和用于 Windows 的 Chocolatey:

如果是 macOS,运行以下代码:

brew install --cask r-studio

如果是 Windows,则运行以下代码:

choco install r.studio

完成安装后,打开 RStudio。

打开 RStudio

安装所需的库

可以通过两种方法安装所需的库。  首先可以通过 RStudio 的用户界面。在 Help(帮助)部分中找到 Package(包)选项卡。选择 Packages(包)选项卡以激活相关的数据包部分。在这个部分中,点击 Install(安装)按钮。

此时就会打开 Install Package(安装包)对话框。在包的文本框中输入包的名称。最后,点击 Install(安装)。

对于本教程的第一部分,我们将使用的包是 rvest。我们还需要 dplyr 包,以便使用管道操作符。这样做会使代码简洁易读。

分别输入这两个包名称,用逗号分隔,然后单击 Install(安装)。

安装库

另一种方式是通过控制台安装这些包。在控制台中运行以下命令:

install.packages("rvest") install.packages("dplyr")

现在库已安装好。下一步开始抓取数据。

用 rvest 进行网页抓取(rvest 爬虫)

R 语言中最常用于公共网页抓取的库就是 rvest。它提供了通过 CSS 选择器和 XPath 访问公共网页和查询特定元素的功能。这个库是 Tidyverse 数据科学软件包集合的组成部分,这就是说 Tidyverse 的所有库中的编码约定都是相同的。

我们使用 rvest 启动网页抓取操作。第一步是向目标网页发送 HTTP GET 请求。我们将尝试各种 rvest 示例。

本节以 rvest 备忘单的形式编写,方便您可以跳转到需要帮助学习的任何部分。

发送 GET 请求

在 Source 区域中输入以下内容开始加载 rvest 库:

library(rvest)

只需将光标放在所需的行,选择它,然后单击源区域右上方的 “Run” 按钮,即可执行在源区域中输入的所有命令。

或者,根据您的操作系统,您可以按组合键 Ctrl + Enter 或 Command + Enter。

在这个示例中,我们将从列出 ISO CountryCodes 的网页中抓取公开可用的数据。超链接可以存储在变量中:

link = "https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes"

可以使用简单函数 read_html() 向该页面发送 HTTP GET 请求。

此函数需要一个强制参数:路径或 URL。请注意,此函数还可以读取 HTML 字符串:

page = read_html(link)

以上函数向 URL 发送 HTTP GET 请求,检索网页,并返回一个 html_document 类型的对象。

html_document 对象包含来自 HTML 文档的所需公共数据。许多 rvest 函数都可用于查询和提取特定的 HTML 元素。

请注意,如果需要使用 rvest 代理,请运行以下命令在脚本中设置代理:

Sys.setenv(http_proxy="http://proxyserver:port")rvest read_html timeout

read_html 不提供 timeout 的控制方法。可以通过 httr 库来处理rvest read_html timeout。此库中的 GET 函数和 tryCatch 可以帮助处理 timeout 错误。

或者,您可以使用 rvest 中的会话对象,如下所示:

url % html_element()

如果未指定选择器类型,系统会假定它是 CSS 选择器。例如,此 Wiki 网页在表中包含所需的公共数据。

表单的 HTML 标记

此表格的 HTML 标记如下:

创建唯一选择器所需的类就是 sortable 类。这就意味着 CSS 选择器可以和 table.sortable 一样简单。使用此选择器,函数调用将如下所示:

htmlElement % html_element("table.sortable")

它将生成的 html_element 存储在变量 htmlElement 中。

我们的网页抓取项目的下一步,就是将 html_element 中包含的公共数据转化为数据框。

使用 rvest 获取 HTML 元素属性

在上一节中,我们讨论了使用 html_element 函数选择元素。

通过这个函数可以轻松使用 rvest select class。例如,如果要选择具有类标题的元素,只需编写以下代码行:

heading % html_element(".heading")

还有一个用例就是 rvest div class。如果您要用 rvest 来选择 div,那么您可以输入以下代码:

page %>% html_element(“div")

如果您用 rvest 来选择带有类的 div:

page %>% html_element(“div.heading”)

您可能遇到选择 HTML 节点是 html_node() 的函数。请注意,这种在 rvest 中选择 HTML 节点的方式现在已过时;而应该使用 html_element() 和 html_elements()。

从这个函数,您可以通过调用函数 html_text() 提取文本,代码如下:

heading %>% html_text()

或者,如果要查找属性,可以使用 rvest html_attr 函数。例如,以下代码可以提取元素的 src 属性:

element %>% html_attr(“src")

在处理 HTML 表格时,可以使用 rvest 读取表格函数。此函数可以提取包含 元素的 HTML 并返回数据框。

html_table(htmlElement)

可以这样构建 rvest 提取表格代码:

page %>% html_table()

正如您所看到的,我们可以发送整个页面和 rvest 读取表格,所有这些数据。

使用 rvest 抓取 JavaScript 页面

如果要抓取使用 JavaScript 的页面,可以通过两种方式进行。第一种方式是使用 RSelenium。我们将在本文的下一节详细介绍这种方法。

在本节中,我们讨论第二种方法。这种方法可以查找包含相关数据的隐藏 API。

https://quotes.toscrape.com/scroll 就是个很好的示例,让我们来了解如何处理 rvest JavaScript。这个网站使用无限滚动。

在 Chrome 浏览器中打开网站,按 F12,然后前往网络选项卡。有了网络信息,我们就可以通过 rvest 轻松实现无限滚动。

向下滚动以加载更多内容并查看网络流量。您会注意到,每次加载一组新引号时,都会发送请求调用 URL https://quotes.toscrape.com/api/quotes?page=2,其中页码不断增加。

还有一点值得注意,响应是以 JSON 格式返回的。有一种构建 rvest JSON 解析器的简单方法。

首先读取页面,然后定位

标签。这类标签中包含文本格式的 JSON 数据。

page % html_text()

要将这个 JSON 文本解析为 R 对象,需要使用另一个库 - jsonlite:

library(jsonlite)

现在,使用 fromJSON 方法将此 rvest JSON 文本转换为原生 R 对象。

r_object % fromJSON()

您可以用循环来解析有无限滚动页面的 rvest javascript。在以下示例中,我们将运行此循环十次:

for (x in 1:10) { url


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3