2017-09-07 1 views
2

D'abord je voudrais prendre un moment et remercier la communauté SO, Vous m'avez aidé à plusieurs reprises dans le passé sans que je doive même créer un compte.R - forme web grattage avec rvest

Mon problème actuel concerne le grattage de la bande avec R. Ce n'est pas mon point fort.

Je voudrais à la ferraille http://www.cbs.dtu.dk/services/SignalP/

ce que j'ai essayé:

library(rvest) 
    url <- "http://www.cbs.dtu.dk/services/SignalP/" 
    seq <- "MTSKTCLVFFFSSLILTNFALAQDRAPHGLAYETPVAFSPSAFDFFHTQPENPDPTFNPCSESGCSPLPVAAKVQGASAKAQESDIVSISTGTRSGIEEHGVVGIIFGLAFAVMM" 

    session <- rvest::html_session(url) 
    form <- rvest::html_form(session)[[2]] 
    form <- rvest::set_values(form, `SEQPASTE` = seq) 
    form_res_cbs <- rvest::submit_form(session, form) 
    #rvest prints out: 
    Submitting with 'trunc' 

rvest::html_text(rvest::html_nodes(form_res_cbs, "head")) 
#ouput: 
"Configuration error" 

rvest::html_text(rvest::html_nodes(form_res_cbs, "body")) 

#ouput: 
"Exception:WebfaceConfigErrorPackage:Webface::service : 358Message:Unhandled #parameter 'NULL' in form " 

Je ne suis pas sûr ce qui est le paramètre non prise en charge. Le problème est-il dans le bouton Envoyer? Je ne peux pas sembler forcer:

form_res_cbs <- rvest::submit_form(session, form, submit = "submit") 
#rvest prints out 
Error: Unknown submission name 'submit'. 
Possible values: trunc 

est le problème que le nom $ soumission est NULL?

form[["fields"]][[23]] 

J'ai essayé de définir le faux bouton submit comme suggéré ici: Submit form with no submit button in rvest

sans chance.

Je suis ouvert à des solutions utilisant rvest ou Rbordage/HTTR, je voudrais éviter d'utiliser RSelenium

Répondre

1

Eh bien, cela est faisable. Mais ça va nécessiter de la graisse de coude.

Cette partie:

library(rvest) 
library(httr) 
library(tidyverse) 

POST(
    url = "http://www.cbs.dtu.dk/cgi-bin/webface2.fcgi", 
    encode = "form", 
    body=list(
    `configfile` = "/usr/opt/www/pub/CBS/services/SignalP-4.1/SignalP.cf", 
    `SEQPASTE` = "MTSKTCLVFFFSSLILTNFALAQDRAPHGLAYETPVAFSPSAFDFFHTQPENPDPTFNPCSESGCSPLPVAAKVQGASAKAQESDIVSISTGTRSGIEEHGVVGIIFGLAFAVMM", 
    `orgtype` = "euk", 
    `Dcut-type` = "default", 
    `Dcut-noTM` = "0.45", 
    `Dcut-TM` = "0.50", 
    `graphmode` = "png", 
    `format` = "summary", 
    `minlen` = "", 
    `method` = "best", 
    `trunc` = "" 
), 
    verbose() 
) -> res 

fait la demande que vous avez fait. J'ai laissé verbose() pour que vous puissiez regarder ce qui se passe. Il manque le champ "filename", mais vous avez spécifié la chaîne, donc c'est un bon mimique de ce que vous avez fait. Maintenant, la partie délicate est qu'il utilise une page de redirection intermédiaire qui vous donne une chance d'entrer une adresse e-mail pour la notification lorsque la requête est terminée. Il effectue une vérification régulière (toutes les 10 secondes environ) pour voir si la requête est terminée et redirigera rapidement si c'est le cas.

Cette page contient l'identifiant de requête qui peut être extrait via:

content(res, as="parsed") %>% 
    html_nodes("input[name='jobid']") %>% 
    html_attr("value") -> jobid 

Maintenant, nous pouvons imiter la demande finale, mais j'ajouter dans un Sys.sleep(20) avant de le faire pour assurer le rapport est fait.

GET(
    url = "http://www.cbs.dtu.dk/cgi-bin/webface2.fcgi", 
    query = list(
    jobid = jobid, 
    wait = "20" 
), 
    verbose() 
) -> res2 

qui saisit la page de résultats final:

html_print(HTML(content(res2, as="text"))) 

enter image description here

Vous pouvez voir des images sont manquantes parce que GET récupère uniquement le contenu HTML. Vous pouvez utiliser les fonctions rvest/xml2 pour analyser la page et extraire les tables et les URL que vous pouvez ensuite utiliser pour obtenir un nouveau contenu. Pour faire tout cela, j'ai utilisé burpsuite pour intercepter une session de navigateur, puis mon paquet burrp R pour inspecter les résultats. Vous pouvez également inspecter visuellement dans Burpsuite et construire des choses plus manuellement.

+0

Je vous remercie hrbrmstr! Je veux juste ajouter que vos réponses m'ont déjà aidé dans mes tentatives de raclage. Bonne chance! – missuse

+0

Pourriez-vous expliquer comment procéder pour télécharger un fichier sur le formulaire Web? J'ai essayé 'SEQSUB' = httr :: upload_file (" temp_1.txt "), dans le corps de la demande de publication. Cependant, je reçois l'erreur: Erreur dans enc2utf8 (as.character (url)): l'argument n'est pas un vecteur de caractère. Voici le fichier: https://www.dropbox.com/s/kzdi7za3mcbyw7t/temp_1.txt?dl=0 – missuse

+0

a résolu le problème ci-dessus: encoder = "multipart" était suffisant – missuse