Очистить защищенный паролем сайт в R

Я пытаюсь очистить данные с защищенного паролем веб-сайта в R. Читая, кажется, что пакеты httr и RCurl - лучшие варианты для очистки с аутентификацией по паролю (я также изучил пакет XML).

Веб-сайт, который я пытаюсь очистить, находится ниже (вам нужна бесплатная учетная запись для доступа к полной странице): http://subscribers.footballguys.com/myfbg/myviewprojection.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, для которой требуются файлы cookie

https://stackoverflow.com/questions/10692066/how-to-webscrape-secured-pages-in-r-https-links-using-readhtmltable-from-xml

Чтение информации с сайта, защищенного паролем

R - RCurl очищает данные с сайта, защищенного паролем

http://www.inside-r.org/questions/how-scrape-data-password-protected-https-website-using-r-hold.


person itpetersen    schedule 13.07.2014    source источник


Ответы (2)


У меня нет учетной записи для тестирования, но, возможно, это сработает:

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
person Stefan    schedule 13.07.2014
comment
У меня это работает. Я редактировал с выводом содержимого - person jdharrison; 13.07.2014
comment
Я проверил оба ответа, и они оба отлично работают. Я выбрал этот из-за его простоты. - person itpetersen; 13.07.2014
comment
Возможно, для других сайтов пригодится RSelenium; веб-сайты не всегда такие прямолинейные, как этот ... Я буду помнить о фантомах. - person Stefan; 13.07.2014
comment
Как была найдена информация о форме входа в систему? - person Cyrus Mohammadian; 07.03.2019

Вы можете использовать RSelenium. Я использовал версию для разработчиков, так как вы можете запускать 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 вызовов.

person jdharrison    schedule 13.07.2014
comment
Спасибо, это очень универсальный подход к решению этой проблемы. - person Steve G. Jones; 11.08.2016
comment
Хотя в целом это очень полезный ответ, можно отметить, что в последнее время пакет немного продвинулся, позволяя более удобный просмотр через chrome, firefox или IE без необходимости использования phantomjs, например, используя rD <- RSelenium::rsDriver(port = 5555L, 'firefox'); remDr <- rD[["client"]] и после этого следуя исходному ответу. - person runr; 03.02.2017
comment
@Nutle хорошие моменты, а функция фантома устарела в пользу wdman :: phantomjs, поэтому, возможно, этот ответ нуждается в обновлении - person jdharrison; 03.02.2017