/ / Scrape chroniona hasłem witryna w języku R - xml, r, web-scraping, rcurl, httr

Zgarnij witrynę chronioną hasłem w R - xml, r, web-scraping, rcurl, httr

Próbuję zeskrobać dane z plikustrona chroniona hasłem w R. Czytając, wydaje się, że pakiety httr i RCurl są najlepszymi opcjami skrobania za pomocą uwierzytelniania hasłem (zajrzałem również do pakietu XML).

Witryna, którą próbuję zeskrobać, znajduje się poniżej (potrzebujesz bezpłatnego konta, aby uzyskać dostęp do pełnej strony): http://subscribers.footballguys.com/myfbg/myviewprojections.php?projector=2

Oto dwie moje próby (zastąpienie „nazwy użytkownika” moją nazwą użytkownika i „hasła” moim hasłem):

#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"))

Przejrzałem inne odpowiednie posty (linki poniżej), ale nie mogę wymyślić, jak zastosować ich odpowiedzi w mojej sprawie.

Jak użyć R, aby pobrać spakowany plik ze strony SSL, która wymaga plików cookie

Jak zapisywać zabezpieczone strony w R (linki https) (używając readHTMLTable z pakietu XML)?

Odczytywanie informacji z witryny chronionej hasłem

R - RCurl zeskrobuje dane z witryny chronionej hasłem

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

Odpowiedzi:

12 dla odpowiedzi № 1

Nie mam konta do testowania, ale może to zadziała:

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)

Teraz obiekt odpowiedzi może pomieścić to, czego potrzebujesz(a może możesz bezpośrednio zapytać o interesującą stronę po zgłoszeniu logowania; nie jestem pewien, czy przekierowanie zadziała, ale jest to pole w formularzu internetowym), i handle może być ponownie użyty do kolejnych żądań. Nie mogę tego przetestować, ale działa to dla mnie w wielu sytuacjach.

Możesz wyprowadzić tabelę za pomocą 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

12 dla odpowiedzi nr 2

Możesz użyć RSelenium. Użyłem wersji deweloperskiej, ponieważ możesz uruchomić phantomjs bez serwera Selenium.

# 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

Wreszcie, kiedy skończysz blisko phantomjs

pJS$stop()

Jeśli chcesz korzystać z tradycyjnej przeglądarki, na przykład Firefox, (jeśli chcesz trzymać się wersji CRAN), użyj:

RSelenium::startServer()
remDr <- remoteDriver()
........
........
remDr$closeServer()

zamiast pokrewnych phantomjs połączenia.