Extraction de données de javascript avec R

Merci d'être intéressé par cela.

On m'a donné la tâche [fastidieuse] d'examiner quel est le pays d'origine de certaines médecines, car elles sont enregistrées auprès de l'administration colombienne des aliments et des médicaments. L'agence utilise un site Web avec un javascript (extension .jsp) et j'aimerais savoir s'il est possible d'automatiser le processus. C'est l'étape par étape de la recherche:

  1. Accéder au site internet de l' agence : site de consultation de l'agence
  2. Sélectionnez "Medicamentos" dans le goutte à gauche
  3. Sous "expendiente" (coffre rigide dans le haut), écrivez le numéro que nous recherchons (deux des 900 + que je dois vérifier sont: 2203 et 3519). La sélection des boutons radio est indifférente.
  4. Appuyez sur le bouton de recherche ("chercher")
  5. Cliquez sur le lien présenté dans le tableau ci-dessous
  6. Idéalement, obtenez la ligne de table qui commence avec FABRICANTE (fabricant), mais être en mesure de sauvegarder le document serait suffisant (j'ai l'intention d'obtenir / nettoyer / analyser les données à l'aide de R plus tard).
  7. Appuyez sur le bouton propre ("nueva consulta")
  8. Commencez tout de suite à partir des étapes 3 à 7.

Je n'ai pas la moindre idée si cela pourrait être accompli, et si oui, comment; Donc j'apprécierais toute orientation qui me permette de commencer dans n'importe quelle direction (autre que celle que j'ai à portée de main maintenant: les regarder à la main!). Je connais R et certains VB, mais si cela est possible dans n'importe quelle autre langue, je vais essayer.

Ce que j'ai essayé:

  • J'ai essayé de trouver des informations liées à l'extraction de données de javascript, mais la plupart de ce que j'ai trouvé est liée à l'utilisation de javascript pour transmettre des données de différentes sortes de bases de données en html / xml; Ou en extrayant les données d'une seule réponse (ce n'est pas la partie que je veux automatiser, car une fois que je suis à la réponse, il serait facile de regarder la valeur [pays d'origine]. La partie "consulter" est la Plus dur!). Je me suis senti tellement hors piste que je pense que je n'ai pas la moindre idée de la façon de rechercher de manière adéquate. Les conseils / idées / débutants sont très appréciés
  • J'ai ouvert le site de l'agence avec l'inspecteur (firefox), mais j'ai stoppé juste après avoir constaté que la variable "expediente" est celle qui obtient la valeur pour "expediente" (pas très utile!). Je ne sais pas si possible (et comment) iterate sur la page pour changer la valeur de cette variable.

Merci!

J'ai utilisé des phantomjs avec le paquet RSelenium . Vous trouverez des détails sur la configuration des phantomjs à http://cran.r-project.org/web/packages/RSelenium/vignettes/RSelenium-saucelabs.html#id2a Les phantomjs peuvent être directement phantomjs sans avoir besoin de détails sur le serveur Selenium Ici . Il devrait être beaucoup plus rapide pour la tâche que vous décrivez en raison de sa nature sans tête.

La première partie de votre question peut être réalisée comme suit:

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

Maintenant, le formulaire a été rempli et le lien a cliqué. Les données se trouvent dans un iframe avec name="datos" . Les iframes doivent être basés sur:

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

Les données de l'iframe sont maintenant contenues dans appData . Par exemple, nous examinons le troisième tableau en utilisant la fonction d'extraction simple 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