You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用rvest包做R爬虫登录网站时form无action属性报错如何解决

问题原因

你遇到的报错本质是目标网站的登录表单未声明action属性,不符合rvestsubmit_form()函数的参数校验规则,和提交方法无关。根据HTML规范,未声明action的表单默认提交到当前页面地址,因此只需补全表单的action属性即可解决,修改成本极低。

解决方案1(最小改动原有逻辑,最简便)

在原有代码中新增一行手动给表单赋值action属性即可,修改后完整代码如下:

library(rvest)
link_of_login <- "https://www.fio.cz/e-broker/e-broker.cgi"
pgsession <- html_session(link_of_login)
pgform <- html_form(pgsession)[[1]]
# 新增行:手动补全表单action属性,无action默认提交到当前登录页地址
pgform$action <- link_of_login
filled_form <- set_values(pgform, LOGIN_USERNAME="USERNAME", LOGIN_PASSWORD="PASSWORD")
submit_form(pgsession, filled_form)
解决方案2(直接构造POST请求,兼容性更强)

如果上述方案仍有问题,可以跳过rvest的表单校验逻辑,直接用httr构造POST请求提交登录信息,同时保留会话状态方便后续爬取:

library(rvest)
library(httr)
link_of_login <- "https://www.fio.cz/e-broker/e-broker.cgi"
# 先访问登录页获取会话cookie和必要的隐藏表单参数
pgsession <- html_session(link_of_login)
pgform <- html_form(pgsession)[[1]]
# 提取所有表单默认参数,替换用户名密码
form_params <- pgform$fields
form_params$LOGIN_USERNAME$value <- "USERNAME"
form_params$LOGIN_PASSWORD$value <- "PASSWORD"
# 过滤空值参数,构造POST请求的body
post_body <- lapply(form_params, function(x) x$value)
post_body <- post_body[!sapply(post_body, is.null)]
# 提交POST请求登录
login_resp <- POST(url = link_of_login, body = post_body, encode = "form", config = pgsession$config)
# 验证登录状态:检查返回页是否包含登录后才有的特征文本即可
html_content <- content(login_resp, "text")
grepl("登录成功标识文本", html_content)
额外注意事项
  • 部分网站登录表单会带有动态CSRF校验隐藏字段,上述代码已经保留了表单解析的隐藏字段参数,不要手动删除避免校验失败
  • 如果遇到访问被拦截,可以在请求中添加User-Agent头模拟浏览器访问

内容的提问来源于stack exchange,提问作者JEŠTĚR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:06:04