Невозможно скачать файл с rvest / httr после отправки формы поиска - PullRequest
3 голосов
/ 21 июня 2020

Это кажется простой проблемой, но я боролся с ней несколько дней. Это минимальный рабочий пример, а не реальная проблема:

Этот вопрос казался похожим, но я не смог использовать ответ для решения своей проблемы.

В браузере , С I go на этот URL и нажмите [Search] (нет необходимости делать выбор из списков), а затем [Download Results] (выбрав, например, параметр Xlsx) . Затем файл загружается.

Чтобы автоматизировать это в R, я попытался:

library(rvest)

url1 <- "https:/secure.gamblingcommission.gov.uk/PublicRegister/Search"
sesh1 <- html_session(url1)
form1    <-html_form(sesh1)[[1]]
subform <- submit_form(sesh1, form1)

Используя Chrome инструменты разработчика, я обнаружил, что URL-адрес используется для начала загрузки, поэтому я пытаюсь:

url2 <- "https:/secure.gamblingcommission.gov.uk/PublicRegister/Search/Download"
res <- GET(url = url2, query = list(format = "xlsx"))

Однако при этом файл не загружается:

> res$content
  raw(0) 

Я также пробовал

download.file(url = paste0(url2, "?format=xlsx") , destfile = "down.xlsx", mode = "wb")

Но при этом ничего не загружается:

> Content type '' length 0 bytes
> downloaded 0 bytes

Обратите внимание, что в браузере вставка url2 и добавление запроса format инициирует загрузку (после выполнения поиска из url1)

Я подумал, что я должен каким-то образом использовать информацию о сеансе из исходного блока кода для загрузки, но пока я не могу понять, как это сделать.

Заранее благодарим за любую помощь!

1 Ответ

4 голосов
/ 21 июня 2020

Вы почти у цели, и ваша интуиция верна относительно использования информации о сеансе.

Вам просто нужно использовать rvest::jump_to, чтобы перейти ко второму URL-адресу и затем записать его на диск:

library(rvest)

url1 <- "https:/secure.gamblingcommission.gov.uk/PublicRegister/Search"
sesh1 <- html_session(url1)
form1    <-html_form(sesh1)[[1]]
subform <- submit_form(sesh1, form1)

url2 <- "https://secure.gamblingcommission.gov.uk/PublicRegister/Search/Download"

#### The above is your original code - below is the additional code you need:

download <- jump_to(subform, paste0(url2, "?format=xlsx"))
writeBin(download$response$content, "down.xlsx")
...