首页 文章

用R [j]从javascript中提取数据

提问于
浏览 876
2

感谢您对此感兴趣 .

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

  • 访问代理商网站:Agency's consult site

  • 在左侧的下拉列表中选择"Medicamentos"

  • 在"expendiente"(顶部最严格的方框)中写下我们要查找的号码(我要检查的900中的两个是:2203和3519) . 单选按钮选择无关紧要 .

  • 点击搜索按钮("buscar")

  • 单击下表中显示的链接

  • 理想情况下,获取以FABRICANTE(制造商)开头的表格行,但是能够保存文档就足够了(我计划稍后使用R来获取/清理/分析数据) .

  • 点击清洁按钮("nueva consulta")

  • 从步骤3到7全程开始 .

我不知道这是否可以实现,如果可以的话,我怎么做;所以我很感激任何允许我从任何方向开始的指导(除了我现在手头的那个:用手看它们!) . 我熟悉R和一些VB,但如果它可以用任何其他语言,我会试一试 .

我尝试过的:

  • 我试图找到任何与从javascript中提取数据相关的信息,但是大部分内容都不是我要自动化的部分,因为一旦我感到如此偏离轨道,我认为我对如何无能为力充分搜索 . 非常感谢指导/创意/初学者

  • 我've opened the agency'的站点与检查器(firefox),但在发现变量"expediente"是获取"expediente"的值之后停止了(不是非常有用!) . 我不知道是否可能(以及如何)在页面上迭代以更改该变量的值 .

谢谢!

1 回答

  • 4

    我在 RSelenium 包中使用了 phantomjs . 有关如何设置 phantomjs 的详细信息可以在http://cran.r-project.org/web/packages/RSelenium/vignettes/RSelenium-saucelabs.html#id2a phantomjs 找到,可以直接驱动而无需Selenium Server详细信息here . 由于其无头的性质,你所概述的任务应该更快 .

    问题的第一部分可以实现如下:

    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中 . iframe需要切换到:

    # 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
    

相关问题