Dav*_*era 7 html javascript r web-scraping rvest
我正在尝试使用R(包rvest
)在网页上刮取表格数据.要做到这一点,数据需要在html源文件中(rvest
显然在那里寻找它),但在这种情况下它不是.
但是,数据元素显示在"检查"面板的"元素"视图中:
源文件显示一个空表:
为什么数据显示在inspect元素上而不是源文件上?如何以html格式访问表数据?如果我无法通过HTML访问如何更改我的网络抓取策略?
编辑:赞赏使用R的解决方案
我真心希望“专家”停止说“你需要 Selenium/Headless Chrome”,因为这几乎从来都不是真的,并且在数据科学工作流程中引入了不必要的、重量级的第三方依赖。
\n\n该站点是一个 ASP.NET 站点,因此它大量使用会话,并且该特定站点背后的程序员强制该会话在家中启动(“您好,2000 打来电话,希望恢复其会话状态保留模型。”)
\n\n无论如何,我们需要从这里开始并进入您的页面。这是您的浏览器中的样子:
\n\n\n\n我们还可以看到,该网站返回了可爱的 JSON,所以我们最终会抓住它。让我们开始httr
像上面的会话一样建模 R 工作流程:
library(xml2)\nlibrary(httr)\nlibrary(rvest)\n
Run Code Online (Sandbox Code Playgroud)\n\n从,嗯,开始!
\n\nhttr::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 工作流程工作方式的一部分(再次遵循上图中的请求):
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\nhttr::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\nstr(\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
元素中。