我非常希望“专家”停止使用“您需要 Selenium/Headless Chrome”,因为它几乎永远不会是真的,并且会在数据科学工作流程中引入不必要的重量级第三方依赖。 p>
该站点是一个 ASP.NET 站点,因此它大量使用会话,并且该特定会话背后的程序员强制该会话在家中启动(“您好,2000 调用并希望他们的会话状态保留模型回来。”)
无论如何,我们需要从那里开始并进入您的页面。在您的浏览器中是这样的:
我们还可以从 ?? 看到该网站返回了可爱的 JSON,所以我们最终会抓住它。让我们开始为 R httr 工作流建模,就像上面的会话:
library(xml2)
library(httr)
library(rvest)
从那个开始,嗯,开始!
httr::GET(
url = "https://si3.bcentral.cl/Siete/secure/cuadros/home.aspx",
httr::verbose()
) -> res
现在,我们需要从该页面获取 HTML,因为我们需要向 POST 提供许多隐藏值,因为这是大脑死机的 ASP.NET 工作流工作方式的一部分(同样,按照上图中的要求):
pg <- httr::content(res)
hinput <- html_nodes(pg, "input")
hinput <- as.list(setNames(html_attr(hinput, "value"), html_attr(hinput, "name")))
hinput$`header$txtBoxBuscador` <- ""
hinput$`__EVENTARGUMENT` <- ""
hinput$`__EVENTTARGET` <- "lnkBut01"
httr::POST(
url = "https://si3.bcentral.cl/Siete/secure/cuadros/home.aspx",
httr::add_headers(
`Referer` = "https://si3.bcentral.cl/Siete/secure/cuadros/home.aspx"
),
encode = "form",
body = hinput
) -> res
现在我们已经完成了让网站认为我们有一个适当的会话所需的操作,所以让我们发出对 JSON 内容的请求:
httr::GET(
url = "https://si3.bcentral.cl/siete/secure/cuadros/actions.aspx",
httr::add_headers(
`X-Requested-With` = "XMLHttpRequest"
),
query = list(
Opcion = "1",
idMenu = "IPC_VAR_MEN1_HIST",
codCuadro = "IPC_VAR_MEN1_HIST",
DrDwnAnioDesde = "",
DrDwnAnioHasta = "",
DrDwnAnioDiario = "",
DropDownListFrequency = "",
DrDwnCalculo = "NONE"
)
) -> res
然后,繁荣:
str(
httr::content(res), 1
)
## List of 32
## $ CodigoCuadro : chr "IPC_VAR_MEN1_HIST"
## $ Language : chr "es-CL"
## $ DescripcionCuadro : chr "IPC, IPCX, IPCX1 e IPC SAE, variación mensual, información histórica"
## $ AnioDesde : int 1928
## $ AnioHasta : int 2018
## $ FechaInicio : chr "01-01-2010"
## $ FechaFin : chr "01-11-2018"
## $ ListaFrecuencia :List of 1
## $ FrecuenciaDefecto : NULL
## $ DrDwnAnioDesde :List of 3
## $ DrDwnAnioHasta :List of 3
## $ DrDwnAnioDiario :List of 3
## $ hsDecimales :List of 1
## $ ListaCalculo :List of 1
## $ Metadatos : chr " <img runat=\"server\" ID=\"imgButMetaDatos\" alt=\"Ver metadatos\" src=\"../../Images/lens.gif\" OnClick=\"jav"| __truncated__
## $ NotasPrincipales : chr ""
## $ StatusTextBox : chr ""
## $ Grid :List of 4
## $ GridColumnNames :List of 113
## $ Paginador : int 15
## $ allowEmptyColumns : logi FALSE
## $ FechaInicioSelected: chr "2010"
## $ FechaFinSelected : chr "2018"
## $ FrecuenciaSelected : chr "MONTHLY"
## $ CalculoSelected : chr "NONE"
## $ AnioDiarioSelected : chr "2010"
## $ UrlFechaBase : chr "Indizar_fechaBase.aspx?codCuadro=IPC_VAR_MEN1_HIST"
## $ FechaBaseCuadro : chr "Ene 2010"
## $ IsBoletin : logi FALSE
## $ CheckSelected :List of 4
## $ lnkButFechaBase : logi FALSE
## $ ShowFechaBase : logi FALSE
在 JSON 中挖掘您需要的数据。我认为它在Grid… 元素中。