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.
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
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
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.