用R从javascript中提取数据

  时间:2022-05-11 07:21:52  阅读量:13  评论数:0  作者:PavoDive

感谢您对此感兴趣。

我被赋予[乏味的]任务,看看一些药物的原产地是什么,因为它们在哥伦比亚食品和药物管理局注册。该机构使用一个带有javascript(.jsp扩展名)的网站,我想知道是否有可能自动化这个过程。 这是一步一步的查找:

    进入代理网站:代理咨询站点 在左侧滴液器中选择“Medicamentos” 在“expendiente”(顶部最严格的框)下写出我们正在寻找的数字(我必须检查的900中的两个是:2203和3519)。单选按钮选择无关紧要。 点击搜索按钮(“Buscar”) 单击下表中的链接 理想情况下,获取以FABRICANTE(制造商)开头的表行,但是能够保存文档就足够了(我计划稍后使用R获取/清理/分析数据)。 按下清洁按钮(“Nueva Consulta”) 从步骤3到步骤7从头开始。

我不知道这是否可以实现,如果可以,如何实现;因此,我会很感激任何指导,让我开始在任何方向(除了我现在手头的一个:看他们手!)。我熟悉R和一些VB,但如果在其他语言中有可能,我会试一试。

我尝试的内容:

我试图找到任何与从javascript中提取数据相关的信息,但我找到的大多数信息都与使用javascript将数据从不同类型的数据库传递到HTML/XML有关;或者只从一个响应中提取数据(这不是我想自动化的部分,因为一旦我在响应中,只看值[起源县]就很容易了。“咨询”部分是最难的!)。我觉得自己偏离了轨道,以至于我不知道如何充分搜索。非常感谢指导/想法/开场白 我用inspector(firefox)打开了该机构的站点,但在发现变量“expediente”是获取“expediente”值的变量后停止了(不太有用!)。我不知道是否可能(以及如何)在页面上迭代以更改该变量的值。

谢谢!

网友解决方案:

我在RSelenium包中使用了phantomjs。有关如何设置phantomjs的详细信息,请参阅http://cran.r-project.org/web/packages/rselenium/vignettes/rselenium-saucelabs.html#id2a phantomjs可以直接驱动,而不需要Selenium服务器。由于它的无头特性,对于您概述的任务来说,它应该更快。

您的问题的第一部分可以通过以下方式实现:

appURL <- "http://web.sivicos.gov.co:8080/consultas/consultas/consreg_encabcum.jsp"
library(RSelenium)
pJS <- phantom()
remDr <- remoteDriver(browserName = "phantom")
remDr$open()
remDr$navigate(appURL)
# Get the third list item of the select box (MEDICAMENTOS)
webElem <- remDr$findElement("css", "select[name='grupo'] option:nth-child(3)")
webElem$clickElement() # select this element
# Send text to input value="" name="expediente
webElem <- remDr$findElement("css", "input[name='expediente']")
webElem$sendKeysToElement(list(2203))
# Click the Buscar button
remDr$findElement("id", "INPUT2")$clickElement()

现在表单已经填写完毕,并单击了链接。数据位于name=“datos”的iframe中。 Iframes需要切换到:

# switch to datos iframe
remDr$switchToFrame(remDr$findElement("css", "iframe[name='datos']"))
remDr$findElement("css", "a")$clickElement() # click the link given in the iframe

# get the resulting data

appData <- remDr$getPageSource()[[1]]
# close phantom js
pJS$stop()

iframe的数据现在包含在AppData中。作为一个示例,我们使用简单的提取函数readHtmlTable:

查看第三个表
readHTMLTable(appData, which = 3)
V1     V2      V3              V4       V5                      V6
1 Presentacion Comercial   <NA>    <NA>            <NA>     <NA>                    <NA>
  2             Expediente Consec Termino Unidad / Medida Cantidad             Descripcion
3              000002203     01    0176              ml    60,00  FRASCO AMBAR POR 60 ML
4              000002203     02    0176              ml   120,00 FRASCO AMBAR POR 120 ML
5              000002203     03    0176              ml    90,00  FRASCO AMBAR POR 90 ML
V7     V8            V9
1       <NA>   <NA>          <NA>
  2 Fecha insc Estado Fecha Inactiv
3 2007/01/30 Activo              
4 2007/01/30 Activo              
5 2012/03/15 Activo 

原文地址(source):原文链接