HTML表格未显示在源文件中

Dav*_*era 7 html javascript r web-scraping rvest

我正在尝试使用R(包rvest)在网页上刮取表格数据.要做到这一点,数据需要在html源文件中(rvest显然在那里寻找它),但在这种情况下它不是.

但是,数据元素显示在"检查"面板的"元素"视图中:

表格的元素显示在

源文件显示一个空表:

view-source文件显示一个空表

为什么数据显示在inspect元素上而不是源文件上?如何以html格式访问表数据?如果我无法通过HTML访问如何更改我的网络抓取策略?

*网页是 https://si3.bcentral.cl/siete/secure/cuadros/cuadro_dinamico.aspx?idMenu=IPC_VAR_MEN1_HIST&codCuadro=IPC_VAR_MEN1_HIST

源文件: view-source:https://si3.bcentral.cl/siete/secure/cuadros/cuadro_dinamico.aspx?idMenu = IPC_VAR_MEN1_HIST&codCuadro = IPC_VAR_MEN1_HIST


编辑:赞赏使用R的解决方案

hrb*_*str 4

我真心希望“专家”停止说“你需要 Selenium/Headless Chrome”,因为这几乎从来都不是真的,并且在数据科学工作流程中引入了不必要的、重量级的第三方依赖。

\n\n

该站点是一个 ASP.NET 站点,因此它大量使用会话,并且该特定站点背后的程序员强制该会话在家中启动(“您好,2000 打来电话,希望恢复其会话状态保留模型。”

\n\n

无论如何,我们需要从这里开始并进入您的页面。这是您的浏览器中的样子:

\n\n

在此输入图像描述

\n\n

我们还可以看到,该网站返回了可爱的 JSON,所以我们最终会抓住它。让我们开始httr像上面的会话一样建模 R 工作流程:

\n\n
library(xml2)\nlibrary(httr)\nlibrary(rvest)\n
Run Code Online (Sandbox Code Playgroud)\n\n

从,嗯,开始!

\n\n
httr::GET(\n  url = "https://si3.bcentral.cl/Siete/secure/cuadros/home.aspx",\n  httr::verbose()\n) -> res\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,我们需要从该页面获取 HTML,因为我们需要向所创建的页面提供许多隐藏值,POST因为这是脑死亡的 ASP.NET 工作流程工作方式的一部分(再次遵循上图中的请求):

\n\n
pg <- httr::content(res)\n\nhinput <- html_nodes(pg, "input")\nhinput <- as.list(setNames(html_attr(hinput, "value"), html_attr(hinput, "name")))\nhinput$`header$txtBoxBuscador` <- ""\nhinput$`__EVENTARGUMENT` <- ""\nhinput$`__EVENTTARGET` <- "lnkBut01"\n\nhttr::POST(\n  url = "https://si3.bcentral.cl/Siete/secure/cuadros/home.aspx",\n  httr::add_headers(\n    `Referer` = "https://si3.bcentral.cl/Siete/secure/cuadros/home.aspx"\n  ),\n  encode = "form",\n  body = hinput\n) -> res\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我们已经完成了我们需要做的事情,让网站认为我们已经有了一个正确的会话,所以让我们发出对 JSON 内容的请求:

\n\n
httr::GET(\n  url = "https://si3.bcentral.cl/siete/secure/cuadros/actions.aspx",\n  httr::add_headers(\n    `X-Requested-With` = "XMLHttpRequest"\n  ),\n  query = list(\n    Opcion = "1",\n    idMenu = "IPC_VAR_MEN1_HIST",\n    codCuadro = "IPC_VAR_MEN1_HIST",\n    DrDwnAnioDesde = "",\n    DrDwnAnioHasta = "",\n    DrDwnAnioDiario = "",\n    DropDownListFrequency = "",\n    DrDwnCalculo = "NONE"\n  )\n) -> res\n
Run Code Online (Sandbox Code Playgroud)\n\n

而且,繁荣:

\n\n
str(\n  httr::content(res), 1\n)\n\n## List of 32\n##  $ CodigoCuadro       : chr "IPC_VAR_MEN1_HIST"\n##  $ Language           : chr "es-CL"\n##  $ DescripcionCuadro  : chr "IPC, IPCX, IPCX1 e IPC SAE, variaci\xc3\xb3n mensual, informaci\xc3\xb3n hist\xc3\xb3rica"\n##  $ AnioDesde          : int 1928\n##  $ AnioHasta          : int 2018\n##  $ FechaInicio        : chr "01-01-2010"\n##  $ FechaFin           : chr "01-11-2018"\n##  $ ListaFrecuencia    :List of 1\n##  $ FrecuenciaDefecto  : NULL\n##  $ DrDwnAnioDesde     :List of 3\n##  $ DrDwnAnioHasta     :List of 3\n##  $ DrDwnAnioDiario    :List of 3\n##  $ hsDecimales        :List of 1\n##  $ ListaCalculo       :List of 1\n##  $ Metadatos          : chr " <img runat=\\"server\\" ID=\\"imgButMetaDatos\\" alt=\\"Ver metadatos\\" src=\\"../../Images/lens.gif\\" OnClick=\\"jav"| __truncated__\n##  $ NotasPrincipales   : chr ""\n##  $ StatusTextBox      : chr ""\n##  $ Grid               :List of 4\n##  $ GridColumnNames    :List of 113\n##  $ Paginador          : int 15\n##  $ allowEmptyColumns  : logi FALSE\n##  $ FechaInicioSelected: chr "2010"\n##  $ FechaFinSelected   : chr "2018"\n##  $ FrecuenciaSelected : chr "MONTHLY"\n##  $ CalculoSelected    : chr "NONE"\n##  $ AnioDiarioSelected : chr "2010"\n##  $ UrlFechaBase       : chr "Indizar_fechaBase.aspx?codCuadro=IPC_VAR_MEN1_HIST"\n##  $ FechaBaseCuadro    : chr "Ene 2010"\n##  $ IsBoletin          : logi FALSE\n##  $ CheckSelected      :List of 4\n##  $ lnkButFechaBase    : logi FALSE\n##  $ ShowFechaBase      : logi FALSE\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 JSON 中挖掘所需的数据。我认为这是在Grid\xe2\x80\xa6元素中。

\n