【问题标题】:Web Scraping from B3 iFrame从 B3 iFrame 抓取网页
【发布时间】:2021-09-24 18:58:04
【问题描述】:

我正在尝试从 BM&FBOVESPA 参考费率页面下载一些数据。里面有一个iframe,如下:

https://www2.bmf.com.br/pages/portal/bmfbovespa/lumis/lum-sistema-pregao-ptBR.asp?Data=23/09/2021&Mercadoria=DI1

这是我的代码,它返回一个只有 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()

如何从这个页面下载数据?

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案1】:

    表格是由在浏览器中运行的 JavaScript 动态生成的。

    查看页面源代码,可以得到足够的想法来编写一个正则表达式来仅提取定义感兴趣的表格 html 的相关字符串。您可以将提取的每个表的正则表达式匹配连接成一个字符串,对于每个表,使用 html 解析器进行解析,然后选择该表。

    这 2 个表需要从它们在页面源中出现的顺序颠倒过来,以匹配您在页面上看到的内容,并将列绑定在一起以创建单个 DataFrame。

    网页上可见的第一列需要单独拉入,不依赖html_table(),添加到DataFrame前面。可能的重构可能会通过使用 css 选择器将此步骤合并到现有函数中)

    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 版本,将 |&gt; 替换为 %&gt;%

    【讨论】:

    • 我也需要废弃第一列。你能帮帮我吗?
    • 我已经添加了第一列。抱歉,忘记了!
    猜你喜欢
    • 2017-01-16
    • 2021-01-22
    • 2021-05-19
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    相关资源
    最近更新 更多