使用 rvest 在 R 中从网站上抓取表格

问题描述 投票:0回答:1

我想从 https://sebgroup.com/our-offering/prospectuses-and-downloads/rates/swap-rates

获取欧元掉期利率

已经有很多关于此类抓取问题的问题和答案,但不幸的是,他们都没有尝试在这里提供帮助。所以请为我提供有关这个具体问题的提示。

我尝试过直接使用table类或者各种版本的div类,比如

url <- paste0("https://sebgroup.com/our-offering/prospectuses-and-downloads/rates/swap-rates/")
xml2::read_html(url) %>%  
  rvest::html_nodes(xpath="//div[@class='overflow-auto table-container']") 

xml2::read_html(url) %>%
  rvest::html_nodes(xpath="//table[@class='table text-nowrap w-100 mb-6']") 

但回复始终是 {xml_nodeset (0)}

非常感谢任何帮助!

r web-scraping rvest
1个回答
0
投票

表格内容不包含在页面源中,而是由浏览器中运行的 Javascript 获取。当通过浏览器的开发工具检查元素时,该 DOM 树可能无法反映

rvest
可用的内容,它可以通过 Javascript 进行大量修改,而
rvest
只能与实际页面源一起使用。要检查源代码,请在页面上下文菜单中选择 “查看页面源代码” 而不是“检查”,或导航至
view-source:https://sebgroup.com/our-offering/prospectuses-and-downloads/rates/swap-rates
。或者禁用特定页面的 Javascript,刷新并检查。

或者更好的是,保存并浏览由

rvest
加载的确切内容,因为与传递到浏览器的内容相比,它仍然可能有很大不同:

rvest::read_html(url) %>% xml2::write_html("page.html")

因此,在这种特殊情况下,我们可以自己进行相同的 API 调用并使用返回的 JSON 响应,而不是使用页面源:

library(dplyr, warn.conflicts = FALSE)
library(tidyr)
library(purrr)

# transform a list of tables, ex:
# [[1]]
#        value align tooltip decimals valueType clickValue
# 1       1 Yr  <NA>      NA       NA      <NA>         NA
# 2       4.26 right      NA        2      <NA>         NA
# 3      -0.04 right      NA        2      diff         NA
# 4      11:41 right      NA       NA      <NA>         NA
# 5 2023-08-31 right      NA       NA      <NA>         NA
# 
# [[2]]
#        value align tooltip decimals valueType clickValue
# 1       2 Yr  <NA>      NA       NA      <NA>         NA
# 2       3.99 right      NA        2      <NA>         NA
# 3      -0.05 right      NA        2      diff         NA
# 4      11:41 right      NA       NA      <NA>         NA
# 5 2023-08-31 right      NA       NA      <NA>         NA

# , to a single table 
format_cur_data <- function(d){
  tibble(data = d) %>% 
    mutate(row = row_number()) %>% 
    unnest(data) %>% 
    mutate(name = c( "maturity", "price", "diff", "time", "date"), .by = row) %>% 
    select(row, name, value) %>% 
    pivot_wider(names_from = name, values_from = value)
} 

rates_api <- "https://sebgroup.com/ssc/trading/fx-rates-bff/api/rates/swap?currency="

# cycle thrrough list of currencies,
# request swap rates,
# extract table content from response and 
# and call format_cur_data()
c("SEK", "NOK") %>% 
  set_names() %>% 
  map(\(cur) paste0(rates_api, cur)) %>% 
  map(jsonlite::fromJSON) %>% 
  map(list("rows", "data")) %>% 
  map(format_cur_data)

SEKNOK 的结果:

#> $SEK
#> # A tibble: 14 × 6
#>      row maturity price diff  time  date      
#>    <int> <chr>    <chr> <chr> <chr> <chr>     
#>  1     1 1 Yr     4.26  -0.04 12:16 2023-08-31
#>  2     2 2 Yr     3.99  -0.05 12:16 2023-08-31
#>  3     3 3 Yr     3.75  -0.06 12:16 2023-08-31
#>  4     4 4 Yr     3.57  -0.05 12:16 2023-08-31
#>  5     5 5 Yr     3.44  -0.05 12:16 2023-08-31
#>  6     6 6 Yr     3.36  -0.05 12:16 2023-08-31
#>  7     7 7 Yr     3.31  -0.05 12:16 2023-08-31
#>  8     8 8 Yr     3.27  -0.05 12:16 2023-08-31
#>  9     9 9 Yr     3.24  -0.05 12:16 2023-08-31
#> 10    10 10 Yr    3.23  -0.05 12:16 2023-08-31
#> 11    11 12 Yr    3.21  0     12:16 2023-08-31
#> 12    12 15 Yr    3.18  0     12:16 2023-08-31
#> 13    13 20 Yr    3.08  0     12:16 2023-08-31
#> 14    14 30 Yr    2.81  0     12:16 2023-08-31
#> 
#> $NOK
#> # A tibble: 12 × 6
#>      row maturity price diff  time  date      
#>    <int> <chr>    <chr> <chr> <chr> <chr>     
#>  1     1 1 Yr     5.02  3.16  12:15 2023-08-31
#>  2     2 2 Yr     4.95  2.36  12:15 2023-08-31
#>  3     3 3 Yr     4.7   1.84  12:15 2023-08-31
#>  4     4 4 Yr     4.51  1.56  12:15 2023-08-31
#>  5     5 5 Yr     4.38  1.4   12:15 2023-08-31
#>  6     6 6 Yr     4.28  1.3   12:15 2023-08-31
#>  7     7 7 Yr     4.21  1.23  12:15 2023-08-31
#>  8     8 8 Yr     4.15  1.18  12:15 2023-08-31
#>  9     9 9 Yr     4.11  1.14  12:15 2023-08-31
#> 10    10 10 Yr    4.07  1.12  12:15 2023-08-31
#> 11    11 12 Yr    3.99  1.08  12:15 2023-08-31
#> 12    12 15 Yr    3.88  1.05  12:15 2023-08-31

创建于 2023-08-31,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.