web-dev-qa-db-fra.com

Grattez le site Web protégé par mot de passe dans R

J'essaie de gratter les données d'un site Web protégé par mot de passe dans R. En lisant autour, il semble que les packages httr et RCurl soient les meilleures options pour le scraping avec l'authentification par mot de passe (j'ai également examiné le package XML).

Le site Web que j'essaye de gratter est ci-dessous (vous avez besoin d'un compte gratuit pour accéder à la page complète): http://subscribers.footballguys.com/myfbg/myviewprojections.php?projector=2 =

Voici mes deux tentatives (en remplaçant "nom d'utilisateur" par mon nom d'utilisateur et "mot de passe" par mon mot de passe):

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

J'ai regardé d'autres articles pertinents (liens ci-dessous), mais je ne sais pas comment appliquer leurs réponses à mon cas.

Comment utiliser R pour télécharger un fichier compressé à partir d'une page SSL qui nécessite des cookies

Comment webscraper des pages sécurisées en R (liens https) (en utilisant readHTMLTable à partir d'un package XML)?

Lecture des informations d'un site protégé par mot de passe

R - RCurl gratte les données d'un site protégé par mot de passe

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

18
itpetersen

Je n'ai pas de compte pour tester, mais cela fonctionnera peut-être:

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)

Maintenant, l'objet de réponse peut contenir ce dont vous avez besoin (ou peut-être pouvez-vous interroger directement la page d'intérêt après la demande de connexion; je ne suis pas sûr que la redirection fonctionnera, mais c'est un champ dans le formulaire Web), et handle peut être réutilisé pour les requêtes suivantes. Je ne peux pas le tester; mais cela fonctionne pour moi dans de nombreuses situations.

Vous pouvez afficher le tableau à l'aide de 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
16
Stefan

Vous pouvez utiliser RSelenium. J'ai utilisé la version de développement car vous pouvez exécuter phantomjs sans serveur 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

Enfin, lorsque vous avez terminé, fermez phantomjs

pJS$stop()

Si vous souhaitez utiliser un navigateur traditionnel comme Firefox par exemple (si vous souhaitez vous en tenir à la version sur CRAN) vous utiliserez:

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

à la place des appels phantomjs associés.

17
jdharrison