使用 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) : <url> malformed"
知道可能有什么区别吗?
编辑:我上传到最新版本的 R (3.1.3) 并收到相同的消息。谢谢!我会看看并报告。
很好的答案!您将如何使用rvest
在此会话中导航?以上是关于使用 rvest 或 httr 登录网页上的非标准表单的主要内容,如果未能解决你的问题,请参考以下文章