23

rvest を使用して、フォームでの電子メール/パスワード ログインが必要な Web ページをスパイダーしようとしています。

rm(list=ls())
library(rvest)

### Trying to sign into a form using email/password 

url       <-"http://www.perfectgame.org/"   ## page to spider
pgsession <-html_session(url)               ## create session
pgform    <-html_form(pgsession)[[1]]       ## pull form from session

set_values(pgform, `ctl00$Header2$HeaderTop1$tbUsername` = "myemail@gmail.com") 
set_values(pgform, `ctl00$Header2$HeaderTop1$tbPassword` = "mypassword")

submit_form(pgsession,pgform,submit=`ctl00$Header2$HeaderTop1$Button1`)

これにより、次のエラーメッセージが表示されます。

Error in submit_request(form, submit) : 

オブジェクト 'ctl00$Header2$HeaderTop1$Button1' が見つかりません

submit パラメータを指定せずにフォームを送信すると、次のようになります。

Submitting with 'ctl00$Header2$HeaderTop1$Button1'
Error in function (type, msg, asError = TRUE)  : <url> malformed

また、この質問で述べたように、パラメーターを httr に直接渡そうとしました: How can I POST a simple HTML form in R? 、しかし、「送信」パラメーターは、逆引用符 (``)、引用符、または引用符なしの送信ボタンを受け入れませんでした:

library(httr)

url <- "http://www.perfectgame.org/Rankings/Players/Default.aspx?gyear=2015&num=500"

fd <- list(
    submit = `ctl00$Header2$HeaderTop1$Button1`,
    `ctl00$Header2$HeaderTop1$tbUsername`  = "myemail@gmail.com",
    `ctl00$Header2$HeaderTop1$tbPassword`  = "mypassword")

resp<-POST(url, body=fd, encode="form")
content(resp) 

R セッションからログインして、ログイン ウォールの背後にあるデータをスパイダーする方法についてのアイデアはありますか?

4

1 に答える 1

22

コードは変更されたフォームを保存していないため、この例では、値を入力せずにrvest元のフォームを送信しています。pgform試す:

library(rvest)

url       <-"http://www.perfectgame.org/"   ## page to spider
pgsession <-html_session(url)               ## create session
pgform    <-html_form(pgsession)[[1]]       ## pull form from session

# Note the new variable assignment 

filled_form <- set_values(pgform,
  `ctl00$Header2$HeaderTop1$tbUsername` = "myemail@gmail.com", 
  `ctl00$Header2$HeaderTop1$tbPassword` = "mypassword")

submit_form(pgsession,filled_form)

そして、エラーの代わりに 200 ステータス コードの応答が表示されるようになりました。目的の送信ボタンは最初の送信ボタンのように見えるため、引数として指定する必要はありませんが、それ以外の場合は文字列 (バック クォーテーションではなくストレート クォーテーション) を指定するだけです。

于 2015-03-24T02:34:16.953 に答える