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

