Очистите защищенный паролем веб-сайт в R
Я пытаюсь очистить данные с защищенного паролем веб-сайта в R. Просматривая, кажется, что httr и RCurl-пакеты являются лучшими вариантами для очистки с аутентификацией пароля (я также рассмотрел пакет XML).
Веб-сайт, который я пытаюсь очистить, ниже (вам нужна бесплатная учетная запись для доступа к полной странице):
http://subscribers.footballguys.com/myfbg/myviewprojections.php?projector=2
Вот мои две попытки (заменив "имя пользователя" моим именем пользователя и "паролем" на мой пароль):
#This returns "Status: 200" without the data from the page:
library(httr)
GET("http://subscribers.footballguys.com/myfbg/myviewprojections.php?projector=2", authenticate("username", "password"))
#This returns the non-password protected preview (i.e., not the full page):
library(XML)
library(RCurl)
readHTMLTable(getURL("http://subscribers.footballguys.com/myfbg/myviewprojections.php?projector=2", userpwd = "username:password"))
Я просмотрел другие соответствующие сообщения (ссылки ниже), но не могу понять, как применить их ответы на мой случай.
Как использовать R для загрузки заархивированного файла с SSL-страницы, требующей куки файлов.
Как подключить защищенные страницы в R (https-ссылки) (используя readHTMLTable из пакета XML)?
Чтение информации с защищенного паролем сайта
R - RCurl очистить данные с защищенного паролем сайта
http://www.inside-r.org/info/how-scrape-data-password-protected-https-website-using-r-hold
Ответы
Ответ 1
У меня нет учетной записи для тестирования, но, возможно, это сработает:
library(httr)
library(XML)
handle <- handle("http://subscribers.footballguys.com")
path <- "amember/login.php"
# fields found in the login form.
login <- list(
amember_login = "username"
,amember_pass = "password"
,amember_redirect_url =
"http://subscribers.footballguys.com/myfbg/myviewprojections.php?projector=2"
)
response <- POST(handle = handle, path = path, body = login)
Теперь объект ответа может содержать то, что вам нужно (или, возможно, вы можете напрямую запросить интересующую страницу после запроса на вход, я не уверен, что перенаправление будет работать, но это поле в веб-форме) и handle
может быть повторно использован для последующих запросов. Не могу проверить его; но это работает для меня во многих ситуациях.
Вы можете вывести таблицу, используя XML
> readHTMLTable(content(response))[[1]][1:5,]
Rank Name Tm/Bye Age Exp Cmp Att Cm% PYd Y/Att PTD Int Rsh Yd TD FantPt
1 1 Peyton Manning DEN/4 38 17 415 620 66.9 4929 7.95 43 12 24 7 0 407.15
2 2 Drew Brees NO/6 35 14 404 615 65.7 4859 7.90 37 16 22 44 1 385.35
3 3 Aaron Rodgers GB/9 31 10 364 560 65.0 4446 7.94 33 13 52 224 3 381.70
4 4 Andrew Luck IND/10 25 3 366 610 60.0 4423 7.25 27 13 62 338 2 361.95
5 5 Matthew Stafford DET/9 26 6 377 643 58.6 4668 7.26 32 19 34 102 1 358.60
Ответ 2
Вы можете использовать RSelenium. Я использовал версию dev, поскольку вы можете запускать phantomjs
без Selenium Server.
# Install RSelenium if required. You will need phantomjs in your path or follow instructions
# in package vignettes
# devtools::install_github("ropensci/RSelenium")
# login first
appURL <- 'http://subscribers.footballguys.com/amember/login.php'
library(RSelenium)
pJS <- phantom() # start phantomjs
remDr <- remoteDriver(browserName = "phantomjs")
remDr$open()
remDr$navigate(appURL)
remDr$findElement("id", "login")$sendKeysToElement(list("myusername"))
remDr$findElement("id", "pass")$sendKeysToElement(list("mypass"))
remDr$findElement("css", ".am-login-form input[type='submit']")$clickElement()
appURL <- 'http://subscribers.footballguys.com/myfbg/myviewprojections.php?projector=2'
remDr$navigate(appURL)
tableElem<- remDr$findElement("css", "table.datamedium")
res <- readHTMLTable(header = TRUE, tableElem$getElementAttribute("outerHTML")[[1]])
> res[[1]][1:5, ]
Rank Name Tm/Bye Age Exp Cmp Att Cm% PYd Y/Att PTD Int Rsh Yd TD FantPt
1 1 Peyton Manning DEN/4 38 17 415 620 66.9 4929 7.95 43 12 24 7 0 407.15
2 2 Drew Brees NO/6 35 14 404 615 65.7 4859 7.90 37 16 22 44 1 385.35
3 3 Aaron Rodgers GB/9 31 10 364 560 65.0 4446 7.94 33 13 52 224 3 381.70
4 4 Andrew Luck IND/10 25 3 366 610 60.0 4423 7.25 27 13 62 338 2 361.95
5 5 Matthew Stafford DET/9 26 6 377 643 58.6 4668 7.26 32 19 34 102 1 358.60
Наконец, когда вы закончите, закройте phantomjs
pJS$stop()
Если вы хотите использовать традиционный браузер, например, firefox (если вы хотите придерживаться версии на CRAN), вы должны использовать:
RSelenium::startServer()
remDr <- remoteDriver()
........
........
remDr$closeServer()
вместо соответствующих вызовов phantomjs
.