如何使用R语言爬取B3交易所iFrame页面的参考利率数据
问题原因
你运行代码返回全为NA主要有三个核心原因:
- 直接提取页面所有
<td>节点,其中混杂了大量非数字内容(如合约到期月份、合约代码等文本字段),强制转为数值型时非数字内容会被直接转为NA - 未定位到目标数据表格,抓取的
<td>包含了页面顶部筛选栏等冗余区域的内容 - 提取的文本存在首尾空白字符,未做清理直接进行类型转换也会导致转换失败
修正后的实现代码
library(rvest) library(stringr) library(dplyr) html_url <- "https://www2.bmf.com.br/pages/portal/bmfbovespa/lumis/lum-sistema-pregao-ptBR.asp?Data=23/09/2021&Mercadoria=DI1" # 读取页面时指定latin1编码,避免葡萄牙语特殊字符乱码 html <- read_html(html_url, encoding = "latin1") # 直接提取页面所有表格,指定逗号为小数点标识,自动填充不规整单元格 all_tables <- html %>% html_table(fill = TRUE, dec = ",") # 页面第二个表格为DI1合约的交易数据主表,第一个为顶部筛选条件表 di1_data <- all_tables[[2]] # 可选:数据清洗步骤 # 1. 清理列名首尾空白 colnames(di1_data) <- str_squish(colnames(di1_data)) # 2. 按需对指定数值列做格式转换,跳过合约代码、到期日等文本列 numeric_col_list <- c("Abertura", "Máxima", "Mínima", "Variação", "Preço de Ajuste") di1_data <- di1_data %>% mutate(across(all_of(numeric_col_list), ~ as.numeric(str_replace(.x, ",", "."))))
补充说明
如果需要批量爬取不同日期、不同品种的数据,只需要修改url中Data和Mercadoria的参数值即可,注意日期格式为日/月/年。
内容的提问来源于stack exchange,提问作者Alexandre Sanches
相关产品推荐
相关产品推荐

