Web Scraping BoardGameGeek 与 RVest

Web Scraping BoardGameGeek with RVest

我对使用 rvest 进行网络抓取几乎是全新的..而且除了 Qlik 编码之外,我对大多数东西都是新手。

我正在尝试抓取在 board game geek 上找到的数据,请参阅下文 link。使用 inspect,这看起来当然是可能的,但是 rvest 没有找到标签。我首先想到我必须使用 V8 完成整个 javascript 过程(javascript 在 html 的顶部被调用),但是当我只使用 html_text整个文件,我需要的所有信息都在那里。

*更新:它似乎在 JSON 中。我使用记事本++和网络工具的组合来清理它并加载到 R 中。关于如何系统地执行此操作的 tutorials/demos 有什么建议吗?我有所有需要循环的 links,但不确定如何通过代码从 html_text 输出到干净的 JSON 输入。 *

我在下面提供了示例,但我需要抓取大部分可用的数据元素,因此不是寻找要复制和粘贴的代码,而是寻找最佳方法。见下文。

Link: https://boardgamegeek.com/boardgame/63888/innovation

HTML 我试图从中提取的示例。跨越 returns 与 html_nodes 无关,所以我什至无法从那里开始。

<span ng-if="min > 0" class="ng-binding ng-scope">45</span>

<a title="Civilization" ng-href="/boardgamecategory/1015/civilization" class="ng-binding" href="/boardgamecategory/1015/civilization">Civilization</a>

页面顶部的 Javscript 部分如下:大约 8 个:

<script type="text/javascript" src="https://cf.geekdo-static.com/static/geekcollection_master2_5e84926ab7e90.js"></script>

当我在整个对象上使用 html_text 时,我可以找到我正在寻找的所有元素,例如:

\"minplaytime\":\"30\" OR {\"name\":\"Deck, Bag, and Pool Building\"

我假设这是 JSON?有没有办法解析 html_text 输出或其他方法?使用 V8 在页面顶部快速输入 javascript 是否更容易?有这方面的简单指南吗?

你知道吗,BGG 有一个 API?可以在此处找到文档:URL

代码将作为 XML 文件提供。因此,对于您的示例,您可以获得游戏的 ID - 您的示例是 63888(它在 URL 中)。因此 xml 文件可以在以下位置找到:https://www.boardgamegeek.com/xmlapi2/thing?id=63888

您可以使用此代码阅读信息:

library(dplyr)
library(rvest)

game_data <- read_xml("https://www.boardgamegeek.com/xmlapi2/thing?id=63888")
game_data %>% 
  html_nodes("name[type=primary]") %>% 
  html_attr("value") %>% 
  as.character()
#> [1] "Innovation"

通过检查 xml 文件,您可以选择要导出的节点。

reprex package (v0.3.0)

于 2020-04-06 创建