【问题标题】:Extracting data from javascript with R [closed]使用R从javascript中提取数据[关闭]
【发布时间】:2014-12-04 23:02:00
【问题描述】:

感谢您对此感兴趣。

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

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

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

我尝试过的:

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

谢谢!

【问题讨论】:

  • R 的硒包之一是您最好的选择。该网站已竭尽全力防止抓取。
  • @hrbmstr 感谢您的领导。我安装了 RSelenium,到目前为止已经能够打开页面,在框中输入数字并再次清除表单。我想在结果表的一个单元格中获取值,唯一的选择器是body > form:nth-child(1) > table:nth-child(4) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(6),但还没有找到方法。我尝试使用findElement("css selector",uniqueselector)findElements("css selector",uniqueselector),但这些都不是。你能在这里再给我一点智慧吗?谢谢!
  • 当我执行上面解释的代码时,我得到一个空列表。如果我输入list(uniqueselector) 而不是uniqueselector,那么我得到一个java.lang.ClassCastException。当我执行htmlParse(rd$getPageSource()[[1]]) 时,我得到了很多东西,但没有得到表格的内容(这是我感兴趣的)。再次感谢

标签: javascript html r jsp web-scraping


【解决方案1】:

我已将phantomjsRSelenium 包一起使用。有关如何设置phantomjs 的详细信息,请访问http://cran.r-project.org/web/packages/RSelenium/vignettes/RSelenium-saucelabs.html#id2a phantomjs 可以直接驱动,无需 Selenium 服务器详细信息 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 中。 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 

【讨论】:

  • 你让我开心,谢谢!我没有使用phantomjs,而是基于我在RSelenium 上的。最后一部分(更改 iframe)和使用 readHTMLtable 是关键,我正在努力寻找其中一个表格元素!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 2018-02-16
  • 1970-01-01
相关资源
最近更新 更多