我想从 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)}
非常感谢任何帮助!
表格内容不包含在页面源中,而是由浏览器中运行的 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)
SEK 和 NOK 的结果:
#> $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