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