我对于使用RVest进行网页抓取是非常陌生的,而且除了Qlik编码之外,几乎对所有其他事物都是真正的新事物。
我正在尝试抓取在棋盘游戏怪胎中找到的数据,请参见以下链接。使用inspect,似乎确实可行,但是rvest找不到标签。我首先以为我必须使用V8来完成整个javascript过程(在html的顶部调用javascript),但是当我只在整个文档中使用html_text时,我需要的所有信息都在其中。
* UPDATE:它似乎是JSON。我使用notepad ++和网络工具的组合将其清理并加载到R中。有关教程/演示的建议,如何系统地执行此操作?我拥有需要遍历的所有链接,但不确定如何通过代码从html_text输出转换为干净的JSON输入。 *
我在下面提供了示例,但我需要抓取大部分可用的数据元素,因此,不是要查找要复制和粘贴的代码,而是要寻求的最佳方法。见下文。
链接:https://boardgamegeek.com/boardgame/63888/innovation
HTML示例,我尝试从中获取。 Span的html_nodes不返回任何内容,所以我什至无法从那里开始。
<span ng-if="min > 0" class="ng-binding ng-scope">45</span>
OR
<a title="Civilization" ng-href="/boardgamecategory/1015/civilization" class="ng-binding" href="/boardgamecategory/1015/civilization">Civilization</a>
页面顶部的脚本部分如下:其中约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赶往页面更容易吗?有一个简单的指南吗?
答案 0 :(得分:0)
您是否知道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创建