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

Posted

技术标签:

【中文标题】使用 rvest 或 httr 登录网页上的非标准表单【英文标题】:Using rvest or httr to log in to non-standard forms on a webpage 【发布时间】:2015-04-09 17:22:15 【问题描述】:

我正在尝试使用 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 会话登录并抓取登录墙后面的数据的任何想法?

【问题讨论】:

【参考方案1】:

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

【讨论】:

嗨,非常感谢您的回复——从您的解决方案中,我现在了解到您必须将填写的表单保存为 R 中的对象,而不仅仅是将其传递给会话。但是,我似乎无法复制您的 200 状态代码——我运行上面的代码并得到上面列出的相同错误"Submitting with 'ctl00$Header2$HeaderTop1$Button1' Error in function (type, msg, asError = TRUE) : &lt;url&gt; malformed" 知道可能有什么区别吗? 编辑:我上传到最新版本的 R (3.1.3) 并收到相同的消息。谢谢!我会看看并报告。 很好的答案!您将如何使用rvest 在此会话中导航?

以上是关于使用 rvest 或 httr 登录网页上的非标准表单的主要内容,如果未能解决你的问题,请参考以下文章

R - 如何使用 rvest 或 rcurl 点击网页

如何在没有按钮参数的 Rvest 包中提交登录表单

读取带有 rvest 的 HTML 表有时会卡住并产生超时错误

当 rvest 无法识别提交按钮时提交 POST 表单

如何使用 R 登录然后从 aspx 网页下载文件

R语言(XML/rvest)下载网页表格