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

标签 html r forms 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`)

这给了我以下错误信息:

Error in submit_request(form, submit) : 

未找到对象“ctl00$Header2$HeaderTop1$Button1”

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

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 session 登录并抓取登录墙后面的数据有什么想法吗?

最佳答案

您的 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 状态代码响应,而不是错误。请注意,因为所需的提交按钮似乎是第一个提交按钮,所以我们不需要将其作为参数提供,否则我们只需为其提供一个字符串(直引号,而不是反引号)。

关于html - 使用rvest或httr登录网页上的非标准表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28418770/

相关文章:

R:创建 xts 对象的动态列表

r - 检查字符串是否包含除数字以外的任何内容

javascript - 单击行按钮删除动态创建的表行

delphi - Delphi中如何在窗体之间传递数据?

css - Facebook Like Box 在使用 iframe 可见性属性时未正确调整大小

html - 在单词中单个字母的空间内添加背景颜色

html - 如何删除以前版本的 bootstrap cdn?

html - css中的滚动条拇指高度

r - 将两个包含数据帧的列表合并为一个包含合并数据帧的列表

java - <spring :bind> for? 什么时候用,什么时候不用?