用 R 进行网络抓取如何让数据科学变得有趣

Raluca Penciuc,2022 年 10 月 19 日

随着网络的发展,动态生成的数据越来越多。这使得使用 API 提取数据变得更加困难。R 中的 Web scraping 可以帮助数据科学家,因为他们的项目需要大量数据。

幸运的是,编程语言也在不断发展,以应对这些情况。R 语言就是这种语言的一个流行例子,它旨在更好地管理大量任务。

在本教程中,我将通过讲述 R 在现实生活中的实用性来介绍其基本原理。我还将介绍在使用 R 进行网络搜索时最常用的软件包之一 rvest。然后,我将说明 R 在提取网站数据时是如何工作的。

R 简介

R 是S 编程语言的开源版本,结合了Scheme 的语义。它于 1993 年中期首次出现,1995 年成为开源语言,2000 年发布了第一个稳定的测试版。

博客图片

罗斯-伊哈卡(Ross Ihaka)和罗伯特-温特曼(Robert Gentleman)设计 R 的目的是 "快速、忠实地将想法转化为软件"。

R 是一种函数式编程语言,在数据科学家中享有盛誉。它最受欢迎的使用案例包括

  • 银行业务
  • 财政;
  • 电子商务;
  • 机器学习;
  • 任何其他使用大量数据的部门。

与 SAS 和 SPSS 相比,R 是世界上使用最多的分析工具。其活跃的支持性社区拥有近 200 万用户。

如果我们看一看一些将 R 技术融入其业务的公司以及它们是如何做到这一点的,我们就会发现: :

  • Facebook:更新状态及其社交网络图;
  • 谷歌:预测经济活动,提高在线广告效率;
  • Foursquare:因为它的推荐引擎;
  • Trulia:预测房价和当地犯罪率。

然而,与其他语言相比,R 语言与 Python 的竞争并不激烈。这两种语言都提供网络搜索工具,并拥有活跃的社区。

当我们看一下目标受众时,差异就显现出来了。Python 的语法非常容易上手,而且有很多高级功能。这使它对初学者和非技术用户更有吸引力。

R 最初看起来有点吓人,但它更侧重于统计分析。它提供了更多的内置数据分析和数据可视化工具。因此,对于需要处理大量数据的项目(如网络搜索)来说,R 是一个更好的选择。

关于 rvest

Rvest 是 R 语言中最常用的网络搜刮软件包之一,具有强大而简单的解析功能。Python 的 BeautifulSoup 是它的灵感来源,也是tidyverse套件的一部分。

很酷,但既然 R 原生库可以完成同样的工作,为什么还要使用 rvest 呢?第一个很好的理由是,rvest 是httrxml2包的封装器。这意味着它同时处理 GET 请求和 HTML 解析。

这样,您只需使用一个库而非两个库,代码也会更加简洁。不仅如此,rvest 还可以接收字符串作为输入,并处理 XML 解析和文件下载。

然而,我们应该考虑到,网站有更多动态生成的内容。原因多种多样:性能、用户体验等等。Rvest 无法处理 JavaScript 的执行,因此您应该寻找一种替代方案。

使用 R 进行搜索

好了,理论讲得够多了。让我们看看 R 在实际应用中的表现。在本教程中,我选择了一本非常有名的书的 Goodreads 页面:乔治-奥威尔的《1984》。您可以在这里找到该网站:https://www.goodreads.com/book/show/61439040-1984。

我想看看这本书的受欢迎程度在过去几年中是如何演变的。为此,我将抓取评论列表,提取每篇评论的日期和评分。最后一步,我将把数据保存到一个外部文件中,以便以后用其他程序处理。

设置环境

但首先,您必须确保拥有编写代码所需的一切。

博客图片

关于集成开发环境,您有两个选择:

  • 为 Visual Studio Code 安装R 插件
  • 下载 RStudio,它可让您毫不费力地使用 R 进行编码。

在本教程中,我将使用后者。您可以在这里下载:https://www.rstudio.com/products/rstudio/download/。

博客图片

RStudio Desktop 的免费版本足以让你轻松掌握基础知识。和以前一样,请按照安装说明进行操作。

打开 RStudio,新建一个空目录。我将在名为"goodreads-rvest.r "的新文件中编写代码。

呈现浏览器

现在,在提取数据之前,您必须确认您想要什么数据。Rvest 可以处理 CSS 和 XPath 选择器,所以请选择你的战斗机。 

如果您打算开始更复杂的搜索项目,我建议您掌握 HTML 和 CSS 的基本知识。这里有一个很好的入门平台。

如果您不熟悉 HTML,也有一些非技术性的选择。例如,Chrome 浏览器提供了浏览器扩展SelectorGadget。它允许你点击页面上的任意位置,并显示获取数据的 CSS 选择器。

然而,并非每个网站都像 Goodreads 一样简单。我会选择使用通过手动检查 HTML 找到的 CSS 选择器来检索数据。

在浏览器中导航到我们的目标 URL,向下滚动到 "社区评论 "部分。然后右键单击,选择 "检查",打开 "开发工具"。

博客图片

带有 "other_reviews"id 的容器是我要关注的重点。现在,你可以使用 "检查 "按钮找到评论日期和评分的 CSS 选择器。

博客图片

所以,你可以注意到以下几点:

  • 每个评论都是一个带有 "评论"类的div 容器;
  • 评论的日期是一个单一的元素,带有 "reviewDate"类;
  • 评论的评级是一个带有 "staticStars"类的span 元素。它有五个 span 元素作为子元素,即用户可以设置的星星数量。我们将查看带有 "p10"类的彩色元素。

