Совершенно бесполезная страница «Пожалуйста, дайте нам свой адрес электронной почты» вводит условие, при котором мы должны поддерживать состояние для любой дальнейшей навигации или загрузки и начать с перехода на страницу с регистрационной формой и очистки ее для получения «токена аутентификатора»."со страницы, чтобы перейти к следующему запросу (якобы в целях безопасности):
library(curlconverter)
library(xml2)
library(httr)
library(rvest)
pg <- read_html("https://www.cpc.unc.edu/projects/china/data/datasets/data-downloads-registration")
html_nodes(pg, "input[name='_authenticator']") %>%
html_attr("value") -> authenticator
Я посмотрел на POST
запрос, который форма делает, используя curlconverter
(посмотритена SO, чтобы узнать, как его использовать или прочитать этот сайт проекта GitLab) и придумал:
httr::POST(
url = "https://www.cpc.unc.edu/projects/china/data/datasets/data-downloads-registration",
httr::add_headers(
`User-Agent` = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:63.0) Gecko/20100101 Firefox/63.0",
Referer = "https://www.cpc.unc.edu/projects/china/data/datasets/data-downloads-registration"
),
httr::set_cookies(`restriction-/projects/china/data/datasets/data_downloads` = "/projects/china/data/datasets/data_downloads"),
body = list(
`first-name` = "Steve",
`last-name` = "Rogers",
`email-address` = "example@me.com",
`interest` = "a researcher",
`org` = "The Avengers",
`department` = "Operations",
`postal-address` = "1 Avengers Drive",
`city-name` = "Undisclosed",
`state-province` = "Virginia",
`postal-code` = "09911",
`country-name` = "US",
`opt-in:boolean:default` = "",
`fieldset` = "default",
`form.submitted` = "1",
`add_reference.field:record` = "",
`add_reference.type:record"` = "",
`add_reference.destination:record"` = "",
`last_referer` = "https://www.cpc.unc.edu/projects/china/data/datasets",
`_authenticator` = authenticator,
`form_submit` = "Submit"
),
encode = "multipart"
) -> res
(curlconverter
делает для вас ^^ из простой «копии» определенного элемента в инструментах разработчика)
Надеюсь, вы видите, куда входит authenticator
.
Теперь, когда мы получили ??, нам нужно добраться до файлов.
Сначала нам нужно перейти на страницу загрузки:
read_html(httr::content(res, as = "text")) %>%
html_nodes(xpath=".//p[contains(., 'You may now')]/strong/a") %>%
html_attr("href") -> dl_pg_link
dl_pg <- httr::GET(url = dl_pg_link)
Затем нам нужно перейти на страницу загрузки real :
httr::content(dl_pg, as = "text") %>%
read_html() %>%
html_nodes(xpath=".//a[contains(@class, 'contenttype-folder state-published url')]") %>%
html_attr("href") -> dls
Затем нам нужно получить все загружаемые биты с этой страницы:
zip_pg <- httr::GET(url = dls)
httr::content(zip_pg, as = "text") %>%
read_html() %>%
html_nodes("td > a") %>%
html_attr("href") %>%
gsub("view$", "at_download/file", .) -> dl_links
Вот как получить первый:
(fil1 <- httr::GET(dl_links[1]))
## Response [https://www.cpc.unc.edu/projects/china/data/datasets/data_downloads/longitudinal/weights-chns.pdf/at_download/file]
## Date: 2018-10-14 03:03
## Status: 200
## Content-Type: application/pdf
## Size: 197 kB
## <BINARY BODY>
fil1$headers[["content-disposition"]]
## [1] "attachment; filename=\"weights-chns.pdf\""
writeBin(
httr::content(fil1, as = "raw"),
file.path("~/Data", gsub('"', '', strsplit(fil1$headers[["content-disposition"]], "=")[[1]][2])))
)
(fil2 <- httr::GET(dl_links[2]))
## Response [https://www.cpc.unc.edu/projects/china/data/datasets/data_downloads/longitudinal/Biomarker_2012Dec.zip/at_download/file]
## Date: 2018-10-14 03:06
## Status: 200
## Content-Type: application/zip
## Size: 2.37 MB
## <BINARY BODY>
(который является PDF) и вот какполучите второй, который является ZIP:
fil2$headers[["content-disposition"]]
## [1] "attachment; filename=\"Biomarker_2012Dec.zip\""
writeBin(
httr::content(fil2, as = "raw"),
file.path("~/Data", gsub('"', '', strsplit(fil2$headers[["content-disposition"]], "=")[[1]][2])))
)
Вы можете превратить ^^ в итеративную операцию.
Обратите внимание, что вы должны начинать сверху(т. е. начинать со страницы ввода формы электронной почты) каждый раз, когда вы начинаете новый сеанс R, поскольку базовый пакет curl
(который поддерживает httr
и rvest
) поддерживает состояние сеанса для вас (в файлах cookie).