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

使用R的rvest会话登录网站:无法设置未命名表单字段

使用rvest登录SportsBettingDime网站失败的解决方案

问题概述

  • 目标网站登录表单字段无name属性,导致html_form_set报错,无法设置邮箱、密码
  • 手动修改表单字段值、请求方法及action后,仍无法完成登录
  • 登录验证标准:赛事赔率页面的money和sharp列显示实际数值(未登录时为NA),当前验证结果仍为NA

核心原因

该网站登录表单依赖JavaScript动态处理提交逻辑,静态HTML中无标准表单字段名,rvest的html_form无法识别有效字段;且直接修改表单对象无法模拟浏览器的真实请求流程(可能缺失CSRF Token、请求头、正确的提交接口等关键信息)。

解决方案:直接构造POST登录请求

通过浏览器开发者工具抓取真实登录请求的关键信息(接口URL、参数、请求头),绕过静态表单解析,直接构造POST请求提交登录信息。

修改后的登录代码

library(dplyr)
library(rvest)
library(httr)

login_to_website <- function() {
  # 先访问登录页面(注意:需确认实际登录页URL,可能是login而非register)
  login_page_url <- "https://www.sportsbettingdime.com/plus/login/"
  # 设置模拟浏览器的User-Agent,避免被反爬机制拦截
  pgsession <- session(login_page_url, 
                       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")
  Sys.sleep(1)
  
  # 提取页面中的CSRF Token(部分网站会验证该参数)
  csrf_token <- tryCatch(
    pgsession %>% html_node("meta[name='csrf-token']") %>% html_attr("content"),
    error = function(e) NULL
  )
  
  # 构造登录参数,参数名必须与浏览器抓包结果完全一致
  login_params <- list(
    email = "nickcanova@gmail.com",
    password = "tpe.vxp3ZRT!twq.wkd"
  )
  # 若存在CSRF Token,添加到参数列表
  if (!is.null(csrf_token)) {
    login_params[["_token"]] <- csrf_token
  }
  
  # 发送POST请求到真实登录接口(从浏览器Network面板获取)
  login_response <- session_post(
    pgsession,
    url = "https://www.sportsbettingdime.com/plus/login/", # 替换为抓包得到的真实登录接口
    body = login_params,
    encode = "form",
    # 添加Referer头,模拟浏览器请求来源
    add_headers(Referer = login_page_url)
  )
  
  # 简单判断请求是否成功
  if (login_response$status_code %in% c(200, 302)) {
    message("登录请求发送成功")
  } else {
    message(paste("登录请求失败,状态码:", login_response$status_code))
  }
  
  return(pgsession)
}

登录验证代码(保留逻辑并优化)

verify_login <- function(pgsession, league = "nba") {
  page_url <- paste0('https://www.sportsbettingdime.com/', league, '/odds/')
  page_overall <- session_jump_to(pgsession, page_url)
  
  table_list <- page_overall %>% html_nodes('table.odds-table') %>% html_table()
  
  if (length(table_list) == 0) {
    message("未找到赔率表格,可能登录失败或页面结构更新")
    return(NULL)
  }
  
  df1 <- table_list[[1]] %>% as.data.frame()
  colnames(df1) <- c('teams', 'spread1', 'spread2', 'spread3', 'spread4', 'spread5', 'bet', 'money', 'sharp', 'bet2')
  
  # 验证登录状态
  has_valid_data <- any(!is.na(df1$money)) && any(!is.na(df1$sharp))
  message(ifelse(has_valid_data, "登录成功:money和sharp列已加载数据", "登录失败:money和sharp列仍为NA"))
  
  return(df1[, c('money', 'sharp')])
}

# 使用示例
login_session <- login_to_website()
verify_login(login_session)

关键注意事项

  1. 抓包确认真实请求信息:必须用浏览器开发者工具(F12)的Network面板,查看登录时发送的POST请求,确认:
    • 正确的登录接口URL(可能不是register页面)
    • 表单参数的真实名称(需以抓包结果为准,可能与预期不同)
    • 是否需要CSRF Token、Cookie等额外参数
  2. 反爬规避:设置合理的User-Agent、请求间隔(Sys.sleep),避免被网站拦截
  3. 动态页面处理:如果网站登录后数据仍由JS动态加载,rvest无法解析,需改用RSelenium或playwright模拟完整浏览器环境

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:05:53