R抓取MLB薪资动态网页仅获100条数据,求助R Selenium方案
使用R Selenium抓取完整MLB投手薪资数据
Spotrac的薪资页面采用动态加载机制,初始仅渲染前100条数据,剩余内容需要滚动页面触发加载。用R Selenium可以模拟浏览器行为,加载全部308条数据,步骤如下:
1. 安装并加载依赖包
# 首次运行需安装包 install.packages(c("RSelenium", "tidyverse", "rvest")) # 加载核心包 library(RSelenium) library(tidyverse) library(rvest)
2. 启动Selenium浏览器实例
以Chrome为例,确保本地Chrome版本与ChromeDriver匹配(RSelenium会自动尝试下载对应版本,若失败需手动下载并指定路径):
# 启动Chrome驱动与浏览器 driver <- rsDriver(browser = "chrome", chromever = "latest") remDr <- driver[["client"]] # 导航到目标页面 remDr$navigate("https://www.spotrac.com/mlb/rankings/salary/pitching/")
3. 模拟滚动加载全部数据
循环滚动页面到底部,直到页面高度不再变化(表示所有数据加载完成):
# 记录初始页面高度 last_height <- remDr$executeScript("return document.body.scrollHeight")[[1]] while(TRUE) { # 滚动至页面底部 remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);") # 等待数据加载(网络慢可延长至5-10秒) Sys.sleep(3) # 获取新的页面高度 new_height <- remDr$executeScript("return document.body.scrollHeight")[[1]] # 高度不变则终止循环 if(new_height == last_height) break last_height <- new_height }
4. 解析并提取完整数据
加载完成后,获取页面源码并用rvest解析(注意选择器需匹配当前页面结构,若网站更新需调整):
# 获取完整页面HTML page_source <- remDr$getPageSource()[[1]] salary_page <- read_html(page_source) # 提取每一行的球员信息 player_salaries <- salary_page %>% html_elements(".rank-row") %>% map_df(function(row) { tibble( rank = row %>% html_element(".rank") %>% html_text(trim = TRUE), player = row %>% html_element(".player-name a") %>% html_text(trim = TRUE), team = row %>% html_element(".team-name a") %>% html_text(trim = TRUE), salary = row %>% html_element(".info") %>% html_text(trim = TRUE) ) }) # 验证数据量(应返回308) nrow(player_salaries)
5. 清理资源
抓取完成后关闭浏览器和驱动:
# 关闭浏览器 remDr$close() # 停止Selenium服务器 driver$server$stop()
注意事项
- 版本匹配:ChromeDriver版本必须与本地Chrome浏览器版本一致,否则会启动失败
- 等待时间:根据网络状况调整
Sys.sleep()的时长,避免因加载不充分导致数据缺失 - 选择器更新:若网站HTML结构变更,需重新检查元素class或XPath,调整抓取逻辑
内容的提问来源于stack exchange,提问作者Chris Franco
相关产品推荐
相关产品推荐

