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

如何用rvest勾选复选框访问目标页面?重定向问题求解

解决Sportsline MLB赔率页面爬取的重定向与交互问题

核心结论

rvest是静态HTTP请求工具,无法处理需要用户交互(比如勾选复选框)的验证步骤,这就是你直接请求目标URL被重定向的原因——网站需要你完成验证才会返回目标页面内容。

可行解决思路

1. 修复RSelenium方案(模拟真实浏览器交互)

既然你之前试过RSelenium但遇到问题,给你一套具体的步骤和代码示例:

  • 确保你已经安装了对应浏览器的驱动(比如ChromeDriver),并配置好环境变量
  • 用RSelenium启动浏览器,模拟勾选复选框,再提取页面内容:
library(RSelenium)
library(rvest)

# 启动Chrome驱动(如果是其他浏览器替换对应参数)
driver <- rsDriver(browser = "chrome", port = 4444L, verbose = FALSE)
remDr <- driver[["client"]]

# 访问目标URL
remDr$navigate("https://www.sportsline.com/mlb/odds/money-line/")

# 定位复选框并点击(需要根据实际页面元素调整选择器,这里假设是同意条款的复选框)
# 可以用浏览器F12查看元素的CSS选择器或XPath
checkbox <- remDr$findElement(using = "css selector", value = "input[type='checkbox'].terms-checkbox")
checkbox$clickElement()

# 等待页面跳转加载完成(可以根据实际情况调整等待时间)
Sys.sleep(3)

# 获取页面源码,用rvest解析
page_source <- remDr$getPageSource()[[1]]
page <- read_html(page_source)

# 接下来用你原来的代码提取数据
GameTime = page %>% html_nodes(".game-details") %>% html_text()
VisTm = page %>% html_nodes(".away-team .cfYQTQ") %>% html_text()
HmTm = page %>% html_nodes(".home-team .cfYQTQ") %>% html_text()
Away_Odds = page %>% html_nodes(".away-team .projected-score+ td .primary") %>% html_text()
Close = page %>% html_nodes(".home-team .projected-score+ td .primary") %>% html_text()

# 关闭驱动
remDr$close()
driver$server$stop()

注意:如果找不到复选框元素,打开浏览器的开发者工具,右键复选框选择「复制CSS选择器」或「复制XPath」替换代码里的选择器。

2. 直接调用API(更高效的方案)

比起模拟浏览器,直接抓包找数据接口是更优的选择:

  • 打开浏览器F12,切换到「网络」标签
  • 手动勾选复选框进入目标页面,观察「XHR」或「Fetch」分类下的请求
  • 找到加载MLB money line数据的API接口(通常是返回JSON格式的请求)
  • 复制该API的URL和请求头(比如User-Agent、Cookie等),用httr包直接请求:
library(httr)
library(jsonlite)

# 替换为你抓到的API URL和请求头
api_url <- "https://example-api.sportsline.com/mlb/odds/money-line"
headers <- add_headers(
  "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
  "Cookie" = "你的Cookie内容"
)

# 请求API
response <- GET(api_url, headers)
data <- fromJSON(content(response, "text"))

# 从JSON数据中提取你需要的字段(根据API返回结构调整)
GameTime <- data$games$time
VisTm <- data$games$away_team$name
# ... 其他字段同理

提示:Cookie可能会过期,需要定期更新;不要频繁请求,避免触发反爬机制。

额外注意事项

  • 网站的robots.txt可能限制爬取,建议先查看https://www.sportsline.com/robots.txt
  • 若API有签名参数(比如timestamp、signature),可能需要进一步分析前端JS逻辑来生成参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:27:07