在R中刮掉受密码保护的网站

itp*_*sen 18 xml r web-scraping rcurl httr

我试图从R中受密码保护的网站上抓取数据.看来,httr和RCurl软件包似乎是使用密码认证进行抓取的最佳选择(我也查看了XML包).

我试图抓取的网站如下(您需要一个免费帐户才能访问整个页面):http: //subscribers.footballguys.com/myfbg/myviewprojections.php ?projector = 2

这是我的两次尝试(用我的用户名替换"username",用我的密码替换"password"):

#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"))
Run Code Online (Sandbox Code Playgroud)

我查看了其他相关帖子(下面的链接),但无法弄清楚如何将他们的答案应用到我的案例中.

如何使用R从需要cookie的SSL页面下载压缩文件

如何用R(https链接)webscrape安全页面(使用XML包中的readHTMLTable)?

从受密码保护的站点读取信息

R - RCurl从受密码保护的站点获取数据

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

jdh*_*son 17

您可以使用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
Run Code Online (Sandbox Code Playgroud)

最后当你结束时 phantomjs

pJS$stop()
Run Code Online (Sandbox Code Playgroud)

如果你想使用像firefox这样的传统浏览器(如果你想坚持使用CRAN上的版本),你可以使用:

RSelenium::startServer()
remDr <- remoteDriver()
........
........
remDr$closeServer()
Run Code Online (Sandbox Code Playgroud)

代替相关的phantomjs电话.

  • 总体而言,这是一个非常有用的答案,但可以注意到,该软件包最近有所改进,无需使用phantomjs即可更轻松地浏览chrome,firefox或IE,例如,使用``rD &lt;-RSelenium :: rsDriver(端口= 5555L,'firefox'); remDr &lt;-rD [[“ client”]]'',然后遵循原始答案。 (2认同)
  • @Nutle好点和虚拟功能不赞成使用wdman :: phantomjs所以这个答案可能需要更新 (2认同)

Ste*_*fan 16

我没有要测试的帐户,但也许这会有效:

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)
Run Code Online (Sandbox Code Playgroud)

现在,响应对象可能包含您需要的内容(或者您可以在登录请求后直接查询感兴趣的页面;我不确定重定向是否有效,但它是Web表单中的字段),并且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
Run Code Online (Sandbox Code Playgroud)

  • 这适合我.我已经编辑了内容输出 (2认同)