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

使用rvest登录WSJ时遇form无action属性错误求解决方案

解决rvest登录WSJ报错“form doesn't contain a action attribute”的方案

报错的核心原因是WSJ的登录页面是前端渲染的单页应用(SPA),传统的html_form()无法捕获实际的登录提交逻辑:要么表单的action属性是通过JavaScript动态生成的,要么登录请求是直接通过API接口发送,而非传统的表单提交。

具体解决步骤

  1. 抓包获取实际登录API端点
    打开浏览器开发者工具(F12)的「网络」面板,在WSJ登录页面输入账号密码并点击登录,找到触发的POST请求,记录下:
  • 请求的URL(比如https://sso.accounts.dowjones.com/login)
  • 请求体中携带的所有参数(除了用户名密码,通常还有csrf token、state、nonce等)
  • 请求头信息(比如User-Agent,部分网站会校验)
  1. 动态提取页面中的必要参数
    不要硬编码csrf、state这类动态参数,从session加载的页面中提取:
library(rvest)
library(httr)

# 初始化会话,保持cookie
s <- session("https://sso.accounts.dowjones.com/login-page?op=localop&scope=openid%20idp_id%20roles%20email%20given_name%20family_name%20djid%20djUsername%20djStatus%20trackid%20tags%20prts%20suuid%20updated_at&client_id=5hssEAdMy0mJTICnJNvC9TXEw3Va7jfO&response_type=code&redirect_uri=https%3A%2F%2Faccounts.wsj.com%2Fauth%2Fsso%2Flogin&nonce=d3dc54f1-fe5e-48e9-bd51-8a68fad0149a&ui_locales=en-us-x-wsj-223-2&mars=-1&ns=prod%2Faccounts-wsj&state=uOiEi-3gL2l96PQr.7-1So7BT-lU63MJRKIYfRsAkhTy_-CPhVwqRvddS3VM&protocol=oauth2&client=5hssEAdMy0mJTICnJNvC9TXEw3Va7jfO#!/signin")

# 提取csrf token(注意:选择器需根据实际页面结构调整)
csrf_token <- s |> 
  read_html() |> 
  html_element('input[name="csrf"]') |> 
  html_attr("value")

# 从URL中提取state和nonce参数(也可从页面元素提取)
url_params <- parse_url(s$url)$query
state <- url_params$state
nonce <- url_params$nonce
  1. 构造POST请求发送登录数据
    用session_post()直接调用登录API,带上所有必要参数:
# 构造登录参数
login_data <- list(
  username = "你的WSJ账号",
  password = "你的WSJ密码",
  csrf = csrf_token,
  state = state,
  nonce = nonce,
  op = "localop", # 参考抓包的参数
  client_id = "5hssEAdMy0mJTICnJNvC9TXEw3Va7jfO" # 原URL中的client_id
)

# 发送登录请求(替换为你抓包得到的实际API地址)
login_res <- session_post(
  s,
  url = "https://sso.accounts.dowjones.com/login",
  body = login_data,
  encode = "form",
  add_headers("User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
)

# 验证登录状态
if (login_res$status_code == 200 || grepl("dashboard", login_res$url)) {
  cat("登录成功\n")
} else {
  cat("登录失败,请检查参数或API地址\n")
}

注意事项

  • 反爬机制:WSJ可能会触发验证码或设备校验,如果遇到验证码,需要手动处理或使用验证码识别工具。
  • 参数更新:部分参数(如csrf token)会随会话变化,每次登录都要重新提取,不能复用旧值。
  • 会话保持:后续访问WSJ内容时,必须使用同一个session对象,才能保持登录状态。

内容的提问来源于stack exchange,提问作者MarcellGranat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:30:32