无法使用 rvest 在动态多标签网站中抓取 table
Unable to scrape table in dynamic multitab website using rvest
我的objective
我的代码的objective是抓取下面url的Characteristics标签中的信息,最好是作为数据框[=21] =]
URL <- "https://plants.sc.egov.usda.gov/home/plantProfile?symbol=ACPL"
如下图所示
为此,我通常会使用 rvest 包,但我在其他一些链接中阅读的内容中,我可能还需要 RSelenium包。
library(rvest)
library(RSelenium)
到目前为止我尝试了什么
使用 rvest 的 html_elements
获取元素
为了做到这一点,我在 firefox 中使用 SelectorGadget 插件,当我 select table 我得到以下信息:
所以我很自然地尝试了这样的事情:
Test <- rvest::read_html(URL)
Test2 <- Test %>%
rvest::html_elements("section")
两个对象如下:
str(Test)
# List of 2
# $ node:<externalptr>
# $ doc :<externalptr>
# - attr(*, "class")= chr [1:2] "xml_document" "xml_node"
和
str(Test2)
# list()
# - attr(*, "class")= chr "xml_nodeset"
length(Test2)
# [1] 0
这是一个空列表,我不确定我在那里做错了什么。看其他几个
动态标签面板?
仔细研究一下,这似乎是一个动态页面,我必须以编程方式“激活”(如果这个词正确的话)面板。
似乎 RSelenium 派上用场了,我仍在尝试找出该软件包,因此如果我弄清楚时没有答案,我将 post 更新此问题。
会话信息
sessioninfo::session_info()
# ─ Session info ───────────────────────────────────────────────────────────────
# setting value
# version R version 4.1.0 (2021-05-18)
# os Ubuntu 18.04.5 LTS
# system x86_64, linux-gnu
# ui X11
# language (EN)
# collate en_US.UTF-8
# ctype en_US.UTF-8
# tz America/Santiago
# date 2021-06-11
#
# ─ Packages ───────────────────────────────────────────────────────────────────
# package * version date lib source
# askpass 1.1 2019-01-13 [1] CRAN (R 4.1.0)
# assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.1.0)
# binman 0.1.2 2020-10-02 [1] CRAN (R 4.1.0)
# bitops 1.0-7 2021-04-24 [1] CRAN (R 4.1.0)
# caTools 1.18.2 2021-03-28 [1] CRAN (R 4.1.0)
# cli 2.5.0 2021-04-26 [1] CRAN (R 4.1.0)
# curl 4.3.1 2021-04-30 [1] CRAN (R 4.1.0)
# digest 0.6.27 2020-10-24 [1] CRAN (R 4.1.0)
# evaluate 0.14 2019-05-28 [1] CRAN (R 4.1.0)
# fs 1.5.0 2020-07-31 [1] CRAN (R 4.1.0)
# glue 1.4.2 2020-08-27 [1] CRAN (R 4.1.0)
# highr 0.9 2021-04-16 [1] CRAN (R 4.1.0)
# htmltools 0.5.1.1 2021-01-22 [1] CRAN (R 4.1.0)
# httr 1.4.2 2020-07-20 [1] CRAN (R 4.1.0)
# knitr 1.33 2021-04-24 [1] CRAN (R 4.1.0)
# lifecycle 1.0.0 2021-02-15 [1] CRAN (R 4.1.0)
# magrittr 2.0.1 2020-11-17 [1] CRAN (R 4.1.0)
# mime 0.10 2021-02-13 [1] CRAN (R 4.1.0)
# openssl 1.4.4 2021-04-30 [1] CRAN (R 4.1.0)
# png 0.1-7 2013-12-03 [1] CRAN (R 4.1.0)
# R6 2.5.0 2020-10-28 [1] CRAN (R 4.1.0)
# Rcpp 1.0.6 2021-01-15 [1] CRAN (R 4.1.0)
# reprex 2.0.0 2021-04-02 [1] CRAN (R 4.1.0)
# rlang 0.4.11 2021-04-30 [1] CRAN (R 4.1.0)
# rmarkdown 2.8 2021-05-07 [1] CRAN (R 4.1.0)
# RSelenium * 1.7.7 2020-02-03 [1] CRAN (R 4.1.0)
# rstudioapi 0.13 2020-11-12 [1] CRAN (R 4.1.0)
# rvest * 1.0.0 2021-03-09 [1] CRAN (R 4.1.0)
# semver 0.2.0 2017-01-06 [1] CRAN (R 4.1.0)
# sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 4.1.0)
# stringi 1.6.2 2021-05-17 [1] CRAN (R 4.1.0)
# stringr 1.4.0 2019-02-10 [1] CRAN (R 4.1.0)
# wdman 0.2.5 2020-01-31 [1] CRAN (R 4.1.0)
# withr 2.4.2 2021-04-18 [1] CRAN (R 4.1.0)
# xfun 0.23 2021-05-15 [1] CRAN (R 4.1.0)
# XML 3.99-0.6 2021-03-16 [1] CRAN (R 4.1.0)
# xml2 1.3.2 2020-04-23 [1] CRAN (R 4.1.0)
# yaml 2.2.1 2020-02-01 [1] CRAN (R 4.1.0)
#
# [1] /home/derek/R/x86_64-pc-linux-gnu-library/4.1
# [2] /usr/local/lib/R/site-library
# [3] /usr/lib/R/site-library
# [4] /usr/lib/R/library
数据是从 API 调用中动态检索的。您可以直接从 url 中检索并简化返回的 json 以获取数据帧:
library(jsonlite)
data <- jsonlite::read_json('https://plantsservices.sc.egov.usda.gov/api/PlantCharacteristics/92843', simplifyVector = T)
您需要在最后选择该 ID,但要使其可重复使用:
library(jsonlite)
id <- jsonlite::read_json('https://plantsservices.sc.egov.usda.gov/api/PlantProfile?symbol=ACPL')$Id
data <- jsonlite::read_json(paste0('https://plantsservices.sc.egov.usda.gov/api/PlantCharacteristics/', id), simplifyVector = T)
我的objective
我的代码的objective是抓取下面url的Characteristics标签中的信息,最好是作为数据框[=21] =]
URL <- "https://plants.sc.egov.usda.gov/home/plantProfile?symbol=ACPL"
如下图所示
为此,我通常会使用 rvest 包,但我在其他一些链接中阅读的内容中,我可能还需要 RSelenium包。
library(rvest)
library(RSelenium)
到目前为止我尝试了什么
使用 rvest 的 html_elements
获取元素为了做到这一点,我在 firefox 中使用 SelectorGadget 插件,当我 select table 我得到以下信息:
所以我很自然地尝试了这样的事情:
Test <- rvest::read_html(URL)
Test2 <- Test %>%
rvest::html_elements("section")
两个对象如下:
str(Test)
# List of 2
# $ node:<externalptr>
# $ doc :<externalptr>
# - attr(*, "class")= chr [1:2] "xml_document" "xml_node"
和
str(Test2)
# list()
# - attr(*, "class")= chr "xml_nodeset"
length(Test2)
# [1] 0
这是一个空列表,我不确定我在那里做错了什么。看其他几个
动态标签面板?
仔细研究一下,这似乎是一个动态页面,我必须以编程方式“激活”(如果这个词正确的话)面板。
似乎 RSelenium 派上用场了,我仍在尝试找出该软件包,因此如果我弄清楚时没有答案,我将 post 更新此问题。
会话信息sessioninfo::session_info()
# ─ Session info ───────────────────────────────────────────────────────────────
# setting value
# version R version 4.1.0 (2021-05-18)
# os Ubuntu 18.04.5 LTS
# system x86_64, linux-gnu
# ui X11
# language (EN)
# collate en_US.UTF-8
# ctype en_US.UTF-8
# tz America/Santiago
# date 2021-06-11
#
# ─ Packages ───────────────────────────────────────────────────────────────────
# package * version date lib source
# askpass 1.1 2019-01-13 [1] CRAN (R 4.1.0)
# assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.1.0)
# binman 0.1.2 2020-10-02 [1] CRAN (R 4.1.0)
# bitops 1.0-7 2021-04-24 [1] CRAN (R 4.1.0)
# caTools 1.18.2 2021-03-28 [1] CRAN (R 4.1.0)
# cli 2.5.0 2021-04-26 [1] CRAN (R 4.1.0)
# curl 4.3.1 2021-04-30 [1] CRAN (R 4.1.0)
# digest 0.6.27 2020-10-24 [1] CRAN (R 4.1.0)
# evaluate 0.14 2019-05-28 [1] CRAN (R 4.1.0)
# fs 1.5.0 2020-07-31 [1] CRAN (R 4.1.0)
# glue 1.4.2 2020-08-27 [1] CRAN (R 4.1.0)
# highr 0.9 2021-04-16 [1] CRAN (R 4.1.0)
# htmltools 0.5.1.1 2021-01-22 [1] CRAN (R 4.1.0)
# httr 1.4.2 2020-07-20 [1] CRAN (R 4.1.0)
# knitr 1.33 2021-04-24 [1] CRAN (R 4.1.0)
# lifecycle 1.0.0 2021-02-15 [1] CRAN (R 4.1.0)
# magrittr 2.0.1 2020-11-17 [1] CRAN (R 4.1.0)
# mime 0.10 2021-02-13 [1] CRAN (R 4.1.0)
# openssl 1.4.4 2021-04-30 [1] CRAN (R 4.1.0)
# png 0.1-7 2013-12-03 [1] CRAN (R 4.1.0)
# R6 2.5.0 2020-10-28 [1] CRAN (R 4.1.0)
# Rcpp 1.0.6 2021-01-15 [1] CRAN (R 4.1.0)
# reprex 2.0.0 2021-04-02 [1] CRAN (R 4.1.0)
# rlang 0.4.11 2021-04-30 [1] CRAN (R 4.1.0)
# rmarkdown 2.8 2021-05-07 [1] CRAN (R 4.1.0)
# RSelenium * 1.7.7 2020-02-03 [1] CRAN (R 4.1.0)
# rstudioapi 0.13 2020-11-12 [1] CRAN (R 4.1.0)
# rvest * 1.0.0 2021-03-09 [1] CRAN (R 4.1.0)
# semver 0.2.0 2017-01-06 [1] CRAN (R 4.1.0)
# sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 4.1.0)
# stringi 1.6.2 2021-05-17 [1] CRAN (R 4.1.0)
# stringr 1.4.0 2019-02-10 [1] CRAN (R 4.1.0)
# wdman 0.2.5 2020-01-31 [1] CRAN (R 4.1.0)
# withr 2.4.2 2021-04-18 [1] CRAN (R 4.1.0)
# xfun 0.23 2021-05-15 [1] CRAN (R 4.1.0)
# XML 3.99-0.6 2021-03-16 [1] CRAN (R 4.1.0)
# xml2 1.3.2 2020-04-23 [1] CRAN (R 4.1.0)
# yaml 2.2.1 2020-02-01 [1] CRAN (R 4.1.0)
#
# [1] /home/derek/R/x86_64-pc-linux-gnu-library/4.1
# [2] /usr/local/lib/R/site-library
# [3] /usr/lib/R/site-library
# [4] /usr/lib/R/library
数据是从 API 调用中动态检索的。您可以直接从 url 中检索并简化返回的 json 以获取数据帧:
library(jsonlite)
data <- jsonlite::read_json('https://plantsservices.sc.egov.usda.gov/api/PlantCharacteristics/92843', simplifyVector = T)
您需要在最后选择该 ID,但要使其可重复使用:
library(jsonlite)
id <- jsonlite::read_json('https://plantsservices.sc.egov.usda.gov/api/PlantProfile?symbol=ACPL')$Id
data <- jsonlite::read_json(paste0('https://plantsservices.sc.egov.usda.gov/api/PlantCharacteristics/', id), simplifyVector = T)