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 创建
我对使用 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 创建