R - форма соскоба с помощью rvest

Сначала я хотел бы воспользоваться моментом и поблагодарить 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]] 

Я попытался определить поддельную кнопку отправки, как предложено здесь: Отправить форму без кнопки отправки в rvest

без удачи

Я открыт для решений, использующих rvest или RCurl/httr, я хотел бы избежать использования RSelenium

РЕДАКТИРОВАТЬ: благодаря удивительный ответ hrbrmstr я смог построить функцию для этой задачи. Он доступен в пакете ragp: https://github.com/missuse/ragp

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 с или около того) проверку, чтобы увидеть, завершен ли запрос, и быстро перенаправит, если это так.

Эта страница имеет идентификатор запроса, который можно извлечь с помощью:

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 и строить вещи более вручную.

Другие вопросы по тегам