从 B3 iFrame 抓取网页
Web Scraping from B3 iFrame
我正在尝试从 BM&FBOVESPA 参考汇率页面下载一些数据。里面有个iframe,如下:
这是我的代码,它返回一个只有 NA
:
的 DF
library(rvest)
library(stringr)
html_url <- "https://www2.bmf.com.br/pages/portal/bmfbovespa/lumis/lum-sistema-pregao-ptBR.asp?Data=23/09/2021&Mercadoria=DI1"
html <- read_html(html_url)
data <- html %>%
html_nodes("td") %>%
html_text() %>%
str_replace(",", ".") %>%
as.numeric()
如何从此页面下载数据?
table 由浏览器中的 JavaScript 运行 动态生成。
查看页面源代码,可以充分了解编写正则表达式以仅提取定义感兴趣的 table html 的相关字符串的想法。您可以将提取的每个 table 的正则表达式匹配连接成一个字符串,每个 table,用 html 解析器解析,然后 select table .
这 2 tables 需要颠倒过来,从它们在页面源中出现的顺序来看,以匹配您在页面上看到的内容,并将列绑定在一起以创建单个 DataFrame。
网页可见的第一列需要单独拉进来,不依赖html_table()
,加到DataFrame的最前面。可能的重构可能会通过使用 css select 或)
将此步骤合并到现有函数中
library(rvest)
library(dplyr)
library(stringr)
get_table <- function(number, r) {
pat <- sprintf("MercFut%i.*'(.*)?'", number)
t <- read_html(paste0(stringr::str_match_all(r, pat)[[1]][, 2], collapse = "")) |>
html_table()
return(tibble(t[[1]]))
}
r <- read_html("https://www2.bmf.com.br/pages/portal/bmfbovespa/lumis/lum-sistema-pregao-ptBR.asp?Data=23/09/2021&Mercadoria=DI1") |>
html_text()
tables <- lapply(c(2, 1), get_table, r)
df <- cbind(tables[[1]], tables[[2]])
first_col <- stringr::str_match_all(r, sprintf("MercFut%i.*'(.*)?'", 3))[[1]][, 2] |>
paste0(collapse = "") |>
read_html() |>
html_elements("th, td") |>
html_text()
df <- tibble::add_column(df, !!(first_col[1]) := first_col[-c(1)]) |>
select(first_col[1], everything())
对于旧的 R 版本,将 |>
替换为 %>%
。
我正在尝试从 BM&FBOVESPA 参考汇率页面下载一些数据。里面有个iframe,如下:
这是我的代码,它返回一个只有 NA
:
library(rvest)
library(stringr)
html_url <- "https://www2.bmf.com.br/pages/portal/bmfbovespa/lumis/lum-sistema-pregao-ptBR.asp?Data=23/09/2021&Mercadoria=DI1"
html <- read_html(html_url)
data <- html %>%
html_nodes("td") %>%
html_text() %>%
str_replace(",", ".") %>%
as.numeric()
如何从此页面下载数据?
table 由浏览器中的 JavaScript 运行 动态生成。
查看页面源代码,可以充分了解编写正则表达式以仅提取定义感兴趣的 table html 的相关字符串的想法。您可以将提取的每个 table 的正则表达式匹配连接成一个字符串,每个 table,用 html 解析器解析,然后 select table .
这 2 tables 需要颠倒过来,从它们在页面源中出现的顺序来看,以匹配您在页面上看到的内容,并将列绑定在一起以创建单个 DataFrame。
网页可见的第一列需要单独拉进来,不依赖html_table()
,加到DataFrame的最前面。可能的重构可能会通过使用 css select 或)
library(rvest)
library(dplyr)
library(stringr)
get_table <- function(number, r) {
pat <- sprintf("MercFut%i.*'(.*)?'", number)
t <- read_html(paste0(stringr::str_match_all(r, pat)[[1]][, 2], collapse = "")) |>
html_table()
return(tibble(t[[1]]))
}
r <- read_html("https://www2.bmf.com.br/pages/portal/bmfbovespa/lumis/lum-sistema-pregao-ptBR.asp?Data=23/09/2021&Mercadoria=DI1") |>
html_text()
tables <- lapply(c(2, 1), get_table, r)
df <- cbind(tables[[1]], tables[[2]])
first_col <- stringr::str_match_all(r, sprintf("MercFut%i.*'(.*)?'", 3))[[1]][, 2] |>
paste0(collapse = "") |>
read_html() |>
html_elements("th, td") |>
html_text()
df <- tibble::add_column(df, !!(first_col[1]) := first_col[-c(1)]) |>
select(first_col[1], everything())
对于旧的 R 版本,将 |>
替换为 %>%
。