用R从javascript中提取数据

时间:2014-12-04 23:02:01

标签: javascript html r jsp web-scraping

感谢您对此感兴趣。

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

  1. 访问代理商网站:Agency's consult site
  2. 在左侧的下拉列表中选择“Medicamentos”
  3. 在“expeiente”(最上面的最后一个方框)下面写下我们正在寻找的号码(我必须检查的900+中的两个是:2203和3519)。单选按钮选择无关紧要。
  4. 点击搜索按钮(“buscar”)
  5. 点击下表中显示的链接
  6. 理想情况下,获取以FABRICANTE(制造商)开头的表格行,但能够保存文档就足够了(我计划稍后使用R来获取/清理/分析数据)。
  7. 点击清洁按钮(“nueva consulta”)
  8. 从第3步到第7步开始。
  9. 我不知道这是否可以实现,如果可以的话,我怎么做;所以我很感激任何允许我从任何方向开始的指导(除了我现在手头的那个:用手看它们!)。我熟悉R和一些VB,但如果它可以用任何其他语言,我会试一试。

    我尝试了什么:

    • 我试图找到与从javascript中提取数据相关的任何信息,但我发现的大部分内容都与使用javascript将数据从不同类型的数据库传递到html / xml有关;或者仅从一个响应中提取数据(这不是我想要自动化的部分,因为一旦我在响应时,只需查看值[原点县]就很容易。“咨询”部分是最难的!)。我觉得如此偏离轨道,我觉得我对如何充分搜索毫无头绪。非常感谢指导/创意/初学者
    • 我已经用检查员(firefox)打开了该机构的网站,但是在发现变量“expediente”是获得“expediente”的值(不是非常有用!)之后就停止了。我不知道是否有可能(以及如何)在页面上迭代以更改该变量的值。

    谢谢!

1 个答案:

答案 0 :(得分:4)

我已将phantomjsRSelenium包一起使用。有关如何设置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