提取评论

检查完所有前提条件后,您就可以开始编写代码了。

install.packages('rvest')

将光标放在该行末尾,然后按下代码编辑器上方的 "运行 "按钮。你将在控制台中看到软件包的安装进度。

安装只进行一次,因此现在可以注释或删除前一行:

#install.packages('rvest')

现在,您必须加载(或导入)程序库:

library(rvest)

我将使用read_html函数向目标网站发送 GET 请求,下载所需的 HTML 文档。这样我就能下载所需的 HTML 文档了:

book_html <- read_html("https://www.goodreads.com/book/show/61439040-1984")

现在,结果存储在 book_html 变量中,你只需在控制台中输入即可看到:

博客图片

如果您需要随时查看要使用的函数的官方文档,请在控制台中键入:

help(function_name) 

RStudio 将打开一个 HTTP 服务器,并直接链接到文档。对于 read_html,输出将是

博客图片

要获取评论列表,我将使用 html_elements 函数。它将接收我之前找到的 CSS 选择器作为输入:

reviews <- book_html %>% html_elements('div.review')

结果将是一个 XML 节点列表,我将遍历该列表以获取每个单独元素的日期和评级:

博客图片

R 程序员使用管道运算符"%>%"使编码更加灵活。它的作用是将左操作数的值作为参数传递给右操作数。

您可以对操作数进行链式处理(本指南稍后将介绍),因此它可以帮助您减少大量局部变量。如果不使用管道操作符,上一行代码将如下所示:

reviews <- html_elements(book_html, 'div.review')

为了收集数据,我将在循环外初始化两个向量。通过快速浏览网站,我可以保证两个向量的长度相同。

dates <- vector()
ratings <- vector()

现在,在遍历评论列表时,我会查找两个值:日期和评分。如前所述,日期是一个具有reviewDate 类的锚元素。

评级是一个带有staticStars 类的 span 元素,每个星级包含五个 span 元素。如果用户给了一颗星,那么该 span 元素将使用p10 类名,而其余的将使用p0 类名。

代码将如下所示:

for (review in reviews) {
review_date = review %>% html_element('a.reviewDate') %>% html_text()
dates <- c(dates, review_date)

review_rating_element = review %>% html_element('span.staticStars')
valid_stars = review_rating_element %>% html_elements('span.p10')
review_rating = length(valid_stars)
ratings <- c(ratings, review_rating)
}

请注意html_element函数,它不是一个错别字。当您想提取 XML 节点列表时,可以使用html_elements,而提取单个节点时,则可以使用html_element

在本例中,我将后者应用于 HTML 文档的一个较小部分(评论)。我还使用了html_text函数来帮助我获取所找到元素的文本内容。 

最后,我将把这两个向量合并到一个数据框中,以集中数据:

result = data.frame(date = dates, rating = ratings)

最终结果将是这样的

博客图片

保存结果

我们都知道,如果不将结果存储在某个地方,刮擦就毫无用处。在 R 语言中,将结果写入 CSV 也不过如此:

write.csv(result, "reviews.csv")

结果必须是矩阵或数据帧(已经是矩阵或数据帧),否则会尝试转换。运行代码并检查项目目录。你会发现可以用文本编辑器、Excel 文档等打开前一个表格。

结果必须是矩阵或数据帧(已经是矩阵或数据帧),否则会尝试转换。运行代码并检查项目目录。你会发现可以用文本编辑器、Excel 文档等打开前一个表格。

不用说,我们的数据列表只有 30 个条目。该网站显示有超过 9 万条评论和 300 多万个评分。到底发生了什么?嗯,分页。

不仅如此,请返回浏览器并点击第二页。你会发现列表会改变,但 URL 不会改变。这说明它们使用了一种状态来动态加载列表的另一部分。

在这种情况下,rvest 可能无济于事。相反,自动浏览器可以帮助模仿点击行为来加载列表的其余部分。RSelenium 就是这种库的一个例子,但我将把这个主题留作后续练习。

结论

我希望本教程能为你使用 R 进行网络搜索打下坚实的基础。现在,你可以更轻松地决定下一个项目的技术栈了。

但请注意,本文并未涵盖网络搜索的诸多挑战。你可以在这本不言自明的指南中找到更详细的概念。

新闻和更新

订阅我们的时事通讯,了解最新的网络搜索指南和新闻。

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

相关文章

缩图
指南如何抓取亚马逊产品数据:最佳实践与工具综合指南

通过我们的深入指南,探索刮擦亚马逊产品数据的复杂性。从最佳实践和亚马逊 Scraper API 等工具到法律注意事项,了解如何应对挑战、绕过验证码并高效提取有价值的见解。

Suciu Dan
作者头像
Suciu Dan
15 分钟阅读
缩图
指南在线职位搜索终极指南,它的利与弊

在线职位搜索的定义和用途。职位搜索的优缺点、策略和潜在风险。

Suciu Dan
作者头像
Suciu Dan
8 分钟阅读
缩图
指南了解如何使用最好的 Selenium 浏览器绕过 Cloudflare 检测

了解在使用 Selenium 进行网络刮擦时,绕过 Cloudflare 检测系统的最佳浏览器是什么。

米赫内亚-奥克塔维安-马诺拉什
作者头像
米赫内亚-奥克塔维安-马诺拉什
9 分钟阅读