使用rvest或httr登录网页上的非标准表单

gbo*_*ock 22 html forms r rvest

我试图使用rvest来蜘蛛网页,该网页需要在表单上登录电子邮件/密码.

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

这给我以下错误信息:

Error in submit_request(form, submit) : 
Run Code Online (Sandbox Code Playgroud)

找不到对象'ctl00 $ Header2 $ HeaderTop1 $ Button1'

如果我在没有指定submit参数的情况下提交表单,我会得到:

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

我也尝试将参数直接传递给httr,如本问题所述:如何在R中发布一个简单的HTML表单?,但"submit"参数不接受提交按钮,使用向后引号(``),引号或没有任何引号:

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

关于如何从R会话登录并抓取登录墙后面的数据的任何想法?

cbo*_*tig 19

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

我现在看到一个很好的200状态代码响应而不是错误.请注意,因为所需的提交按钮似乎是第一个提交按钮,我们不需要将其作为参数,但我们只是给它一个字符串(直引号,而不是后引号).

  • 很棒的答案!您如何使用`rvest`在此会话中导航? (6认同)