如果你不想使用 selenium,你可以进行这样的测试:
library(rvest)
library(httr)
library(stringr)
URL <- "https://www.ccbolsa.cl/apps/script/detalleaccion/Transaccion.asp?Nemo=AFPCAPITAL&Menu=H"
获取初始网址:
res <- html_session(URL, timeout(30))
它嵌入了一个表单,它使用javascript提交来获取表单:
inputs <- html_nodes(res, "input")
它使用最后一个 javascript 条目在页面加载时进行重定向,因此我们需要它的位置:
scripts <- html_nodes(res, "script")
action <- html_text(scripts[[length(scripts)]])
这是要提交到的新 URL:
base_url <- "https://www.ccbolsa.cl/apps/script/detalleaccion"
loc <- str_match(action, '\\.action *= *"(.*)"')[,2]
doc_url <- sprintf("%s/%s", base_url, loc)
收集所有查询参数:
query <- lapply(inputs, xml_attr, "value")
names(query) <- sapply(inputs, xml_attr, "name")
现在我们必须使用编码为“表单”的查询创建一个新的POST 请求,并使用并提供重定向 URL(我需要超时)。这会将“xls”内容写入文件:
ret <- POST(doc_url,
body=query,
encode="form",
add_headers(Referer=URL),
write_disk("fil.xls", overwrite=TRUE),
timeout(30))
它说这是一个 XLS 文件:
ret$headers$`content-type`
## [1] "application/vnd.ms-excel"
但它实际上是一个 HTML 表格,所以你真的可以这样做:
ret <- POST(doc_url,
body=query,
encode="form",
add_headers(Referer=URL),
timeout(30))
doc <- read_html(content(ret, as="text"))
dat <- html_table(html_nodes(doc, "table"), fill=TRUE)
获取您要查找的内容(dat 列表中有两个丑陋的表,您可能希望使用header=TRUE 作为html_table 的附加参数)。
我不确定这个解决方案有多“动态”,但它是可测试/可验证的。