使用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
相关产品推荐
相关产品推荐

