代码之家  ›  专栏  ›  技术社区  ›  missuse

使用rvest的R形web刮取

  •  3
  • missuse  · 技术社区  · 7 年前

    首先,我想花点时间感谢SO社区,

    我想报废 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为空是否有问题?

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

    Submit form with no submit button in rvest

    没有运气。

    编辑:多亏了hrbrmstr很棒的回答,我才能够为这个任务构建一个函数。它在ragp包中提供: https://github.com/missuse/ragp

    1 回复  |  直到 6 年前
        1
  •  3
  •   hrbrmstr    7 年前

    嗯,这是可行的。但这需要肘部润滑脂。

    本部分:

    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() 这样你就可以看到发生了什么。它缺少“filename”字段,但您指定了字符串,因此它很好地模拟了您所做的操作。

    现在,棘手的部分是,它使用了一个中间重定向页面,在查询完成时,您可以输入一个电子邮件地址进行通知。它会定期(大约每隔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 rvest / xml2 解析整个页面并清除表和URL,然后可以使用它们获取新内容。

    为了做到这一切,我用了 burpsuite 拦截浏览器会话,然后 burrp