一尘不染

使用R从javascript提取数据

jsp

感谢您对此感兴趣。

繁琐的任务使我了解了一些药物的来源国,因为这些药物已在哥伦比亚食品药品监督管理局注册。该机构使用的网站带有javascript(扩展名为.jsp),我想知道是否可以自动执行该过程。这是查找的逐步步骤:

  1. 转到代理商的网站:代理商的咨询网站
  2. 在左侧的下拉列表中选择“ Medicamentos”
  3. 在“ expendiente”(最上方的方框)下,写下我们要查找的数字(我必须检查的900多个数字中的两个是:2203和3519)。单选按钮的选择无关紧要。
  4. 点击搜索按钮(“公交车”)
  5. 点击下表中显示的链接
  6. 理想情况下,获得以FABRICANTE(制造商)开头的表格行,但是能够保存文档就足够了(我稍后计划使用R获取/清理/分析数据)。
  7. 点击清洁按钮(“ nueva Consulta”)
  8. 从步骤3到7重新开始。

我完全不知道这是否可以实现,如果可以的话,如何实现。因此,不胜感激任何可以使我从任何方向开始的指南(除了我现在手头的指南:用手看它们!)。我熟悉R和一些VB,但是如果可以使用其他任何语言,我会尝试一下。

我尝试过的

  • 我试图找到与从javascript提取数据有关的任何信息,但是我发现的大多数信息都与使用javascript将数据从不同种类的数据库传递到html / xml有关。或仅从一个响应中提取数据(这不是我要自动化的部分,因为一旦我进入响应中,仅查看值[原产地]就会很容易。“咨询”部分是最难!)。我感觉偏离了轨道,以至于我对如何进行充分的搜索一无所知。指导/想法/初学者很受赞赏
  • 我已经与检查员(firefox)一起打开了代理商的网站,但是在发现变量“ expediente”是获取“ expediente”值的变量后就停了下来(不是很有用!)。我不知道是否可能(以及如何)在页面上进行迭代以更改该变量的值。

谢谢!


阅读 345

收藏
2020-06-08

共1个答案

一尘不染

我已经使用phantomjsRSelenium包装。有关如何设置的详细信息,请phantomjs参见http://cran.r-project.org/web/packages/RSelenium/vignettes/RSelenium-
saucelabs.html#id2a
phantomjs,无需此处的Selenium Server详细信息即可直接进行驱动。由于它无头的性质,因此对于您概述的任务应该更快。

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

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()

现在,表格已填写,单击链接。数据位于的iframe中name="datos"。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
2020-06-08