2017-09-07 4 views
2

처음에는 잠시 시간을내어 SO 커뮤니티에 감사 드리고 싶습니다. 과거에도 계정을 만들 필요없이 여러 번 나에게 도움을주었습니다.R - 양식 웹 긁어 모으기

내 현재 문제는 R을 사용하여 웹 스크래핑과 관련됩니다. 내 장점이 아닙니다.

나는 시도 것을 http://www.cbs.dtu.dk/services/SignalP/

스크랩 싶습니다 :

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 " 

을 내가 처리되지 않은 매개 변수는 무엇인지 확실입니다. 제출 버튼에 문제가 있습니까? 나는 강제로 할 수 없습니다 :

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

은 submit $ name이 NULL 인 문제입니까? Submit form with no submit button in rvest

행운과 :

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

는 여기 제안 가짜가 제출 '버튼을 정의했습니다.

내가 또는 RCurl/HTTR을, 내가 RSelenium

답변

1

음을 사용하지 싶습니다 rvest 사용하여 솔루션을 열어주는 말들,이 행할 수있다. 그러나 팔꿈치 기름이 필요할 것입니다.

이 부분 :

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 

은 당신이 만든 요청합니다. 나는 verbose()을 남겨 두어 어떤 일이 일어날 지 지켜 볼 수 있습니다. "파일 이름"필드가 누락되었지만 문자열을 지정 했으므로 수행 한 작업을 잘 모방합니다.

이제 까다로운 부분은 쿼리가 완료되었을 때 알림 전자 메일 주소를 입력 할 수있는 중간 리디렉션 페이지를 사용한다는 것입니다. 쿼리가 끝났는지 확인하기 위해 정기적 인 (매 10 초마다) 검사를 수행하고, 그렇다면 빠르게 리디렉션합니다.

이 페이지를 통해 추출 할 수 쿼리 ID를 가지고 : 이제

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

을, 우리는 마지막 요청을 모방 할 수 있지만, 나는 완료 보고서를 확인하기 위해 그렇게하기 전에 Sys.sleep(20)에 추가 할 것입니다. 최종 결과 페이지를 잡고

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

:

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

enter image description here

당신은 GET 만 HTML 내용을 검색하기 때문에 이미지가 누락 볼 수 있습니다. rvest/xml2의 기능을 사용하여 페이지를 구문 분석하고 새 콘텐츠를 얻는 데 사용할 수있는 표와 URL을 긁어 낼 수 있습니다.

이 모든 것을 수행하기 위해 브라우저 세션을 가로 채기 위해 burpsuite을 사용하고 결과를 검사하기 위해 내 burrp R 패키지를 사용했습니다. 또한 burpsuite를 시각적으로 검사하고 더 수동으로 빌드 할 수 있습니다.

+0

감사합니다. hrbrmstr! 나는 당신의 대답이 내 근근이 시도에 도움이되었다고 덧붙이고 싶습니다. 모두 제일 좋다! – missuse

+0

webform으로 파일을 업로드하는 방법을 설명해주십시오. 게시 요청의 본문에'SEQSUB' = httr :: upload_file ("temp_1.txt")을 시도했습니다. 그러나 오류가 나타납니다. enc2utf8 (as.character (url)) 오류 : 인수가 문자 벡터가 아닙니다. 여기에 파일이 있습니다 : https://www.dropbox.com/s/kzdi7za3mcbyw7t/temp_1.txt?dl=0 – missuse

+0

위의 문제가 해결되었습니다 : encode = "multipart"로 충분했습니다. – missuse

관련 문제