网络抓取 table 使用 rvest returns empty table 获取里面的 hrefs

web scraping table to get hrefs inside it using rvest returns empty table

我正在尝试使用 rvest 获取 table 中的所有 href。到目前为止我做了什么:

library(rvest)
library(stringr)
library(tidyverse)


url <- "https://br.advfn.com/bolsa-de-valores/bovespa/suzano-on-SUZB3/opcoes"

html1 <- read_html(url)

tbls2 <- html1 %>%
               html_nodes("#options-table") %>%
               html_table(fill = TRUE) %>%
               .[[1]]

它 returns tbls2 为:

[1] Ativo              Tipo               Preço de Exercício Variação (%)      
[5] Volume             Vencimento         Modelo            
<0 rows> (or 0-length row.names)

hrefs 应该在列 Ativo 的每个元素中。为什么这会返回一个空的 table?

如果您查看页面源代码并导航到 ID 为 'options-table' 的 table,您会看到 table 正文是空的。这是因为 table 是使用来自外部数据源的 javascript 填充的。

如果我们转到 chrome 开发人员工具 -> 网络并按 'XHR' 过滤,我们可以看到页面发出的 api 请求。在这种情况下,我们想要哪一个就很清楚了:

发现数据的来源后,我们可以直接用 jsonlite:

读取它
library(jsonlite)
url <- 'https://br.advfn.com/common/bov-options/api?symbol=SUZB3&_=1576171286512'
jsn <- fromJSON(url)
df1 <- jsn$result 

dplyr::glimpse(df1)

# Observations: 100
# Variables: 10
# $ symbol            <chr> "SUZBL400", "SUZBX365", "SUZBX283", "SUZBX288", "SUZBX300", "SUZBL386", "SUZBX298",…
# $ type              <chr> "Call", "Put", "Put", "Put", "Put", "Call", "Put", "Put", "Put", "Put", "Put", "Put…
# $ style             <chr> "A", "E", "E", "E", "E", "A", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "A"…
# $ strike_price      <chr> "40,06", "36,56", "28,31", "28,81", "30,06", "38,56", "29,81", "30,56", "31,06", "3…
# $ expiry_date       <chr> "16/12/2019", "16/12/2019", "16/12/2019", "16/12/2019", "16/12/2019", "16/12/2019",…
# $ volume            <chr> "5000", "2000", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "0", ""…
# $ volume_form       <chr> "5.000", "2.000", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", …
# $ change_percentage <chr> "76,47%", "-16,67%", "0,0%", "0,0%", "0,0%", "0,0%", "0,0%", "0,0%", "0,0%", "0,0%"…
# $ url               <chr> "/p.php?pid=quote&symbol=BOV%5ESUZBL400", "/p.php?pid=quote&symbol=BOV%5ESUZBX365",…
# $ class             <chr> "up", "dn", "nc", "nc", "nc", "nc", "nc", "nc", "nc", "nc", "nc", "nc", "nc", "nc",…