2014-07-13 21 views
10

Tôi đang cố gắng để xóa dữ liệu từ một trang web được bảo vệ bằng mật khẩu trong R. Đọc xung quanh, có vẻ như các gói httr và RCurl là các tùy chọn tốt nhất để cạo bằng xác thực mật khẩu (Tôi đã cũng đã xem xét gói XML).Cạo mật khẩu bảo vệ trang web trong R

Các trang web tôi đang cố gắng để cạo dưới (bạn cần có một tài khoản miễn phí để truy cập vào trang đầy đủ): http://subscribers.footballguys.com/myfbg/myviewprojections.php?projector=2

Dưới đây là hai nỗ lực của tôi (thay thế "username" với tên truy cập và "của tôi mật khẩu "với mật khẩu của tôi):

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

Tôi đã xem các bài đăng có liên quan khác (liên kết bên dưới), nhưng không thể tìm ra cách áp dụng câu trả lời cho trường hợp của tôi.

How to use R to download a zipped file from a SSL page that requires cookies

How to webscrape secured pages in R (https links) (using readHTMLTable from XML package)?

Reading information from a password protected site

R - RCurl scrape data from a password-protected site

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

Trả lời

11

Tôi không có một tài khoản để thử nghiệm với, nhưng có lẽ điều này sẽ làm việc:

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) 

Bây giờ, đối tượng phản ứng có thể giữ những gì bạn cần (hoặc có thể bạn có thể trực tiếp truy vấn trang quan tâm sau yêu cầu đăng nhập; Tôi không chắc chắn chuyển hướng sẽ hoạt động, nhưng nó là một trường trong biểu mẫu web) và handle có thể được sử dụng lại cho các yêu cầu tiếp theo. Không thể kiểm tra nó; nhưng điều này làm việc cho tôi trong nhiều tình huống.

Bạn có thể xuất bảng sử dụng 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 
+1

Điều này làm việc cho tôi. Tôi đã chỉnh sửa với đầu ra nội dung – jdharrison

+0

Tuyệt vời! Tôi không nghĩ rằng nó dễ dàng hơn nhiều ... – Stefan

+0

Tôi đã thử nghiệm cả hai câu trả lời và cả hai đều làm việc tuyệt vời.Tôi đã chọn cái này cho sự đơn giản của nó. – dadrivr

11

Bạn có thể sử dụng RSelenium. Tôi đã sử dụng phiên bản dev vì bạn có thể chạy phantomjs mà không có Máy chủ 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 

Cuối cùng khi bạn đã kết thúc gần phantomjs

pJS$stop() 

Nếu bạn muốn sử dụng một trình duyệt truyền thống như firefox ví dụ (nếu bạn muốn dính vào phiên bản trên cran), bạn sẽ sử dụng:

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

thay cho số liên lạc phantomjs cuộc gọi.

+0

Cảm ơn, đây là một cách tiếp cận rất linh hoạt để giải quyết việc này. –

+1

Trong khi tổng thể đây là một câu trả lời rất hữu ích, có thể lưu ý rằng gần đây gói nâng cao một chút, cho phép duyệt web thuận tiện hơn thông qua chrome, firefox hoặc IE mà không cần phantomj, ví dụ, sử dụng '' rD <- RSelenium: : rsDriver (cổng = 5555L, 'firefox'); remDr <- rD [["client"]] '' và làm theo câu trả lời ban đầu sau đó. – Nutle

+1

@Nutle điểm tốt và các chức năng phantom được phản đối trong lợi của wdman :: phantomjs vì vậy có lẽ câu trả lời này cần cập nhật – jdharrison

Các vấn đề liên quan