Как я могу разместить простую форму HTML в R?

Я относительно новичок в программировании на R и пытаюсь использовать некоторые вещи, которые я изучаю в треке Johns Hopkins Data Science, для практического использования. В частности, я хотел бы автоматизировать процесс загрузки исторических цен облигаций с веб-сайта казначейства США.

Используя Firefox и R, я смог определить, что веб-сайт Казначейства США использует очень простую форму HTML POST, чтобы указать одну дату для интересующих котировок. Затем он возвращает таблицу информации о вторичном рынке для всех находящихся в обращении облигаций.

Я безуспешно пытался использовать два разных пакета R для отправки запроса на веб-сервер Казначейства США. Заяц два подхода, которые я попробовал:

Попытка № 1 (с использованием RCurl):

url <- "https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate.htm"
td.html <- postForm(url,
                    submit = "Show Prices",
                    priceDate.year  = 2014,
                    priceDate.month = 12,
                    priceDate.day   = 15,
                   .opts = curlOptions(ssl.verifypeer = FALSE))

Это приводит к тому, что веб-страница возвращается и сохраняется в td.html но он содержит только сообщение об ошибке от сервера treasurydirect. Я знаю, что сервер работает, потому что когда я отправляю тот же запрос через браузер, я получаю ожидаемые результаты.

Попытка № 2 (с использованием rvest):

s <- html_session(url)
f0 <- html_form(s)
f1 <- set_values(f0[[2]], priceDate.year=2014, priceDate.month=12, priceDate.day=15)
test <- submit_form(s, f1)

К сожалению, этот подход даже не оставляет R и приводит к следующему сообщению об ошибке от R:

Submitting with 'submit'
Error in function (type, msg, asError = TRUE)  : <url> malformed

Кажется, я не могу понять, как посмотреть, какой "искаженный" текст отправляется в rvest, чтобы я мог попытаться диагностировать проблему.

Будем весьма благодарны за любые предложения или советы по решению этой кажущейся простой задачи!

2 ответа

Решение

Ну, похоже, работает с httr библиотека.

library(httr)

url <- "https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate.htm"

fd <- list(
    submit = "Show Prices",
    priceDate.year  = 2014,
    priceDate.month = 12,
    priceDate.day   = 15
)

resp<-POST(url, body=fd, encode="form")
content(resp)

rvest библиотека действительно просто обертка httr, Похоже, что он не очень хорошо интерпретирует абсолютные URL-адреса без имени сервера. Так что если вы посмотрите на

f1$url
# [1] /GA-FI/FedInvest/selectSecurityPriceDate.htm

вы видите, что он просто имеет путь, а не имя сервера. Это кажется сбивающим с толку httr, Если вы делаете

f1 <- set_values(f0[[2]], priceDate.year=2014, priceDate.month=12, priceDate.day=15)
f1$url <- url
test <- submit_form(s, f1)

это похоже на работу. Возможно, это большой, что следует сообщить rvest, (Проверено на rvest_0.1.0)

Я знаю, что это старый вопрос, но добавление

style='POST'

параметр для postForm делает трюк также.

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