感谢您对此感兴趣。
我被赋予[乏味的]任务,看看一些药物的原产地是什么,因为它们在哥伦比亚食品和药物管理局注册。该机构使用一个带有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