【问题标题】:R - form web scraping with rvestR - 使用 rvest 进行网页抓取
【发布时间】:2018-02-15 21:39:48
【问题描述】:

首先,我想花点时间感谢 SO 社区, 过去你帮助了我很多次,我什至不需要创建一个帐户。

我目前的问题涉及使用 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 的问题吗?

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

我尝试按照此处的建议定义虚假提交按钮: Submit form with no submit button in rvest

没有运气。

我对使用 rvest 或 RCurl/httr 的解决方案持开放态度,我想避免使用 RSelenium

编辑:感谢 hrbrmstr 很棒的回答,我能够为这项任务构建一个函数。它在包 ragp 中可用:https://github.com/missuse/ragp

【问题讨论】:

    标签: r post web-scraping rvest rcurl


    【解决方案1】:

    嗯,这是可行的。但这将需要肘部油脂。

    这部分:

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

    您可以看到图像丢失,因为GET 仅检索 HTML 内容。您可以使用 rvest/xml2 中的函数来解析页面并刮出表格和 URL,然后您可以使用它们来获取新内容。

    为此,我使用burpsuite 拦截浏览器会话,然后使用burrp R 包检查结果。您还可以在 burpsuite 中进行目视检查并更手动地构建内容。

    【讨论】:

    • 谢谢hrbrmstr!我只想补充一点,您的回答在我之前的抓取尝试中对我有所帮助。万事如意!
    猜你喜欢
    • 2015-09-06
    • 1970-01-01
    • 2019-10-11
    • 2018-10-27
    • 1970-01-01
    相关资源
    最近更新 更多