无法使用 rvest 在动态多标签网站中抓取表格

时间:2021-06-11 13:44:49

标签: r web-scraping rvest rselenium

我的目标

我的代码的目的是抓取以下 url 的 Characteristics 标签中的信息,最好是作为数据框

URL <- "https://plants.sc.egov.usda.gov/home/plantProfile?symbol=ACPL"

如下面的截图所示

enter image description here

为此,我通常会使用 rvest 包,但根据我在其他一些链接中阅读的内容,我可能还需要 RSelenium 包。

library(rvest)
library(RSelenium)

到目前为止我尝试了什么

使用 rvest 的 html_elements 获取元素

为了做到这一点,我在 firefox 中使用了 SelectorGadget 插件,当我选择表格时,我得到以下信息:

enter image description here

所以很自然地我尝试了这样的事情:

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

这是一个空列表,我不确定我在那里做错了什么。看看其他几个

动态标签面板?

再仔细看看这个,看起来这是一个动态页面,我必须以编程方式“激活”(如果这是正确的词)面板。

enter image description here

而且似乎有 RSelenium 派上用场的地方,我仍在努力弄清楚那个包,所以如果我弄清楚后没有答案,我会发布对这个问题的更新。

会话信息
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

1 个答案:

答案 0 :(得分:2)

数据是从 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)